Grep

關於 find 和 grep 的問題

  • November 21, 2018

我正在做一個小腳本來查找和計算眾多文件和子目錄中的所有“the”出現,然後我需要列印文件地址和“the”出現的數量。但我不知道如何完成它。

   find . -name "*.txt" -type f -printf "%p\t" -exec grep -c "the" {}\; 

ex.sh 程序的名稱

txt 文件副檔名

找表象的詞

  • 正確的輸出應該是:
./ex.sh txt the

./etext00/00ws110.txt 42764
./etext00/1cahe10.txt 26692
./etext00/1vkip11.txt 21895
./etext00/2cahe10.txt 24604
./etext00/2yb4m10.txt 15476
./etext00/8rbaa10.txt 3131
  • 我得到什麼:
./etext00/00ws110.txt   35388
./etext00/1cahe10.txt   17905
./etext00/1vkip11.txt   14617
./etext00/2cahe10.txt   16971
./etext00/2yb4m10.txt   9938
./etext00/8rbaa10.txt   1839

我認為這是包含“the”外觀的行數,但在某些行中可能有超過 1 個“the”。

使用grep -o the併計算生成的行數:

find . -name "*.txt" -type f -printf "%p\t" \
   -exec sh -c 'grep -o "the" "$0" | wc -l' {} \; 

grep -o在每一行,在不同的行上返回每個匹配項(每個輸出行返回一個匹配項)。

您可能還想使用-wiwithgrep來包含The(不區分大小寫)和排除匹配項,例如thetheory全字匹配)。

由於您已經在使用 GNU 擴展 ( -printf),使用 GNU awk,您可以這樣做:

find . -name '*.txt' -size +2c -readable -type f -exec gawk -v RS=the '
  ENDFILE {print FILENAME "\t" (FNR - ($0 != ""))}' {} +

txt用作記錄分隔符,並在處理每個文件後報告記錄數。但是不要計算在最後一次出現之後可能(並且通常會)出現的額外記錄txt

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