【问题标题】:awk/sed/grep/perl using field separator then only showing specific linesawk/sed/grep/perl 使用字段分隔符然后只显示特定行
【发布时间】:2014-07-29 18:29:16
【问题描述】:

最近我了解到 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

我知道我遗漏了一些非常基本的东西,但我完全被卡住了。

【问题讨论】:

  • 抱歉,我受不了:这是文件的第一行,awk 和所有其他喜欢音乐的脚本语言永远不会接受作为有效输入;)
  • 哈,我以为 stackoverflow 的人会从中受益。

标签: regex bash perl awk sed


【解决方案1】:

你快到了,你需要把-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

【讨论】:

  • 谢谢!我觉得我很接近,但就是无法得到正确的组合。我曾尝试将-F"=" 放在命令的开头,但没有正确放置{print $2}。我的 LCD 现在可以很好地显示我的曲目了!
【解决方案2】:

只需使用正则表达式功能将所有条件组合为一个:

awk -F"=" '!($1 ~ /^(artwork|genre|comment|)$/) {print $2}' file

【讨论】:

  • 也谢谢你!当我测试这个时,我无法过滤掉空白行。我尝试通过这样做稍微修改它:(artwork|genre|comment|.),但这可能真的不合逻辑。
  • 就这样吧:awk -F"=" '!($1 ~ /^(artwork|genre|comment|)$/) {print $2}' file 忽略空白行。
  • 啊,谢谢。此版本删除了空白行。我不确定为什么我没有注意到 Avinash 的第一个建议也没有删除空白行。结果我需要那些空白行,因为我的 LCD 显示屏显示 4 行。后代:awk -F"=" '!($1 ~ /^(artwork|genre|comment)/) {print $2}'
  • 好的,很高兴知道您的问题已解决。您可以通过单击我的答案左上角的刻度线将此答案标记为已接受。
【解决方案3】:

Perl 版本

perl -F/=/ -lane 'print $F[1] if $F[0] =~ /artist|title|album/' file

【讨论】:

  • 谢谢!我也测试了这个版本。它在终端上打印得很好,但它似乎不想通过管道连接到我的 LCD 上。我不知道为什么。
【解决方案4】:

使用 perl 单行代码

perl -ne 'print if s/(artwork|genre|comment)=//' file

说明:

开关

  • -n:为输入文件中的每个“行”创建一个 while(&lt;&gt;){...} 循环。
  • -e:告诉perl 在命令行上执行代码。

【讨论】:

    【解决方案5】:

    使用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
    

    【讨论】:

      猜你喜欢
      • 2018-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-19
      • 2017-11-16
      • 1970-01-01
      • 2012-04-08
      • 2018-08-25
      相关资源
      最近更新 更多