grepを使用してファイルの最初の行から特定の文字列を取得する方法は?

grepを使用してファイルの最初の行から特定の文字列を取得する方法は?

grepを使用してファイル内の文字列を検索し、そのファイルの最初の行のみを検索するにはどうすればよいですか?

答え1

2つのオプションがあります。

そしてawk

awk '{if ($0~"pattern") print $0; nextfile;}' mydir/*

または、あなたのawkバージョンがそれをサポートしていない場合nextfile(提案してくれたStéphane Chazelasに感謝します):

awk 'FNR==1{if ($0~"pattern") print $0;}' mydir/*

次のファイルに切り替える前に、最初の行だけを読み、一致する場合にのみ印刷されます"pattern"

利点は、フィールドを微調整してパターン(たとえば、$22番目のフィールドでのみ検索)と出力(3番目のフィールドを印刷$3またはFILENAME混合印刷など)を検索できることです。

(「現在の入力レコード番号」、つまり行番号)バージョンを使用すると、FNRgrepする行をより細かく調整できます。FNR==33行目は10、1行目FNR<10は10などです。 (この場合は非常に大きなファイルを扱っていて、バージョンでそれをサポートしている場合は、パフォーマンスを向上させるためにawk混在させることをお勧めします。)FNRnextfile

使用head、ファイル名を保持

head -n1 -v mydir/files*|grep -B1 pattern

-vオプションはheadファイル名を印刷し、オプションは一致する行の前の行、つまりファイル名を印刷-B1します。grepファイル名のみが必要な場合は、次にさらにパイプすることができますgrep 。

head -n1 -v mydir/*|grep -B1 pattern|grep ==>

don_crisstiがコメントに気づいたように、パターン自体と一致するファイル名を記録してください。しかし...

答え2

GNUの使用grep:

grep -m1 ^ * |grep 'pattern'

再帰的に:

grep -rm1 ^ . |grep 'pattern'

答え3

@Robのコメントを実装し、期待した結果を正常に取得しました。

string文字列に置き換えてください。

grep -Rin "string" . | grep ":1:.*string" > result.txt

現在のディレクトリで大文字と小文字を区別しない再帰検索を実行し、行string番号を印刷します。次に、ファイルの1行目で一致するものを検索し、出力をresult.txt

答え4

sed コマンドを試すこともできます。

sed -n '1p' filename| sed -n '/pattern/p'

関連情報