web-dev-qa-db-ja.com

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

ログファイルが非常に長いのですが、grepに最初の10行のみを検索するように依頼することはできますか?

104
David LeBauer

パイプの魔法。

head -10 log.txt | grep <whatever>
146

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

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

FNR..nextfileは、10行が表示されるとファイルの処理を停止します。 //..{}はファイル名を出力し、指定されたファイルの最初の一致が表示されるたびに移動します。他のプログラムのためにファイル名を引用するには、次を使用します

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

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

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

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

または、sedを使用します。

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

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

23
Zsolt Botykai

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

head -n10 filename | grep ...

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

8
Dan Fego
grep "pattern" <(head -n 10 filename)
4
jaypal singh

次の行を使用できます。

head -n 10 /path/to/file | grep [...]
2
Gustavo Straube
grep -m6 "string" cov.txt

これは、stringの最初の6行のみを検索します

2
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.
2
vins

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

head -10 file | grep …

Perlの使用:

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

Joachim Isakssonの答えの拡張:かなり頻繁に、長いファイルの途中から何かが必要です。行5001〜5020。この場合、headtailを組み合わせることができます。

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

これにより、最初の5020行が取得され、最後の20行のみが表示され、すべてがgrepにパイプされます。

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

1
RoG

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

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

N.B:私の場合、パターンは常に最初の行に一致します。

0
Shokrof

grep -A 10 <パターン>

これは、パターンとパターンの後の次の10行を取得するためです。これは、既知のパターンがない場合にのみ有効です。既知のパターンがない場合は、「head」の提案を使用してください。

0
snowtop