bashシェルループのgrepコマンド

bashシェルループの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のサイズは0で、内容はありません。

答え1

  1. ファイルから行を読まないでくださいfor

  2. grepの-fオプションを使用して提供パターンを含むファイルしたがって、まったく繰り返す必要はありません。

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

    これで、1行に1回ではなくgrepを1回だけ呼び出すことができます。 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

関連情報