簡體   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