如何使用sed从第二个值获取输出

时间:2013-07-15 06:39:17

标签: regex unix sed awk

我有一个包含以下内容的文件作为示例

cat test.log
hello
how are you?
terminating
1
2
3
terminating
1
2

当使用grep命令终止后显示输出时,显示如下。

sed -n '/terminating/,$p' test.log

terminating
1
2
3
terminating
1
2

我想要输出如下

terminating
1
2

有人可以帮我吗?

3 个答案:

答案 0 :(得分:3)

的代码:

$ sed -n '/terminating/{N;N;h};${g;p}' file
terminating
1
2

如果行匹配terminating,则将其存储在保留空间中的下两行中。在$EOF上打印三行。


sed脚本示例:

$ cat script.sed
/terminating/{
N
N
h
}
${
g
p
}

$ sed -nf script.sed file
terminating
1
2

对于最后一个terminating之后的所有行:

$ cat file
cat test.log
hello
how are you?
terminating
1
2
3
terminating
1
2
3
4
5
6

$ cat script.sed
H
/terminating/{
h
}
${
g
p
}

$ sed -nf script.sed file
terminating
1
2
3
4
5
6

答案 1 :(得分:1)

这可能适合你(GNU sed):

sed -r '/^terminating/!d;:a;$!N;/.*\n(terminating)/s//\1/;$q;ba' file

除非该行以terminating开头,否则将其丢弃。读入更多行,丢弃在terminating行之前的任何行。在文件结尾处打印出文件的剩余部分。

答案 2 :(得分:0)

sed -n 'H;/terminating/x;${x;p}' test.log

作为带注释的伪代码:

for each line:
    append the line to the hold space     H
    if line matches /terminating/         /terminating/
       then set hold space to line        x
    on the last line:                     $
        get the hold space                x
        and print                         p

注意:x实际上会交换保留/模式空间。