Grep

使用 grep 計算出現的總次數

  • November 5, 2021

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 -ogrep -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

這是一個使用sedand的更簡單的解決方案grep,它適用於字元串或什至按書本上的正則表達式,但在一些帶有錨定模式的極端情況下失敗(例如,它發現^needleor \bneedlein的兩次出現needleneedle)。

sed 's/needle/\n&\n/g' | grep -cx 'needle'

請注意,在上面的 sed 替換中,我曾經\n指的是換行符。這在模式部分是標準的,但在替換文本中,為了可移植性,用反斜杠換行替換\n.

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