我正在尝试打印匹配的行和匹配行的第 4 行(包含我正在搜索的表达式的行)。
我一直在使用以下代码:
sed -n 's/^[ \t]*//; /img class=\"devil_icon/,4p' input.txt
但这只会打印匹配的行。
这仅打印第 4 行。
awk 'c&&!--c;/img class=\"devil_icon/{c=4}' input.txt
我只需要打印匹配的行和第 4 行。
Val*_*ami 22
在 awk 中,你会这样做
awk '/pattern/{nr[NR]; nr[NR+4]}; NR in nr' file > new_file`
Run Code Online (Sandbox Code Playgroud)
或者
awk '/pattern/{print; nr[NR+4]; next}; NR in nr' file > new_file`
Run Code Online (Sandbox Code Playgroud)
第一个解决方案查找所有匹配的行pattern
。当它找到匹配项时,它会将记录号 ( NR
)存储在数组中nr
。它还存储NR
同一个数组中的第 4 条记录。这是由nr[NR+4]
. NR
然后检查每个记录 ( ) 以查看它是否存在于nr
数组中,如果存在则打印该记录。
第二种解决方案的工作方式基本相同,除了当它遇到pattern
它时,它会打印该行,然后将其前面的第 4 条记录存储在数组中nr
,然后转到下一条记录。然后当awk
遇到第 4 条记录时,NR in nr
块将被执行并在那里打印这条 +4 记录。
这是一个示例数据文件,sample.txt
.
$ cat sample.txt
1
2
3
4 blah
5
6
7
8
9
10 blah
11
12
13
14
15
16
Run Code Online (Sandbox Code Playgroud)
使用第一个解决方案:
$ awk '/blah/{nr[NR]; nr[NR+4]}; NR in nr' sample.txt
4 blah
8
10 blah
14
Run Code Online (Sandbox Code Playgroud)
使用第二种解决方案:
$ awk '/blah/{print; nr[NR+4]; next}; NR in nr' sample.txt
4 blah
8
10 blah
14
Run Code Online (Sandbox Code Playgroud)
您可以尝试使用-A
选项grep
,它指定应打印匹配行后的行数。将此与 结合使用sed
,您将获得所需的行。
grep -A 4 pattern input.txt | sed -e '2,4d'
使用sed
,我们从第二行到第四行删除 。