如何计算某个术语在当前目录中所有文件中出现的次数?

如何计算某个术语在当前目录中所有文件中出现的次数?

如何计算当前目录中所有文件中某个术语的每次出现次数? - 以及子目录(?)

我读到过,要做到这一点你需要使用grep;具体的命令是什么?

另外,是否可以使用其他命令来执行上述操作?

答案1

使用grep+ wc(这将满足同一行中多次出现该术语的情况):

grep -rFo foo | wc -l
  • -rin grep:在当前目录层次结构中递归搜索;
  • -Fin grep:与固定字符串匹配,而不是与模式匹配;
  • -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 的-c开关来计算出现次数:

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

相关内容