2014-10-27 118 views
1

我想分析一個真正巨大的日誌文件,這裏例如快捷方式:shell腳本解析一個巨大的日誌文件

===== fspCIV0 
/vol/vol0 -sec=sys,rw=fspsanp42.net,root=fspsanp42.net,nosuid 
===== fcvCIS01 
/vol/ARDW -sec=sys,rw 
/vol/ARDW -sec=sys,rw 
/vol/ARDW -sec=sys,rw,nosuid 
/vol/ARDW -sec=sys,rw 
/vol/ARDW -sec=sys,rw=none 
/vol/lonulixda -sec=sys,rw=fcvsan10.net:fcvsan11.net,root=fcvsan10.net:fcvsan11.net 

它繼續這樣了幾頁......

的所需的輸出應爲:

vFiler, Type, host 
fspCIV0, /vol/vol0, fspsanp42.net 
fcvCIS01, /vol/lonulixda, fcvsan10.net 
fcvCIS01, /vol/lonulixda, fcvsan11.net 

的vFiler線總是以「=====」後跟一個字符串 此後每隔一行開始與「/體積/ ...」,這意味着啓動是類型,所以f我已經設法獲取信息,但真正的問題始於'rw = or ro ='(並在'root ='之後重複)後列出的服務器名稱。

它應該忽略在rw =或ro =之後沒有列出任何服務器的每一行。

即使使用相同類型的每個新服務器,我想開始一個新行,如果列出了多個服務器,它們被':'分隔。

我認爲可以用包含IFS':'的循環列出它。 但我不太清楚如何寫它...

有人可以幫助我嗎?在此先感謝

我有嘗試過:

awk -v RS="=====" -v OFS="," 'BEGIN {print "vFiler", "Type" } NF{print $1, $2}' 

和while循環我認爲這可能是工作:

while IFS=':' read -r host $1-$#; 

,但我不知道如果循環是正確的或在哪裏放它。

+1

這應該是你r第一個問題,而不是[this](http://stackoverflow.com/q/26587589/2088135) – 2014-10-27 14:06:26

+1

在前面的問題中,你得到了一些結果。你嘗試過與他們玩嗎? – fedorqui 2014-10-27 14:06:37

+0

是啊我已經有了一個IFS循環,然後我問了第一個問題,並想自己嘗試,但它不工作 – howdoesthiswork 2014-10-27 14:10:45

回答

1

試一下這個腳本可以幫助你

輸入

[email protected]:/tmp$ cat file 
===== fspCIV0 
/vol/vol0 -sec=sys,rw=fspsanp42.net,root=fspsanp42.net,nosuid 
===== fcvCIS01 
/vol/ARDW -sec=sys,rw 
/vol/ARDW -sec=sys,rw 
/vol/ARDW -sec=sys,rw,nosuid 
/vol/ARDW -sec=sys,rw 
/vol/ARDW -sec=sys,rw=none 
/vol/lonulixda -sec=sys,rw=fcvsan10.net:fcvsan11.net,root=fcvsan10.net:fcvsan11.net 

腳本

[email protected]:/tmp$ cat parse_log.awk 
BEGIN{ 
    print "vFiler", "Type", "host" 
} 
/=====/{ 
    vFiler=$2 
    next 
} 
match($0,/root=[^,]*/){ 
    n=split(substr($0,RSTART+5,RLENGTH-5),N,/:/) 
    for(i=1; i<=n; i++)print vFiler,$1,N[i]; 
} 

如何執行呢?

[email protected]:/tmp$ awk -vOFS="," -f parse_log.awk file 

輸出

vFiler,Type,host 
fspCIV0,/vol/vol0,fspsanp42.net 
fcvCIS01,/vol/lonulixda,fcvsan10.net 
fcvCIS01,/vol/lonulixda,fcvsan11.net 
+0

這看起來不錯,但現在真的很愚蠢的問題...我想測試一下它的長日誌文件,我有什麼命令腳本寫那麼其上運行的日誌文件,當我執行它在這樣的終端 – howdoesthiswork 2014-10-27 14:32:23

+0

@howdoesthiswork類型: - 'AWK -vOFS =」, 「-f parse_log.awk your_log_file' – 2014-10-27 14:34:01

+0

好吧,現在它的工作原理,但它確實只列出每個vFiler第一類型的主機,它忽略了那裏是與同vFiler – howdoesthiswork 2014-10-27 14:57:01

0

簡單的版本將是

awk -F[,\ =] '/^=====/{filler=$7} /r[wo]=[^.]*.net/{split($5, a, ":"); for (i in a) print filler,$1,a[i]}' 

這將使輸出

fspCIV0 /vol/vol0 fspsanp42.net 
fcvCIS01 /vol/lonulixda fcvsan10.net 
fcvCIS01 /vol/lonulixda fcvsan11.net 
+0

我沒有得到任何輸出當我在我的文件 – howdoesthiswork 2014-10-27 14:47:54

+0

上執行這個命令時,如果我將日誌文件的路徑放在命令後面,它應該可以工作嗎? – howdoesthiswork 2014-10-27 14:58:31

+0

so,awk -F [,\ =]'/^=====/{filler = $ 7} /r[wo]=[^.]*.net/{split($5,a,「:」) ;對於(我在a)打印填充,$ 1,a [i]} inputFile - 是不夠的? – howdoesthiswork 2014-10-27 15:13:21