Shell
匹配模式兩次的 Grep 行
通常
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