Grepは、「X」一致よりも多くの数を計算します。

Grepは、「X」一致よりも多くの数を計算します。

特定の数以上のすべての数に一致するコマンドを見つけようとします。使っています

grep -src 'Bicycle' /cygdrive/c/Documents/* |grep -v ':0$'

出力は次のとおりです

/cygdrive/c/Documents/blahhh.txt:1
/cygdrive/c/Documents/blahhh.txt:3
/cygdrive/c/Documents/bla0.txt:5
/cygdrive/c/Documents/blahg.txt:23

しかし、私はそれを出力したいです:

/cygdrive/c/Documents/blahg.txt:23

私はこれをたくさん検索しました。誰もが私を正しい方向に導くことができれば幸いです。

答え1

簡単な方法は、grep出力をパイプで連結awkし、区切り文字を次のように設定して解析し、最後のフィールド数が定義したいフィールド数:よりも大きいことを確認することです。X

grep -src 'Bicycle' /cygdrive/c/Documents/* | awk -F: '$NF+0 > 1'

上記の例では、より大きな項目を削除しました1。必要に応じて修正してください。

$NF+0 > 1justで終わる理由は$NF > 1純粋に数値評価をするためですが、空の文字列や数値文字列がある場合を考慮して0正しい数値に追加して比較し、そうでなければ比較の両方の型が正しくありません。

~からawk文字列と数字を変換する方法

何らかの理由で数字を文字列に強制変換する必要がある場合は、数字を空の文字列に関連付けます""。文字列を数値に変換するには、文字列にゼロを追加します。

答え2

GNUの使用awk:

awk -v min=10 '
  BEGINFILE{n=0}
  /Bicycle/ {n++}
  ENDFILE{if (n >= min) print FILENAME":"n}' /cygdrive/c/Documents/*

数量を計算することに注意してください。ワイヤー含むBicycle(発生回数ではない)Bicycle 言葉。これを行うには、次のものが必要です。

awk -v min=10 '
  BEGINFILE{n=0}
  {n += gsub(/Bicycle/, "&")}
  ENDFILE{if (n >= min) print FILENAME":"n}' /cygdrive/c/Documents/*

再帰検索の場合:

find /cygdrive/c/Documents -type f -exec awk -v min=10 '
  BEGINFILE{n=0}
  /Bicycle/ {n++}
  ENDFILE{if (n >= min) print FILENAME":"n}' {} +

答え3

方法1

 grep -c   "Bicycle" * |sed -r "s/\s+//g" | awk -F ":"  '{print $1,$2}' | sort -nr -k2| head -1

方法2

ここでは、数が3より大きいファイルを表示することを検討します。

grep -c   "Bicycle" * |sed -r "s/\s+//g" | awk -F ":"  '$2 > "3"{print $1,$2}'

関連情報