我想使用 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
这里有几个问题:
循环
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。
(这
|| [[ -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