如何限制从grep返回的结果的数量?

我想说,从grep最多10行。

我不想让我的电脑超负荷工作。我希望它在grep发现10个结果后停止。这可能吗?

200805 次浏览

另一个选项是使用:

grep ...parameters... yourfile | head

这并不需要搜索整个文件——当找到前十个匹配行时,它就会停止。这种方法的另一个优点是,即使使用带-o选项的grep,返回的数据也不会超过10行。

例如,如果文件包含以下行:

112233
223344
123123

这是输出的差值:

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


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

使用head只返回2个结果,而-m2返回3个结果。

-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将停止读取文件!

Awk的方法:

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

使用尾:

#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$

对于2个用例:

  1. 我只想要n个总体结果,而不是每个文件n个结果,grep -m 2是每个文件最大出现次数。
  2. 我经常使用git grep,它不接受-m

在这些情况下,一个很好的替代方案是grep | sed 2q到grep在所有文件中出现的前2次。https://www.gnu.org/software/sed/manual/sed.html . sed文档

艾米丽回答(2020年年中)提到:

我经常使用git grep,它不接受-m

事实上,它确实(2022年年中):
在Git 2.38 (Q3 2022)中,&;__abc1 &;(man)是一种限制每个文件显示的点击量的方法

这意味着在Git存储库中,git grep -m可以作为grep的替代。

参见提交68437艾德 (22 Jun 2022) by Carlos López (00xc)
(由Junio C Hamano—gitster提交8 c4f65e中合并,13 Jul 2022)

grep:添加——max-count命令行选项

署名:Carlos López 00xc@protonmail.com

这个补丁增加了一个命令行选项,类似于GNU grep(1)的-m / --max-count,用户可能已经习惯了。

这使得限制输出中显示的匹配数量成为可能,同时保持其他选项的功能,如-C(显示代码上下文)或-p(显示包含函数),这在shell管道(例如head(1))中很难做到。

git grep现在在它的手册页中包含:

-m <num>

--max-count <num>

限制每个文件的匹配数量。

当使用-v--invert-match选项,则搜索在指定的

  • -1的值将返回无限 结果(默认值)。
  • 值0将立即退出