查找目录的所有文件中表达式的频率

时间:2012-08-03 07:41:46

标签: regex shell unix

我正在尝试编写一个shell脚本,它将在当前目录的每个文件中搜索正则表达式,而不使用临时文件。

最初,我使用临时文件来存储echo * | sed 's/ /\n/g'然后循环遍历此文件的每一行,在每个文件上使用cat,然后重写我的表达式并计算输出行。我在查找临时文件时遇到了一些麻烦,并且想知道我是否可以使用变量或一些非临时文件方法做任何事情(我真的不想为临时文件创建单独的目录)。

我对变量的问题是,在我将变量的值设置为echo * | sed 's/ /\n/g'的输出之后,我不知道如何遍历每一行,所以我可以从中获取表达式数文件。

我只想让以下内容工作(我对表达式进行硬编码):

% ls
% file1 file2 file3
% ./countMost.sh
% file2(28)
% ls
% file1 file2 file3

表示file2具有表达式的大多数实例(其中28个)。

3 个答案:

答案 0 :(得分:2)

您可以尝试这样的事情:

grep -c regex files | sed -e 's/^\(.*\):\(.*\)$/\2 \1/' | sort -r -n | head -n 1

regex是您的正则表达式(也可以使用egrep),files是您的文件列表。

给出3个文件:

file1:
qwe
qwe
qwe
asd
zxc

file2:
qwe
asd
zxc

file3:
asd
qwe
qwe
qwe
qwe

我跑:

grep -c 'qwe' file[1-3] | sed -e 's/^\(.*\):\(.*\)$/\2 \1/' | sort -r -n

我得到了输出:

4 file3
3 file1
1 file2

此外,在最后添加| head -n 1只会让我:

4 file3

答案 1 :(得分:1)

类似版本的Job Lin解决方案使用sort args而不是sed:

grep -c -e "^d" file* | sort -n -k2 -t: -r |head -1

(我在这里寻找以'd'开头的行)

答案 2 :(得分:0)

对于一个名为test with count的目录中的一堆文件,这应该会给你十大最常见的小写单词(你改变正则表达式改为其他)。

grep -rhoE "[a-z]+" test | sort | uniq -c | sort -r | head
      3 test
      2 wow
      2 what
      2 oh
      2 foo
      2 bar
      1 ham

如果你想按文件名计算,那么删除grep上的h标志

  grep -roE "[a-z]+" test | sort | uniq -c | sort -r | head
      3 test/2:test
      1 test/2:wow
      1 test/2:what
      1 test/2:oh
      1 test/2:foo
      1 test/2:bar
      1 test/1:wow
      1 test/1:what
      1 test/1:oh
      1 test/1:ham