我想计算每行模式的出现次数并获取最后一个匹配的行号
所以为了计算模式我会使用
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
包含模式列表,每行一个)。