[英]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.