我用
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
答案 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
变量,用于存储记录号。我们所做的只是匹配一个模式,并获取行中的Nth
和N+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
的行,然后将其打印,然后打印下一行。