打印匹配行和匹配行中的第 n 行

deb*_*bal 19 shell-script

我正在尝试打印匹配的行和匹配行的第 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)

  • 不错,+1。你在这里使用了很多 `awk` 快捷方式,你能添加一个简短的解释吗(比如 awk 中隐含的打印以及数组是关联的等等)? (4认同)

Bar*_*run 5

您可以尝试使用-A选项grep,它指定应打印匹配行后的行数。将此与 结合使用sed,您将获得所需的行。

grep -A 4 pattern input.txt | sed -e '2,4d'

使用sed,我们从第二行到第四行删除 。

  • 这假设文件中的`pattern` 匹配。 (3认同)