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

问题描述 投票:0回答:7

我想说 grep 最多 10 行。

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

linux bash unix sh
7个回答
346
投票

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


74
投票

另一种选择是仅使用 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。


7
投票

awk 方法:

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

4
投票

对于 2 个用例:

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

在这些情况下,一个很好的替代方案是

grep | sed 2q
grep 所有文件中出现的前 2 个匹配项。 sed 文档:https://www.gnu.org/software/sed/manual/sed.html


1
投票

Emilyanswer(2020 年中)提到:

我经常使用

git grep
,但不需要
-m

事实上,确实如此(2022 年中):
在 Git 2.38(2022 年第 3 季度)中,“

git grep -m<max-hits>
(man) 是限制每个文件显示的点击次数的一种方法。

这意味着在 Git 存储库中完成时,

git grep -m
可以用作
grep
的替代品。

请参阅commit 68437ed(2022 年 6 月 22 日),作者:Carlos López (

00xc
)
(由 Junio C Hamano --
gitster
--
合并于 commit 8c4f65e,2022 年 7 月 13 日)

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

签署人:Carlos López [电子邮件受保护]

此补丁添加了一个类似于 GNU grep(1) 的

-m
/
--max-count
的命令行选项,用户可能已经习惯了。

这使得可以限制输出中显示的匹配数量,同时保留其他选项的功能,例如

-C
(显示代码上下文)或
-p
(显示包含函数),这对于使用shell 管道(例如
head(1)
)。

git grep
现在包含在其 手册页中:

-m <num>

--max-count <num>

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

使用

-v
--invert-match
选项,指定后停止搜索 不匹配的数量。

  • 值为 -1 将返回无限制 结果(默认)。
  • 值为 0 将立即退出 非零状态。

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$ 

0
投票

--max-count 选项似乎不适用于标准输入 LC_CTYPE=C tr -dc '[:graph:]' < /dev/urandom |head -c 22200 | grep --max-count=1 -o -E '[A-HJ-NP-Za-km-z/\()$?@]{12}' PuvkrKgCsko
斯洛姆普雷吉耶 icCqWyxCA$Dp RzyCNBbiF/ZG iBMvXNQ\YX\ vGRtHuj(fmdm zqwEXuy)RNCo g)@cwFoMLFZU NzkUa?pexC/F yisv(y$kkXGE 水根/JDfU h(ugUsnGTsYp HzQfpYWk?oPx

它应该只打印一个匹配的模式(生成的密码),但它会显示更多。如果我删除头部 -c 22000,它会永远循环......

我只需要从 urandom 中找到与特定密码规则模式匹配的字符串。我做错了什么?

© www.soinside.com 2019 - 2024. All rights reserved.