2014-10-27 3 views
1

Я хочу, чтобы разобрать действительно огромный лог-файл, здесь пример ярлык:сценария оболочки для разбора огромного файла журнала

===== 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 = или ro =» (и повторяются после «root =»).

Он должен игнорировать каждую строку, где нет серверов, перечисленных после rw = или ro =.

Для каждого нового сервера, даже с одним и тем же типом, я хочу запустить новую строку, если имеется более одного перечисленного сервера, они разделены символом ':'.

Я думал, что это можно будет перечислить с помощью цикла, который содержит IFS ':'. Но я не совсем уверен, как это написать ...

Может кто-нибудь мне помочь? спасибо заранее

Я пробовал с:

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

и петля в то время как я думаю, что может работать:

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

, но я не знаю, если петля правильно или где положи это.

+1

Это должно было тебя r первый вопрос, вместо [this] (http://stackoverflow.com/q/26587589/2088135) –

+1

В предыдущем вопросе вы получили некоторые результаты. Вы пытались «играть» с ними? – fedorqui

+0

Да, у меня уже была петля с IFS, прежде чем я задал первый вопрос и захотел попробовать сам, но не работал – howdoesthiswork

ответ

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 

Script

[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

+0

Тип @howdoesthiswork на терминале: - 'awk -vOFS =", "-f parse_log.awk your_log_file' –

+0

Хорошо, теперь он работает, но он перечисляет только хосты первого типа в каждом vFiler, он игнорирует случай, когда есть другой тип с хостами на том же vFiler – howdoesthiswork

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

+0

, она должна работать, если я поместил путь к моему файлу журнала за командой, не так ли? – howdoesthiswork

+0

так, awk -F [, \ =] '/^=====/{filler = $ 7} /r[wo]=[^.]*.net/{split($5, a, ":") ; для (i в a) наполнителя печати, $ 1, [i]} 'inputFile - недостаточно? – howdoesthiswork

Смежные вопросы