【问题标题】:bash execute multiple greps on each line in a filebash 在文件的每一行上执行多个 grep
【发布时间】:2014-09-19 19:58:27
【问题描述】:

我想在文件的每一行上依次运行 2 个不同的 grep,以便它按照输入文件中出现的顺序输出匹配项。我有一个名为 temp.txt 的简单文件,我将在此示例中使用它。该文件的内容是:

$ cat temp.txt
line1 a
line2 b
line3 c

我有以下代码,我通过使用 echo 而不是第一个 grep 进行了简化。

#! /bin/bash

cat temp.txt | while read line
do
  echo $line
  grep b $line
done

我以为输出会是:

line1 a
line2 b
line2 b
line2 c

但我得到以下输出:

$ ./debug.sh
line1 a
grep: line1: No such file or directory
grep: a: No such file or directory
line2 b
grep: line2: No such file or directory
grep: b: No such file or directory
line3 c
grep: line3: No such file or directory
grep: c: No such file or directory

【问题讨论】:

  • grep 假定参数是一个文件,使用 here 字符串将变量作为标准输入 grep b <<< "$line"
  • “我想在文件的每一行上依次运行 2 个不同的 grep,以便它按照输入文件中出现的顺序输出匹配项” 这样做,如果它与 both 模式匹配,您最终将编写 twice 行。这是故意的吗?
  • 在文件的每一行上调用grep 对于大量行来说会很慢。考虑改用 bash 的内置正则表达式匹配,或组合正则表达式,以便您可以使用对 grep 的单个调用来读取整个文件。

标签: bash file loops grep


【解决方案1】:

你必须这样做:

#! /bin/bash

while read line
do
  echo "$line" | grep "b"
done < temp.txt

或者你也可以使用 echo "$line" | grep "b" 代替:

grep "b" <<< "$line"

在你的情况下,

grep b $line

试图在名为$line 的文件上使用grep b,该文件显然不存在。

请注意,不需要cat 文件并通过管道传送到whilewhile read ... done &lt; file 就可以了。

【讨论】:

    【解决方案2】:

    也许你应该只运行一个grep,但同时给它两种模式来寻找:

    grep 'pattern1\|pattern2' file.txt
    

    【讨论】:

    • 这里的错字应该有引号而不是反引号,否则就是我想要的
    【解决方案3】:

    你的脚本应该是这样的

    #! /bin/bash
    
    cat temp.txt | while read line
    do
      echo $line
      grep b <<< "$line"
    done
    

    得到你想要的输出。 grep 期待来自文件或来自 stdin 的输入。您的语法使grep 认为它必须打开一个文件。此版本确保将$line 馈送到其stdin

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-13
      • 1970-01-01
      • 2017-11-02
      • 2019-07-31
      • 1970-01-01
      • 2014-04-25
      • 1970-01-01
      相关资源
      最近更新 更多