能否使用grep仅匹配预定范围内的数字行?例如,我想列出包含单词“error”的日志中在[1024, 2048]
范围内的所有数字行。
我希望保留“-n”功能,即在文件中显示匹配行的编号。
首先使用sed:
sed -ne '1024,2048p' | grep ...
-n参数表示不打印行,'x,y,p'表示打印从第x行到第y行的所有行(包括第x行和第y行),这个参数会覆盖-n。
sed -n '1024,2048{/error/{=;p}}' | paste - -
这里/error/
是一个匹配模式,=
打印行号。
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