Grep
關於 find 和 grep 的問題
我正在做一個小腳本來查找和計算眾多文件和子目錄中的所有“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
在每一行,在不同的行上返回每個匹配項(每個輸出行返回一個匹配項)。您可能還想使用
-wi
withgrep
來包含The
(不區分大小寫)和排除匹配項,例如the
(theory
全字匹配)。
由於您已經在使用 GNU 擴展 (
-printf
),使用 GNUawk
,您可以這樣做:find . -name '*.txt' -size +2c -readable -type f -exec gawk -v RS=the ' ENDFILE {print FILENAME "\t" (FNR - ($0 != ""))}' {} +
即
txt
用作記錄分隔符,並在處理每個文件後報告記錄數。但是不要計算在最後一次出現之後可能(並且通常會)出現的額外記錄txt
。