繁体   English   中英

awk / sed / grep / perl使用字段分隔符,然后仅显示特定行

[英]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在命令行上执行代码。

使用grepcut

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM