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"
。
利点は、フィールドを微調整してパターン(たとえば、$2
2番目のフィールドでのみ検索)と出力(3番目のフィールドを印刷$3
またはFILENAME
混合印刷など)を検索できることです。
(「現在の入力レコード番号」、つまり行番号)バージョンを使用すると、FNR
grepする行をより細かく調整できます。FNR==3
3行目は10、1行目FNR<10
は10などです。 (この場合は非常に大きなファイルを扱っていて、バージョンでそれをサポートしている場合は、パフォーマンスを向上させるためにawk
混在させることをお勧めします。)FNR
nextfile
使用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'