2017-10-19 114 views
1

解析文本我需要關於經由SED,AWK或bash的文本解析的提示:使用sed + AWK +的bash

示例文本:

VRF MediaPlayer 
192.168.1.1 52466 5w12d 
192.168.1.2 52467 3w1d 


VRF Telecom 
10.10.1.1 43432 1d1h 
12.20.1.1 23211 23w1d 
30.30.22.1 43211 14w22d 

預期輸出:

192.168.1.1 52466 5w12d MediaPlayer 
192.168.1.2 52467 3w1d MediaPlayer 


10.10.1.1 43432 1d1h Telecom 
12.20.1.1 23211 23w1d Telecom 
30.30.22.1 43211 14w22d Telecom 

如何將VRF「Name」作爲第4列,應該使用什麼語法?

問候,

回答

4
awk '/^VRF /{vrf=$2}/^[0-9]/{print$0,vrf}' | column -t 

或純awk

awk '/^VRF /{vrf=$2} /^[0-9]/{printf("% -30s %s\n",$0,vrf)}' 
+0

@OP:'/ ^([0-9] | $)/ {print $ 0,(NF> 0)?vrf:「」}'如果您需要保留空白記錄 – JNevill

0

繼AWK也可以幫助你在相同的了。

awk '/^VRF/{val=$2;next} NF{$1=$1;print $0,val;next} 1' OFS="\t" Input_file 
0
$ awk '/^VRF/{vrf=$2; next} {print $0 (NF ? OFS vrf : "")}' file 
192.168.1.1 52466 5w12d MediaPlayer 
192.168.1.2 52467 3w1d MediaPlayer 


10.10.1.1 43432 1d1h Telecom 
12.20.1.1 23211 23w1d Telecom 
30.30.22.1 43211 14w22d Telecom 
0

使用sed

sed '/VRF /{s///;h;:A;N;s/.*\n//;/^$/!{G;s/\n/ /;p;bA}}' infile 

如果該行不包含 'VRF' 打印什麼也沒有太行例如

否則替代= MediaPlayer的

和複製保持空間'h'

:A是環

得到一個新行N和刪除以前的線S /.* \ n //

如果該行不是空的,複製的保持空間( '的MediaPlayer')在模式空間 'G'

的末尾刪除\ N,打印線,並返回到:一個

0

簡單AWK溶液

$ awk '/^VRF/{a=$NF; next} NF{$0=$0 FS a}1 ' file 
192.168.1.1 52466 5w12d MediaPlayer 
192.168.1.2 52467 3w1d MediaPlayer 


10.10.1.1 43432 1d1h Telecom 
12.20.1.1 23211 23w1d Telecom 
30.30.22.1 43211 14w22d Telecom 

/^VRF/{a=$NF; next}:如果記錄以VRF開始,則將變量a設置爲該記錄中的最後一個字段。然後next奈何

NF{$0=$0 FS a}1:如果NF再行具有一定的領域,是不是空的,則只需追加a的記錄,並打印出來。如果它是空的,請不要追加並簡單地打印。