我想说,从grep最多10行。

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


另一个选择是使用head:

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个用例:

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

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


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

我经常使用git grep,它不带-m。

事实上,确实如此(2022年年中): 在Git 2.38 (Q3 2022)中,“Git grep -m<max-hits>”(man)是一种限制每个文件显示的点击量的方法。

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

参见Carlos提交68437ed(2022年6月22日)López (00xc)。 (由Junio C Hamano—gitster—在commit 8c4f65e中合并,2022年7月13日)

Grep:添加——max-count命令行选项 署名:Carlos López 00xc@protonmail.com

这个补丁增加了一个命令行选项,类似于GNU grep(1)的-m /——max-count,用户可能已经习惯了。 这使得限制输出中显示的匹配数量成为可能,同时保持其他选项的功能,如-C(显示代码上下文)或-p(显示包含函数),这在shell管道中很难做到(例如head(1))。

Git grep现在在它的手册页中包括:

全国矿工工会- m < > ——max-count < num > 限制每个文件的匹配数量。 当使用-v或 ——invert-match选项,搜索在指定后停止 不匹配的数量。 值-1将返回无限值 结果(默认值)。 值为0将立即退出 非零状态。