ファイルの最初のn行だけをgrepできますか?


回答:


175

パイプの魔法。

head -10 log.txt | grep <whatever>

13
することもできますパイプに任意のストリームheadsomeCmd | head -10
スチュアート・ネルソン

1
ヘッドはデフォルトで最初の10行を標準出力に印刷するため、これは10行に対して有効ですhead log.txt | grep <whatever>
Zlemini

5
grepの-lオプションを使用するときにこれを行う方法はありますか?最初の5文字がであるすべてのファイルをリストしますRIFFD
James M. Lay

49

Googleでこれを見つけた人のためにn、複数のファイルの最初の行を検索する必要がありましたが、一致するファイル名のみを印刷しました。使った

 gawk 'FNR>10 {nextfile} /pattern/ { print FILENAME ; nextfile }' filenames

FNR..nextfile、10行が見つかるとファイルの処理を停止します。//..{}上の印刷ファイル名と移動するたびに指定されたファイルを示し、最大で最初のマッチ。他のプログラムのためにファイル名を引用するには、

 gawk 'FNR>10 {nextfile} /pattern/ { print "\"" FILENAME "\"" ; nextfile }' filenames

9
私はこれをグーグルで見つけた人々の一人でした。ありがとう!
Floris

私にとって、このコードはファイルの完全なパスを出力しました。これがまさに私が必要としていたことです。また、FNR=1最初の行だけを検索します。ありがとう!
ブライアンW

2
これをディレクトリで再帰的に行うには:find ./path -type -f -exec awk 'FNR>10 {nextfile} /pattern/ { print FILENAME ; nextfile }' '{}' +
OrangeDog

1
@OrangeDogに感謝します。1 -type f
David Siegal

26

またはawk、なしで単一のプロセスに使用します|

awk '/your_regexp/ && NR < 11' INPUTFILE

各行で、your_regexp一致し、レコード(行)の数が11未満の場合、デフォルトのアクション(入力行を出力する)を実行します。

または使用sed

sed -n '/your_regexp/p;10q' INPUTFILE 

正規表現をチェックして行を出力し(-n入力を出力しないことを意味します。それ以外の場合はデフォルトです)、10行目の直後に終了します。


1
10日にやめませんか?(sedソリューションを参照)
2012年

awk '{ if ( NR <= 10 ) { if(index($0,"ab") > 0) { print $0; } } else { exit; } }' textfile - もっと早く。

1
@potong正解です。@srikanthradixの方が速くなる可能性がありますが、解決策は正規表現を検索するのではなく、固定文字列のみを検索することです。awk '{ if ( NR <= 10 ) { if( $0 ~ "YOUR_REGEXP") { print } } else { exit; } }' textfileします。
Zsolt Botykai 2012年

4
加えて、スタイルはそうではありませんawkish2xifsそして1xelse、アクションステートメントを必要としないコマンドでは、アホになります。weinbergerとkernighan cry ...
jaypal sing

1
複数のファイルでawkを使用する場合、FNRはファイルごとに0から始まるため、NRではなくFNRを使用する方がよいと思います。
Vladyslav Savchenko

9

とともにプログラムを使用するいくつかのオプションがありますgrep。私の意見では最も簡単なのは、使用することheadです:

head -n10 filename | grep ...

head-nオプションを使用して)最初の10行を出力し、その出力をにパイプできますgrep


6
私も知らなかった、ここで使用するすべてのソリューションは、デフォルトで10行しか表示されないことを認識せずに(私も含めて)head使用しました。:)-n 10 head
jaypal sing



3

これを達成するためにの出力をhead -10 fileパイプすることができますgrep

head -10 file | grep 

Perlの使用:

perl -ne 'last if $. > 10; print if /pattern/' file

3
head -10 log.txt | grep -A 2 -B 2 pattern_to_search

-A 2:パターンの前に2行を印刷します。

-B 2:パターンの後に2行印刷します。

head -10 log.txt # read the first 10 lines of the file.

1
私が思い出す-C 2と、同じことをします-A 2 -B 2
David LeBauer


2

ヨアヒムIsakssonの答えの拡張:かなり頻繁に私はあなたが結合することができ、その場合には5020に長いファイル、例えばライン5001の途中から何か、必要headとしますtail

head -5020 file.txt | tail -20 | grep x

これは最初の5020行を取得し、最後の20行のみを表示し、すべてをgrepにパイプします。

(編集:私の例の番号のfencepostエラー、grepにパイプを追加)


1

grep -A 10 <パターン>

これは、パターンとその次の10行を取得するためのものです。これは既知のパターンでのみ機能します。既知のパターンがない場合は、「ヘッド」の提案を使用してください。


1
それは正しいかもしれませんが。質問の説明を追加して、回答をより包括的にします。
Pramod S. Nikam 2014

3
これは完全に異なる質問に答えるものであり、このコンテキストでは役に立ちません。
101年

-1

私にも同様の問題があり、上記のすべての問題が完全に解決するわけではありません。一致する行を含むファイル名を取得することにも興味があります。私の解決策:

ls |parallel --gnu 'cat <(echo {}) <(head {})|grep -B1 -m1 -P "^>.*F3$"'

注意:私の場合のパターンは常に最初の行と一致します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.