1

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

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

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

我只希望以下工作(我对表达式进行硬编码):

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

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

4

3 回答 3

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
于 2012-08-03T07:51:43.737 回答
1

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

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

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

于 2012-08-03T08:00:55.150 回答
0

这应该为您提供前十个最常见的小写单词(您将正则表达式更改为任何内容),用于一个名为 test with counts 的目录中的一堆文件。

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
于 2012-08-03T08:27:06.430 回答