Shell

匹配模式兩次的 Grep 行

  • July 6, 2020

通常grep輸出與模式匹配的任何行。我希望能夠多次找到與模式匹配的行。例如,如果我的搜尋模式是“foo”,那麼:

foo bar      # Would not be matched
foo foo bar  # Would be matched
bar foofoo   # Would be matched
foobarfoo    # Would be matched

有沒有辦法告訴我grep只找到包含我的搜尋模式的多個匹配項的行?

grep -E "(foo.*){2}" file

這在文件或輸出的每一行上至少匹配 2 次,您可以給出最小匹配數。

如果要匹配匹配任何字元串兩次的所有行:

grep '\(.\{1,\}\).*\1'

您可以通過更改來更改要匹配的長度1,

seq 10000 | grep '\(.\{2,\}\).*\1'

這使用基本正則表達式 ( BRE ),因此應該適用於任何 POSIX 兼容grep

如果您將正則表達式轉換為使用非貪婪正則表達式(並非所有地方都支持),它似乎不會加快匹配速度:

grep -E '(..*?).*?\1'

該圖顯示了執行時間(以秒為單位),在每 n 個數字的 100 行(〜行長)上執行和不執行非貪婪。

greedy() {
 a=`seq $1`;
 yes $a | head -n 100 | grep '\(.\{1,\}\).*\1' | LC_ALL=C wc;
}
nongreedy() {
 a=`seq $1`;
 yes $a | head -n 100 | grep -E '(..*?).*?\1' | LC_ALL=C wc;
}
export -f greedy
export -f nongreedy
parallel --jl my.log {2} {1}000 {2} ::: {1..100} ::: greedy nongreedy

在此處輸入圖像描述

引用自:https://unix.stackexchange.com/questions/596110