我正在尝试编写一个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个)。
答案 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