最初の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}

おすすめ記事