您如何計算目前目錄中所有文件中某個術語的每次出現?

您如何計算目前目錄中所有文件中某個術語的每次出現?

您如何計算目前目錄中所有文件中某個術語的每次出現? - 和子目錄(?)

我讀過要這樣做,你會使用grep;確切的命令是什麼?

另外,是否可以使用其他指令來執行上述操作?

答案1

使用grep+ wc(這將滿足該術語在同一行中多次出現的情況):

grep -rFo foo | wc -l
  • -rin grep:在目前目錄層次結構中遞歸搜尋;
  • -Fgrep:匹配固定字串而不是模式;
  • -oin grep:僅列印匹配項;
  • -lin wc:列印行數;
% 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

答案2

grep -Rc [term] *會那麼做。此-R標誌表示您要遞歸搜尋目前目錄及其所有子目錄。這*是一個文件選擇器,含義:所有文件。此-c標誌使grep輸出僅出現的次數。但是,如果該單字在一行上出現多次,則僅計算一次。

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.

如果目錄中沒有符號鏈接,則沒有區別。

答案3

在一個小的 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>
    

筆記

  • 如果術語包含空格,請使用引號。
  • 它遞歸地計算該術語的每次出現,即使在一行中多次出現。

解釋:

# 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)

答案4

作為 @kos 的好答案的變體,如果您有興趣逐項列出計數,您可以使用 grep 的-cswitch 來計算出現次數:

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

相關內容