[英]awk/sed/grep/perl using field separator then only showing specific lines
最近我了解到,shairport(airplay模拟器)现在创建了一个fifo文件,该文件通过以下格式传递元数据:
artist=Justin Bieber
title=Baby
album=My World 2.0
artwork=cover-2de1df4b978034bcd789ea10b1111a.jpg
genre=Pop
comment=
我有一个液晶显示器,我想将其发送到,但我试图将其解析为基本上可以显示以下内容:
Justin Bieber
Baby
My World 2.0
我尝试使用awk获得上述结果,但是如果有人使用sed,grep,perl或其他任何建议,我都愿意接受!
无论如何,这是到目前为止我尝试过的一堆东西:
awk -F"=" '{print $2}'
使其显示:
Justin Bieber
Baby
My World 2.0
cover-2de1df4b978034bcd789ea10b1111a.jpg
Pop
酷在那里,但我真的不需要展示作品,类型和评论。
这是我用来过滤掉这些多余字段的命令:
awk '!/artwork=/ && !/genre=/ && !/comment=/ && /./'
要打印此:
artist=Justin Bieber
title=Baby
album=My World 2.0
现在,我只需要将两者结合起来,就可以尝试一下(更不用说其他一系列变化了):
awk '!/artwork=/ && !/genre=/ && !/comment=/ && /./' && -F"=" '{print $2}'
但我得到与上述相同的结果:
artist=Justin Bieber
title=Baby
album=My World 2.0
我知道我缺少一些非常基本的东西,但是我完全被卡住了。
您快到了,您需要在开始处输入-F"="
。
$ awk -F"=" '!/artwork=/ && !/genre=/ && !/comment=/{print $2}' file
Justin Bieber
Baby
My World 2.0
要么
下面的awk仅占用前三行,
$ awk -F"=" 'NR<4{print $2}' file
Justin Bieber
Baby
My World 2.0
只需使用正则表达式功能即可将所有条件组合为一个:
awk -F"=" '!($1 ~ /^(artwork|genre|comment|)$/) {print $2}' file
Perl版本
perl -F/=/ -lane 'print $F[1] if $F[0] =~ /artist|title|album/' file
使用perl单线
perl -ne 'print if s/(artwork|genre|comment)=//' file
开关 :
-n
:为输入文件中的每个“行”创建一个while(<>){...}
循环。 -e
:告诉perl
在命令行上执行代码。 使用grep
和cut
:
grep -Ev "(artwork|genre|comment)" file | cut -d= -f 2
Justin Bieber
Baby
My World 2.0
使用perl
:
perl -ne '!/(artwork|genre|comment)/ && s/.*=(.*)/$1/g && print' file
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.