bash shell 循环中的 grep 命令

bash shell 循环中的 grep 命令

我有一个日志文件,名称为out.log。我需要从此日志文件中搜索字符串列表(filelist.txt)。

对于 filelist.txt 中的每个文件,我需要“out.log”中的每个匹配行。它可以出现多次。

cat out.log | grep -i I466030.CXR910E >> search_result.txt

这有效,它将搜索 I466030.CXR910E 并输出到 search_result.txt

for i in `cat filelist.txt`; do  grep -i "$i" out.log >> result.txt; done


 for i in `cat filelist.txt`; 
   do  
     echo $i
     cat out.log | grep -i $i >> result2.txt
     grep $i out.log >> result3.txt 
  done 

上面的代码 echo 将输出搜索字符串,但 grep 不会将输出写入任何结果*.txt

我在这里缺少什么?谢谢你的建议。


回应评论:

xxxxxm@cxxxrtrls01[DEV][rerun] $ grep -i -f filelist.txt out.log > result.txt
xxxxxm@cxxxrtrls01[DEV][rerun] $ ll
total 564
-rw-r----- 1 cnrlsadm cnrlsadm   4600 Aug 19 09:36 filelist.txt
-rw-r----- 1 cnrlsadm cnrlsadm    216 Aug 19 10:14 file.sh
-rw-r--r-- 1 cnrlsadm cnrlsadm 557403 Aug 19 10:10 out.log
-rw-r--r-- 1 cnrlsadm cnrlsadm      0 Aug 19 12:14 result.txt
-rw-r----- 1 cnrlsadm cnrlsadm    213 Aug 19 12:10 srch.sh
xxxxxm@cxxxrtrls01[DEV][rerun] $

result.txt 的大小为零,其中没有任何内容。

答案1

  1. 不要读取文件的行for

  2. 使用 grep 的-f选项来提供包含模式的文件所以你根本不需要循环:

    grep -i -f filelist.txt out.log > result.txt
    

    现在,您只需调用一次 grep,而不是每行调用一次。如果 out.log 很大,你的 CPU 会感谢你的。

答案2

好吧..这里的大部分回复都是正确的,我的错是“filelist.txt”是从 Excel 和 Windows 中生成的。一旦我将文件转换为unix格式。一切顺利。

我学到了一个非常耗时的教训。感谢每一位回答问题的人:)

祝你有美好的一天!

答案3

尝试使用下面的脚本,效果很好

for i in `cat filelist.txt`
do
for j in `cat out.log`
do
grep -i "$j" $i
done
done

filelist.txt.====> Consists of filenames

相关内容