Bash

如何 grep 目錄中的每個文件以獲取關鍵字並輸出關鍵字和找到它的文件名?

  • April 16, 2019

我有一個包含 2000 多個文本文件的目錄。我正在嘗試製作一個腳本:

  1. 從以下位置讀取 IP 地址列表ip.txt
  2. Cats目錄中的每個文件
  3. 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- greppipeline 是為了防止將輸入和輸出文件中的條目添加到輸出文件中。

如果你有無數的文件要檢查並且你得到了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,因此我們不再需要grepinto grep

引用自:https://unix.stackexchange.com/questions/512611