2000以上のテキストファイルを含むディレクトリがあります。スクリプトを作成しようとしています。
- IPアドレス一覧を読む
ip.txt
- Catsディレクトリ内のすべてのファイル
- 各ファイルの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
不要です。grep
grep