最初の10行だけをスキャンするようにgrepを制限する方法は?

最初の10行だけをスキャンするようにgrepを制限する方法は?

foo行で区切られたファイルのリストを出力するコマンドを受け取りました\n

次のコマンドを使用して、ファイルの正規表現の内容に基づいて結果をフィルタリングしました。

foo | xargs grep -l regex

問題は、いくつかのファイルが非常に大きく、私が探しているものが最初の10行にしか見つからないことです。実行速度を上げるためにgrepに最初の10行だけを処理するように指示するにはどうすればよいですか?

答え1

コメントによると、問題の半分が解決されました。

foo | xargs grep -m 1 regex

残りの問題を解決するには、より多くのスクリプトが必要です。

foo | xargs sh -c 'for file; do head "$file"; done | grep regex' sh

しかし、grepがストリームを読み込んでいるので、これはファイル名を提供しません。

GNU awkがある場合:

foo | xargs gawk -v pattern='regex' -v lines=10 -v OFS=':' '
  $0 ~ pattern {print FILENAME, FNR, $0}
  FNR == lines {nextfile}
'

ファイル名のみを取得する

  $0 ~ pattern {print FILENAME; nextfile}

答え2

for i in $(foo); do echo -e "$i \c"; head -n10 $i | grep -c regex; done

fooスクリプトでは、ファイル名と数字が順番に印刷されます。数値がゼロの場合、一致はなく、結果からregexこれらのゼロ項目は必要ない場合は簡単にフィルタリングできます。

答え3

修正バージョングレンジャックマンの答え出力ファイル名:

foo | xargs sh -c 'for file; do head "$file" | grep -l --label="$file" regex; done' sh

関連情報