web-dev-qa-db-ja.com

現在のディレクトリ内のすべてのファイル内の用語の出現をどのようにカウントしますか?

現在のディレクトリ内のすべてのファイル内の用語の出現をどのようにカウントしますか? -およびサブディレクトリ(?)

これを行うには、grepを使用します。正確なコマンドは何ですか?

また、他のコマンドで上記のことは可能ですか?

10
TellMeWhy

grep + wcを使用します(これは、同じ行で用語が複数回出現する場合に対応します)。

grep -rFo foo | wc -l
  • -r in grep:現在のディレクトリ階層を再帰的に検索します。
  • grep-F:パターンではなく固定文字列と一致します。
  • grep-o:一致のみを出力します。
  • wc-l:行数を出力します。
% tree                 
.
├── dir
│   └── file2
└── file1

1 directory, 2 files
% cat file1 
line1 foo foo
line2 foo
line3 foo
% cat dir/file2 
line1 foo foo
line2 foo
line3 foo
% grep -rFo foo | wc -l
8
12
kos

grep -Rc [term] *がそれを行います。 -Rフラグは、現在のディレクトリとそのすべてのサブディレクトリを再帰的に検索することを意味します。 *は、すべてのファイルを意味するファイルセレクタです。 -cフラグは、grepをオカレンス数のみ出力します。ただし、Wordが1行に複数回出現する場合、一度だけカウントされます。

man grepから:

  -r, --recursive
          Read all files under each directory, recursively, following symbolic links only if they are on the command line.
          This is equivalent to the -d recurse option.

   -R, --dereference-recursive
          Read all files under each directory, recursively.  Follow all symbolic links, unlike -r.

ディレクトリにシンボリックリンクがない場合、違いはありません。

8
Jos

@kosの素敵な答えの変形として、カウントの項目化に興味がある場合、grepの-cスイッチを使用してオカレンスをカウントできます。

$ grep -rFoc foo
file1:3
dir/file2:3
2
emacs_ftw

小さなpythonスクリプト内:

#!/usr/bin/env python3
import os
import sys

s = sys.argv[1]
n = 0
for root, dirs, files in os.walk(os.getcwd()):
    for f in files:
        f = root+"/"+f      
        try:
            n = n + open(f).read().count(s)
        except:
            pass
print(n)
  • count_string.pyとして保存します。
  • コマンドでディレクトリからを実行します:

    python3 /path/to/count_string.py <term>
    

ノート

  • 用語にスペースが含まれる場合は、引用符を使用します。
  • 1行に複数の出現がある場合も、用語のすべての出現を再帰的にカウントします。

説明:

# get the current working directory
currdir = os.getcwd()
# get the term as argument
s = sys.argv[1]
# count occurrences, set start to 0 
n = 0
# use os.walk() to read recursively
for root, dirs, files in os.walk(currdir):
    for f in files:
        # join the path(s) above the file and the file itself
        f = root+"/"+f
        # try to read the file (will fail if the file is unreadable for some reason)
        try:
            # add the number of found occurrences of <term> in the file
            n = n + open(f).read().count(s)
        except:
            pass
print(n)
2
Jacob Vlijm