2017-03-02 38 views
0

我需要提取租約IP「192.168.21.100」,硬件以太網「14:10:9f:f2:1d:00」和客戶端主機名「2015cmoran-2」 。awk unix將多行分爲一行並提取文字

而且它需要在這樣一行

「192.168.21.100」, 「14:10:9F:F2:1D:00」, 「2015cmoran-2」

lease 192.168.21.100 { 
starts 4 2017/03/02 05:43:15; 
ends 4 2017/03/02 17:43:15; 
cltt 4 2017/03/02 05:43:15; 
binding state active; 
next binding state free; 
rewind binding state free; 
hardware ethernet 14:10:9f:f2:1d:00; 
uid "\001\024\020\237\362\035\000"; 
client-hostname "2015cmoran-2"; 
} 
server-duid "\000\001\000\001 IL\264x\243Q\031O\032"; 

我做這些,但我不認爲這是做

cat /var/dhcpd.leases | sed 's/;//g' | sed 's/"//g' | awk '{for (I=1;I<=NF;++I) if ($I == "client-hostname") {print $2};}' 

cat /var/dhcpd.leases | sed 's/;//g' | sed 's/"//g' | awk '{for (I=1;I<=NF;++I) if ($I == "ethernet") {print $3};}' 
+0

'cat | sed'和'sed | awk'都是普通反模式的變體[無用的'cat'](http://www.iki.fi/era/unix/award.html)。除非特別連接多個輸入文件,並且很少在同一管道中多於'grep','sed'或Awk,否則應該不需要出現'cat'。 – tripleee

+0

'cat /var/dhcpd.leases | sed's /; // g'| sed's /「// g''可以寫成'sed's/[;」] // g'/ var/dhcpd.leases' –

回答

0
x=$(awk -v ORS="," '/lease/||/hardware ethernet/||/client-hostname/{gsub(/{|\;|\"/,"");print "\""$NF"\"" }' inputfile|sed -r 's/(^.*),/\1/') 


echo $x 
"192.168.21.100","14:10:9f:f2:1d:00","2015cmoran-2" 

正道這將下滲包含線10,那麼gsub將用於過濾掉像{|}|;|"這樣的字符。一旦完成,打印行。請注意,ORS被修改爲逗號。 sed用於清除來自ORS的最後一個逗號符號。