grepから返される結果の数を制限するにはどうすればよいですか?


180

私はgrepから最大10行を言いたいと思います。

コンピュータが一生懸命働かないようにしたい。grepで10個の結果が見つかったら停止します。出来ますか?


あなたの場合、コンピュータが一生懸命働かないようにしたいのですが、それが単なる人間の可読性の問題であればless、パイプ経由で使用できます。これは、画面いっぱいになると、あなたはより多くの行を見てEnterキーを押すことができ、q終了する:grep "SomeText" somefile.csv | less
SilentSteel

回答:


240

-mオプションでは、あなたが探しているものはおそらく次のとおりです。

grep -m 10 PATTERN [FILE]

からman grep

-m NUM, --max-count=NUM
        Stop reading a file after NUM matching lines.  If the  input  is
        standard  input  from a regular file, and NUM matching lines are
        output, grep ensures that the standard input  is  positioned  to
        just  after the last matching line before exiting, regardless of
        the presence of trailing context lines.  This enables a  calling
        process  to resume a search.

注:指定した数の一致が見つかると、grepはファイルの読み取りを停止します。


3
こんにちは試してみましたが、基本的には動作しますが、最初の10行を見つけた後、grepが「停止」しているようには見えません。ありがとう
Jas

6
@ジェイソン:これはそうではないようです:grepは-m 1、私のラップトップで1000万行のファイルがある場合、0.005 秒あり、1.579秒なしです。
グレゴワール2013

3
tail通常、パイピングは機能しますが、結果の数ではなく、コンテキストgrep -A10 PATTERNtail切り捨てるなど、コンテキストを使ってgrepを実行している場合は特に問題があります。この答えは私が探していたものでした。
dimo414 2013年

1
-m 10複数のファイルをgrepするときに違いを生むオプションです!最初のファイルで一致が多すぎる場合、先頭へのパイピングは後続のファイルで一致を表示しません。よろしくお願いします!
ジュリアン

1
私見これは別のツールを必要としないので、受け入れられた回答としてマークする必要があります。ところで、このオプションが--max-countのショートカットであることを知っていると、このオプションを覚えやすくなります
ishahak

68

別のオプションは単にheadを使用することです:

grep ...parameters... yourfile | head

ファイル全体を検索する必要はありません。一致する最初の10行が見つかると停止します。このアプローチのもう1つの利点は、-oオプションを指定してgrepを使用している場合でも、返される行が10行以下であることです。

たとえば、ファイルに次の行が含まれているとします。

112233
223344
123123

次に、これは出力の違いです:

$ grep -o '1.' yourfile | 頭-n2
11
12

$ grep -m2 -o '1.'
11
12
12

使用headすると、必要に応じて2つの結果のみが返されますが、-m2は3を返します。


3
あなたが使用することはできません| head使用している場合、パイプをgrep-Aたり-B(したがって、だけではなく、結果を検索(-o)が、コンテキスト用としても)。その場合-m、grepに返される結果の行数を指示する必要があります。
Attila O.

17
headを使用しても、grepがファイル全体を実行するのを実際に停止することはありません。grepで-mオプションを使用すると、そうなります。
LopSae

7

awkアプローチ:

awk '/pattern/{print; count++; if (count==10) exit}' file

0

尾を使う:

#dmesg 
...
...
...
[132059.017752] cfg80211:   (57240000 KHz - 65880000 KHz @ 2160000 KHz), (N/A, 4000 mBm)
[132116.566238] cfg80211: Calling CRDA to update world regulatory domain
[132116.568939] cfg80211: World regulatory domain updated:
[132116.568942] cfg80211:   (start_freq - end_freq @ bandwidth), (max_antenna_gain, max_eirp)
[132116.568944] cfg80211:   (2402000 KHz - 2472000 KHz @ 40000 KHz), (300 mBi, 2000 mBm)
[132116.568945] cfg80211:   (2457000 KHz - 2482000 KHz @ 40000 KHz), (300 mBi, 2000 mBm)
[132116.568947] cfg80211:   (2474000 KHz - 2494000 KHz @ 20000 KHz), (300 mBi, 2000 mBm)
[132116.568948] cfg80211:   (5170000 KHz - 5250000 KHz @ 40000 KHz), (300 mBi, 2000 mBm)
[132116.568949] cfg80211:   (5735000 KHz - 5835000 KHz @ 40000 KHz), (300 mBi, 2000 mBm)
[132120.288218] cfg80211: Calling CRDA for country: GB
[132120.291143] cfg80211: Regulatory domain changed to country: GB
[132120.291146] cfg80211:   (start_freq - end_freq @ bandwidth), (max_antenna_gain, max_eirp)
[132120.291148] cfg80211:   (2402000 KHz - 2482000 KHz @ 40000 KHz), (N/A, 2000 mBm)
[132120.291150] cfg80211:   (5170000 KHz - 5250000 KHz @ 40000 KHz), (N/A, 2000 mBm)
[132120.291152] cfg80211:   (5250000 KHz - 5330000 KHz @ 40000 KHz), (N/A, 2000 mBm)
[132120.291153] cfg80211:   (5490000 KHz - 5710000 KHz @ 40000 KHz), (N/A, 2700 mBm)
[132120.291155] cfg80211:   (57240000 KHz - 65880000 KHz @ 2160000 KHz), (N/A, 4000 mBm)
alex@ubuntu:~/bugs/navencrypt/dev-tools$ dmesg | grep cfg8021 | head 2
head: cannot open 2 for reading: No such file or directory
alex@ubuntu:~/bugs/navencrypt/dev-tools$ dmesg | grep cfg8021 | tail -2
[132120.291153] cfg80211:   (5490000 KHz - 5710000 KHz @ 40000 KHz), (N/A, 2700 mBm)
[132120.291155] cfg80211:   (57240000 KHz - 65880000 KHz @ 2160000 KHz), (N/A, 4000 mBm)
alex@ubuntu:~/bugs/navencrypt/dev-tools$ dmesg | grep cfg8021 | tail -5
[132120.291148] cfg80211:   (2402000 KHz - 2482000 KHz @ 40000 KHz), (N/A, 2000 mBm)
[132120.291150] cfg80211:   (5170000 KHz - 5250000 KHz @ 40000 KHz), (N/A, 2000 mBm)
[132120.291152] cfg80211:   (5250000 KHz - 5330000 KHz @ 40000 KHz), (N/A, 2000 mBm)
[132120.291153] cfg80211:   (5490000 KHz - 5710000 KHz @ 40000 KHz), (N/A, 2700 mBm)
[132120.291155] cfg80211:   (57240000 KHz - 65880000 KHz @ 2160000 KHz), (N/A, 4000 mBm)
alex@ubuntu:~/bugs/navencrypt/dev-tools$ dmesg | grep cfg8021 | tail -6
[132120.291146] cfg80211:   (start_freq - end_freq @ bandwidth), (max_antenna_gain, max_eirp)
[132120.291148] cfg80211:   (2402000 KHz - 2482000 KHz @ 40000 KHz), (N/A, 2000 mBm)
[132120.291150] cfg80211:   (5170000 KHz - 5250000 KHz @ 40000 KHz), (N/A, 2000 mBm)
[132120.291152] cfg80211:   (5250000 KHz - 5330000 KHz @ 40000 KHz), (N/A, 2000 mBm)
[132120.291153] cfg80211:   (5490000 KHz - 5710000 KHz @ 40000 KHz), (N/A, 2700 mBm)
[132120.291155] cfg80211:   (57240000 KHz - 65880000 KHz @ 2160000 KHz), (N/A, 4000 mBm)
alex@ubuntu:~/bugs/navencrypt/dev-tools$ 

エディタで「{}」のようなアイコンをクリックして、「コードのフォーマット」を設定できます。
peterh-モニカを2015年

loooonl loooog liiinesよりも読みやすい例を提供すると便利です
Putnik

0

2つの使用例:

  1. ファイルごとのn個の結果ではなく、全体のn個の結果のみが必要ですgrep -m 2。ファイルごとの最大出現数です。
  2. git grepとらないものをよく使う-m

これらのシナリオでの良い代替案は、grep | sed 2qすべてのファイルで最初の2つのオカレンスをgrepすることです。sedのドキュメント:https : //www.gnu.org/software/sed/manual/sed.html

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