同时计算图案和匹配线

同时计算图案和匹配线

我想计算每行模式的出现次数并获取最后一个匹配的行号

所以为了计算模式我会使用

grep -c pattern file

以及最后匹配的行号

grep -n pattern file | cut -d : -f 1 | tail -1

有什么方法可以让我只通过 grep 一次就得到两个结果吗?我正在使用的文件很大,我需要针对多种模式迭代此文件,因此我想避免 grep 两次。

答案1

您可以使用awk而不是grep

awk '/pattern/ {last = NR; count++}
     END {printf "Last: %s\nCount: %d\n", last, count}' < file

请注意,awk模式是扩展正则表达式(与grep -E反斜杠略有不同)。

您还可以awk对所有模式仅使用一次调用:

awk '!patterns_finished{patterns[$0]; next}
     {
       for (p in patterns) if ($0 ~ p) {
         last[p] = NR
         count[p]++
       }
     }
     END {
       for (p in patterns)
         printf "%s: count=%d last=%s\n", count[p], last[p]
     }' patterns.txt patterns_finished=1 file

(假设patterns.txt包含模式列表,每行一个)。

相关内容