検索とgrepに関する質問

検索と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」の外観を含む行の数であると仮定していますが、一部の行には「the」が1つ以上ある場合があります。

答え1

grep -o the生成された行数を使用して計算します。

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

grep -o各行の各一致を別々の行に返します(出力行ごとに1つの一致)。

in(完全な単語の一致)など、一致を含める(大文字と小文字の区別)および除外するために-wiwithを使用することもできます。grepThethetheory

答え2

すでにGNU拡張()を使用しているので、-printfGNUの場合はawk次のことができます。

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

つまり、レコード区切り文字として使用され、txt各ファイルを処理した後にレコード数を報告します。ただし、最後の発生以降に表示される可能性がある(そして一般的に表示される)追加の履歴は計算しないでくださいtxt

関連情報