将循环的 grep 命令重定向到单独的文件

将循环的 grep 命令重定向到单独的文件

我想使用 grep 使用文件中列出的模式递归搜索目录,然后将每个结果存储在自己的文件中以供稍后参考。

我尝试过(使用这个问题作为指导)并提出:

#!/bin/bash

mkdir -p grep_results   # For storing results

echo "Performing grep searches.."
while IFS='' read -r line || [[ -n "$line" ]]; do
    echo "Seaching for $line.."
    grep -r "$line" --exclude-dir=grep_results . > ./grep_results/"$line"_infile.txt
done

echo "Done."

但是,当我运行它时,控制台会挂起,直到我按下 CTRL-C:

$ bash grep_search.sh search_terms.txt
Performing grep searches..

这个脚本的问题出在哪里呢?或者我的做法是错误的?

答案1

这里有几个问题:

  1. 循环while不读取任何输入。正确的格式是

    while read line; do ... ; done < input file
    

    或者

    some other command | while read ...
    

    因此,您的循环挂起,等待输入。您可以通过运行脚本然后输入任何内容并按 Enter 键来测试这一点(在这里,我输入了foo):

    $ foo.sh 
    Performing grep searches..
    foo
    Searching for foo..
    

    您可以通过向您的 中添加提示来改进这一点read

    while IFS='' read -p "Enter a search pattern: " -r line ...
    

    不过,它仍然会运行,直到你用Ctrl+停止它C

  2. (这|| [[ -n "$line" ]]意味着“或者变量 $line 不为空”)永远不会被执行。由于read挂起,“OR”永远不会到达。无论如何,我不明白你想要它做什么。如果您想搜索$line是否$line已定义并使用read如果未定义,则需要类似以下内容:

    if [[ -n "$line" ]]; then
         grep -r "$line" --exclude-dir=grep_results > ./grep_results/"$line"_infile.txt
    else
        while IFS='' read -p "Enter a search pattern: " -r line || [[ -n "$line" ]]; do
          grep -r "$line" --exclude-dir=grep_results > ./grep_results/"$line"_infile.txt
        done
    fi
    

    这里,如果$line没有定义,仍然需要手动输入。更简洁的方法是将文件提供给循环while

    while IFS='' read -r line || [[ -n "$line" ]]; do
      grep -r "$line" --exclude-dir=grep_results > ./grep_results/"$line"_infile.txt
    done < list_of_patterns.txt
    

相关内容