Grep
使用 grep 計算出現的總次數
grep -c
對於查找字元串在文件中出現的次數很有用,但它只計算每行出現的次數。如何計算每行出現多次?我正在尋找比以下更優雅的東西:
perl -e '$_ = <>; print scalar ( () = m/needle/g ), "\n"'
grep
-o
將只輸出匹配項,忽略行;wc
可以數一數:grep -o 'needle' file | wc -l
這也將匹配“針”或“多針”。
要僅匹配單個單詞,請使用以下命令之一:
grep -ow 'needle' file | wc -l grep -o '\bneedle\b' file | wc -l grep -o '\<needle\>' file | wc -l
如果你有 GNU grep(總是在 Linux 和 Cygwin 上,偶爾在其他地方),你可以從:計算輸出行數
grep -o
grep -o needle | wc -l
。使用 Perl,這裡有一些我覺得比你的更優雅的方法(即使在它被修復之後)。
perl -lne 'END {print $c} map ++$c, /needle/g' perl -lne 'END {print $c} $c += s/needle//g' perl -lne 'END {print $c} ++$c while /needle/g'
僅使用 POSIX 工具,如果可能的話,一種方法是將輸入拆分為具有單個匹配項的行,然後再將其傳遞給 grep。例如,如果您要查找整個單詞,則首先將每個非單詞字元轉換為換行符。
# equivalent to grep -ow 'needle' | wc -l tr -c '[:alnum:]' '[\n*]' | grep -c '^needle$'
否則,沒有標準的命令來進行這種特殊的文本處理,因此您需要使用 sed(如果您是受虐狂)或 awk。
awk '{while (match($0, /set/)) {++c; $0=substr($0, RSTART+RLENGTH)}} END {print c}' sed -n -e 's/set/\n&\n/g' -e 's/^/\n/' -e 's/$/\n/' \ -e 's/\n[^\n]*\n/\n/g' -e 's/^\n//' -e 's/\n$//' \ -e '/./p' | wc -l
這是一個使用
sed
and的更簡單的解決方案grep
,它適用於字元串或什至按書本上的正則表達式,但在一些帶有錨定模式的極端情況下失敗(例如,它發現^needle
or\bneedle
in的兩次出現needleneedle
)。sed 's/needle/\n&\n/g' | grep -cx 'needle'
請注意,在上面的 sed 替換中,我曾經
\n
指的是換行符。這在模式部分是標準的,但在替換文本中,為了可移植性,用反斜杠換行替換\n
.