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

Posted

技术标签:

【中文标题】如何限制从 grep 返回的结果数?【英文标题】:How do I limit the number of results returned from grep? 【发布时间】:2011-06-28 03:24:38 【问题描述】:

我想说 grep 最多 10 行。

我不想让我的电脑辛苦工作。我希望它在 grep 找到 10 个结果后停止。有可能吗?

【问题讨论】:

在您的情况下,您不希望计算机努力工作。但如果这只是人类可读性问题,您可以通过管道使用less。这将填满屏幕,您可以按 ENTER 键查看更多行,q 退出:grep "SomeText" somefile.csv | less 【参考方案1】:

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

【讨论】:

嗨,它试过了,它基本上可以工作,但在他找到前 10 行之后,似乎 grep 并没有“停止”思考,看起来他继续思考并“使用我的 cpu”而不是 printint这是正确的吗?谢谢 @Jason:情况似乎并非如此:grep 使用-m 1 需要 0.005 秒,而我的笔记本电脑上没有 1000 万行的文件需要 1.579 秒。 管道进入tail 通常会起作用,但如果您正在与上下文混淆,例如grep -A10 PATTERN,使用 tail 会截断上下文,而不是结果的数量。这个答案正是我想要的。 -m 10 是在 grepping 多个文件时产生差异的选项!如果第一个文件中有太多匹配项,则管道到头将不会在后续文件中显示匹配项。谢谢! -m 与旧版本 grep 中的 -A/-B/-C 选项冲突,例如可以在 Ubuntu 16.04 上找到的 2.25,仅输出 m 行而不是 -A/-B/-C 定义的行.较新的版本没有这个问题(在 Arch 上用 3.1 测试过)。【参考方案2】:

另一种选择是使用head:

grep ...parameters... yourfile | head

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

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

112233
223344
123123

那么这就是输出的区别:

$ grep -o '1.'您的文件 |头-n2 11 12 $ grep -m2 -o '1.' 11 12 12

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

【讨论】:

请注意,在将grep-A-B 一起使用时,您不能使用| head 管道(因此不仅要搜索结果(-o),还要搜索上下文)。在这种情况下,您只剩下 -m 来告诉 grep 要返回结果的行数。 使用 head 实际上并不能阻止 grep 运行整个文件。在 grep 中使用 -m 选项即可。【参考方案3】:

awk 方法:

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

【讨论】:

【参考方案4】:

对于 2 个用例:

    我只想要 n 个整体结果,而不是每个文件 n 个结果,grep -m 2 是每个文件的最大出现次数。 我经常用git grep 不用-m

在这些情况下,一个不错的选择是 grep | sed 2q 对所有文件的前 2 个匹配项进行 grep。 sed 文档:https://www.gnu.org/software/sed/manual/sed.html

【讨论】:

【参考方案5】:

使用尾巴:

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

【讨论】:

您可以通过在编辑器中点击“”等图标来设置“代码格式”。 提供比 loooonl loooog liiines 更具可读性的示例会很有用

以上是关于如何限制从 grep 返回的结果数?的主要内容,如果未能解决你的问题,请参考以下文章

如何计算从 MySQL 查询返回的总结果有限制?

Flask 学习-98.Flask-SQLAlchemy limit() 限制返回条数

如何在 Oracle SQL 中将结果限制为 1 行 [重复]

如何在 SwiftUI 中限制 FetchRequest 中的结果数

使用 preg_match_all PHP 限制结果数

使用mongodb的Java驱动程序时如何限制结果数?