キーワードのディレクトリ内の各ファイルをgrepし、キーワードとそのキーワードを含むファイル名を出力するにはどうすればよいですか?

キーワードのディレクトリ内の各ファイルをgrepし、キーワードとそのキーワードを含むファイル名を出力するにはどうすればよいですか?

2000以上のテキストファイルを含むディレクトリがあります。スクリプトを作成しようとしています。

  1. IPアドレス一覧を読むip.txt
  2. Catsディレクトリ内のすべてのファイル
  3. 各ファイルのIPアドレスを特定します。

キーワードが見つかると、キーワードとファイル名がファイルに反映されます。

出力は次のようになります。

$ cat
results.txt
192.168.2.3 was found in 23233.txt
192.168.4.0 was found in 2323.txt

現在私はこれを持っています:

while read p; do
for filename in *.txt; do
if cat $filename | grep "$p" 
then echo "$p" is  "$filename" | tee result.txt
fi
done
done<ips.txt

ただし、これによりすべてのファイル名も結果に反映されます。この問題をどのように解決できますか?

ベストアンサー1

まず、cat必要ないときは使用しないで保存しておいてください。代わりに:

cat haystack | grep needle

単に次のことができます。

grep needle haystack

あなたのスクリプトは次のとおりです。

> results.txt  # start with a fresh file for every run
while read ip; do
    grep "$ip" *  | grep -Ev 'results\.txt|ips\.txt' >> results.txt
done < ips.txt

grep-into-pipe は、grep入力ファイルと出力ファイルのエントリが出力ファイルに追加されるのを防ぐために使用されます。

確認する必要がある多数のファイルがあり、それを取得した場合は、コマンドをシェルが許可するのに十分な短いチャンクに分割するargument list too longなどのツールを使用できます。xargs

> results.txt  # start with a fresh file for every run
while read ip; do
    find . -type f -maxdepth 1 -not -name ips.txt -not -name results.txt -print0 | xargs -0 grep "$ip" >> results.txt
done < ips.txt

ここでは、入力ファイルと出力ファイルをフィルタリングして論理入力を使用するため、入力はfind不要です。grepgrep

おすすめ記事