从shell获得两行

时间:2016-06-14 12:56:51

标签: bash awk sed grep

我用

cmd | egrep 'ID|Value'

在命令行中输入以下输出:

    ID: 2
Value: 21
    ID: 1
Value: 25
    ID: 1
Value: 22
    ID: 3
Value: 56
    ID: 1
Value: 23
    ID: 2
Value: 50
    ID: 2
Value: 56
    ID: 3
Value: 11
    ID: 3
Value: 26

我想通过一个特殊ID过滤它。但是当我使用:

egrep 'ID: 1|Value'

它将显示与ID 1相同的输出,但显示所有ID的值。

我已经读过关于awk,sed和regex的内容,但我找不到任何可以帮助我的东西,但我也没有那么深入。

有人可以提出一个想法,或者告诉我这是一个错误的方法,我应该采取不同的方式,以及如何做?

按需输出:

    ID: 1
Value: 25
    ID: 1
Value: 22
    ID: 1
Value: 23

5 个答案:

答案 0 :(得分:8)

告诉grep将匹配的行与下一行打印在一起:

$ grep -A1 'ID: 1$' file
    ID: 1
Value: 25
    ID: 1
Value: 22
--
    ID: 1
Value: 23

来自man grep

  

-A NUM, - after-context = NUM​​

     

匹配行后打印NUM行的尾随上下文。   放置一个包含组分隔符( - )的行   连续的比赛组。使用-o或--only匹配   选项,这没有效果,并给出警告。

请注意使用$标记该行的结尾。否则,这将匹配线ID: 1323423423

如果你不喜欢在比赛之间出现的--,请用以下方法摆脱它:

grep -A1 --no-group-separator 'ID: 1$' file
#        ^^^^^^^^^^^^^^^^^^^^

答案 1 :(得分:6)

对于其他标签:

AWK

awk '/ID: 1$/ {print; getline; print}'

sed,非常相似

sed -n '/ID: 1$/ {p;n;p}'

和bash

while read line; do if [[ $line == *"ID: 1" ]]; then echo "$line"; read line; echo "$line"; fi; done

答案 2 :(得分:5)

使用awk

的另一个简单脚本
awk '/ID: 1/{line[NR]; line[NR+1]}; NR in line' file

将输出为: -

    ID: 1
Value: 25
    ID: 1
Value: 22
    ID: 1
Value: 23

NR是一个特殊的awk变量,用于存储记录号。我们所做的只是匹配一个模式,并获取行中的NthN+1th记录以在文件中打印,并确保要打印的记录完全在该行的最大范围内({ {1}})。

答案 3 :(得分:1)

使用GNU sed的解决方案(有时在BSD系统上可用作gsed):

$ sed -n -e '/ID: 1/,+1p' data.in
    ID: 1
Value: 25
    ID: 1
Value: 22
    ID: 1
Value: 23

说明:sed脚本“/ID: 1/,+1p”在p/ID: 1/范围内的所有输入行应用+1(打印)命令,即每个匹配正则表达式“ID: 1”和“一行进一步”的行(+n地址是POSIX标准的GNU扩展)。

-n的{​​{1}}标志确保除sed命令打印之外的其他内容(“禁止自动打印模式空间”)。

答案 4 :(得分:0)

这可能适合你(GNU sed):

sed '/ID: 1$/!d;n' file

删除任何不是ID: 1的行,然后将其打印,然后打印下一行。