在grep中匹配后打印行

时间:2016-11-18 11:50:03

标签: bash grep

我试图让当前的曲目从“cmus-remote -Q' 它总是在这一行的下面

 tag genre Various
 <some track>

现在,我需要保持简单,因为我想将它添加到我的i3栏。我用了

cmus-remote -Q | grep -A 1 "tag genre" 

但是那个grep&#39;标签&#39;线和下面的线。

我只想要下面的一行。

4 个答案:

答案 0 :(得分:0)

您可以使用awk代替grep

awk 'p{print; p=0} /tag genre/{p=1}' file

<some track>
  • /tag genre/{p=1} - 在一行中遇到p=1时设置标记tag genre
  • p{print; p=0}p非零时,它会打印一行并将p重置为0

答案 1 :(得分:0)

我建议使用awk:

awk 'seen && seen--; /tag genre/ { seen = 1 }'
  • seen为真时,请打印该行。
  • seen为真时,递减该值,因此在打印所需的行数后它将不再为真
  • 当模式匹配时,将seen设置为要打印的行数

答案 2 :(得分:0)

如果您想使用grep作为此工具,可以通过向管道添加其他细分来实现:

cmus-remote -Q | grep -A 1 "tag genre" | grep -v "tag genre"

如果您要搜索的字符串连续两行,则会失败。如果我们打算为它编写一些合理的东西,你必须定义你想要的行为。

另一种可能性是使用像awk这样的工具,这样可以在行选择中实现更大的复杂性:

cmus-remote -Q | awk '/tag genre/ { getline; print }'

这会搜索字符串,然后获取下一行,然后打印它。

另一种可能性是仅在bash中执行此操作:

while read line; do
  [[ $line =~ tag\ genre ]] && read line && echo "$line"
done < <(cmus-remote -Q)

这实现了与awk脚本相同的功能,根本不使用任何外部工具。它可能比awk脚本慢。

答案 3 :(得分:0)

使用sed

sed -n '/tag genre/{n;p}'

输出:

$ cmus-remote -Q | sed -n '/tag genre/{n;p}'
<some track>