在指定范围内查找匹配的行(使用grep命令)

9

能否使用grep仅匹配预定范围内的数字行?例如,我想列出包含单词“error”的日志中在[1024, 2048]范围内的所有数字行。

我希望保留“-n”功能,即在文件中显示匹配行的编号。

3个回答

8

首先使用sed:

sed -ne '1024,2048p' | grep ...

-n参数表示不打印行,'x,y,p'表示打印从第x行到第y行的所有行(包括第x行和第y行),这个参数会覆盖-n。


我认为 Prince John Wesley 的解决方案更好的原因是它还打印了原始行号,而在这里,我只会得到指定范围内的行数。但仍然加 1。 - Ivaylo Strandjev
@John3136,"-n"和"ne"有什么区别? - Manuel Jordan
1
@ManuelJordan -e 只是说“跟着一个表达式”。你不一定需要它,但我习惯性地这样做 - 有些版本的sed可能比其他版本更挑剔,需要-e选项。如果-n选项对你有效,那么使用它也没有坏处。 - John3136

7
sed -n '1024,2048{/error/{=;p}}' | paste - -

这里/error/是一个匹配模式,=打印行号。


我接受你的答案,因为它还打印了原始行号。但是我不太理解 {/error/{=;p}} 这一部分,请问你能解释一下吗? - Ivaylo Strandjev
1
“/error/” 是要在给定数字范围内匹配的模式。 - Prince John Wesley

3

Awk是一款适用于此工作的好工具:

$ awk 'NR>=1024 && NR<=2048 && /error/ {print NR,$0}' file

awk中,变量NR包含当前行号,$0包含该行本身。

使用awk的好处是,你可以很容易地改变输出方式来满足你的需求。例如,将行号与行内容用冒号和制表符分隔开:

$ awk 'NR>=1024 && NR<=2048 && /error/ {print NR,$0}' OFS=':\t' file

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接