Bash
如何 grep 目錄中的每個文件以獲取關鍵字並輸出關鍵字和找到它的文件名?
我有一個包含 2000 多個文本文件的目錄。我正在嘗試製作一個腳本:
- 從以下位置讀取 IP 地址列表
ip.txt
- Cats目錄中的每個文件
- greps 每個文件的 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
但是,這也會將所有文件名回顯到結果中。我怎樣才能解決這個問題?
首先,
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
-into
grep
-grep
pipeline 是為了防止將輸入和輸出文件中的條目添加到輸出文件中。如果你有無數的文件要檢查並且你得到了
argument list too long
,我們可以使用一個工具,比如xargs
將我們的命令分解成足夠短的塊,以便 shell 允許:> 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
在這裡,我們過濾掉帶有邏輯的輸入和輸出文件 into
find
,因此我們不再需要grep
intogrep
。