【问题标题】:for loop syntax with grep in bash在 bash 中使用 grep 的 for 循环语法
【发布时间】:2015-09-23 08:42:36
【问题描述】:

我想对 file.txt 中以 0 结尾的行进行文本处理,我写了一个简单的形式来清楚地提出我的问题。

$ cat file.txt
1 343 4352 0
324 4324 4324 324
432 432 2345 0

$ cat script.sh
for i in `grep " 0$" file.txt`
do
  echo $i; 
done

我希望输出是:

1 343 4352 0

432 432 2345 0

我希望 $i 变量为“1 343 4352 0”,然后为“432 432 2345 0” 但在此脚本中,$i 变量的值是 1,然后是 343

【问题讨论】:

  • 根据@AvinashRaj 的评论,这里不需要循环
  • 谢谢,但我的脚本不是这个。这很容易让我的问题变得清晰,我需要 i 变量作为 grep 的输出来处理它们。我还想学习如何使用 for。

标签: linux bash for-loop grep


【解决方案1】:

你可以这样做:

IFS=$'\n' arr=($(grep ' 0$' file.txt))
for  i in "${arr[@]}"
do
  echo "$i"
  #do other tasks here.
done

【讨论】:

  • 公平地说,我发布了一个替代方案,但需要注意的是,它也可能根本不是 OP 真正应该做的。
【解决方案2】:

使用 Bash 内置的“回复”

#!/bin/bash
while read -r ;do
    echo $REPLY ;done < file.txt

干杯卡里姆

【讨论】:

    【解决方案3】:

    这几乎肯定不是做任何你想做的事情的正确方法,而是回答你提出的具体问题:

    $ grep ' 0$' file |
    while IFS= read -r i
    do
        echo "$i"
    done
    1 343 4352 0
    432 432 2345 0
    

    如果您要进行文本处理,请在 awk 中进行,而不是在 shell 中进行,以简化、清晰、稳健、性能以及优秀软件的所有其他理想属性:

    $ awk '/ 0$/ {i=$0; print i}' file
    1 343 4352 0
    432 432 2345 0
    

    以上只是设置/使用一个变量来说明如何做到这一点。

    【讨论】:

      猜你喜欢
      • 2013-06-21
      • 2018-02-23
      • 2015-03-24
      • 1970-01-01
      • 1970-01-01
      • 2015-04-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多