Bash脚本 - 输出具有匹配模式和计数

时间:2015-08-24 05:00:39

标签: regex bash awk grep

我正在尝试查找文件中与某个模式匹配的行数,并找到匹配的行数。例如,如果我的文件是

  

test1 type1 random1

     

test2 type2 bird

     狗猫随机

我想找到具有“随机”和行数的行。理想情况下,输出类似于

  

test1 type1 random1

     狗猫随机

     

2

我知道如何使用grep单独执行这些任务中的任何一个,但如果我正在使用大文件,我宁愿不再读取该文件两次。我还想远离制作额外的临时文件来存储grep的结果。

我是否可以编写命令和/或简单函数来实现这些结果?

4 个答案:

答案 0 :(得分:2)

awk 'BEGIN{total=0} {if(/random/) {total+=1; print $0;}}END{print total}' input_file

答案 1 :(得分:2)

awk '/random/{count++;print}END{print count}' file

如果找到匹配项,请递增计数器并打印。 最后打印计数。

答案 2 :(得分:2)

不。

$ cat t.txt
foo: bar
foo: quux
bar: baz
$ awk -v regex='bar' '$0 ~ regex { count++; print } END {print count}' t.txt
foo: bar
bar: baz
2

答案 3 :(得分:1)

我喜欢这里的awk解决方案,但与往常一样,不仅有一种方法可以给猫皮肤涂抹。如果您使用nl对输出行进行编号,则很容易看到您有多少匹配。

grep stuff from files | nl

准确地获得您在问题中指定的输出是一个简单的后处理问题(虽然我不会打扰)。通过简单的sed脚本删除行号,然后在最后打印最新删除的号码。

grep stuff from files |
nl |
sed -n 'h                    # Keep a copy in hold space
     s/^ *[1-9][0-9]*\t//p   # Print without number
     $!b                     # Unless at last line, we're done
     x                       # Retrieve from hold space
     s/\t.*//p'              # Print only line number

(如果您的sed方言无法将\t识别为文字标签,或无法处理同一行中的评论,则您需要对此进行调整。在大多数贝壳中,您可以使用ctrl-V选项卡键入文字选项卡。)