LINUX.ORG.RU
ФорумAdmin

awk вопросик....


0

0

Вот хочу написать анализатор логов на awk и вот что хотелось бы. На примере лучше если я покажу:
Есть такие строчки:

54362 login = asdf
54362 begin = 20040516 size = 124568
23648 login = qwert
23765 login = zxcvb
23648 begin = 20040517 size = 434585
23765 begin = 20040517 size = 434585
23765 end = 20040517
54362 end = 20040518
23648 end = 20040519

Мне например нужно size знать у всех логинов кроме qwert, что бы я сделал, плохо зная awk, я бы сначало прошёлся бы по этому файлу и выяснил нужные мне номера, то биш так:
A=`cat log | awk '!/login=qwert/ {print $1}'`

А потом бы в цикле прошёлся по всем номерам и то что нужно бы взял, то есть:
for B IN $A;
do
C=`cat log` ...
done

Но на самом деле это же можно как то сделать за один проход на awk ведь всегда известно что нужный номер будет всегда известен, так как логин находится всегда раньше size, вот только я не знаю как. Помогите плиз...

anonymous

А если ещё проще, то тут скорее всего с помощью awk нужно как то строчки соеденить вместе по номеру в первом столбике, то есть, что то похожее на такое:

54362 login = asdf 54362 begin = 20040516 size = 124568
23765 login = zxcvb 23765 begin = 20040517 size = 434585

anonymous
()
Ответ на: комментарий от anonymous

Например так

cat log | awk '$4!="qwert" && $2=="login" {c=$1; d=$4}; $1==c && $5 == "size" {print d,"=",$7}'

То есть. Если строка с логином (неравным qwert), инициализируем переменные c и d, если строка с размером и номер совпал с запомненным, значит выводим размер.

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

monk ★★★★★
()
Ответ на: Например так от monk

Сорри, за такой неудачный пример... Вот стаким примером даннное решение уже не работает:

54362 login = asdf
23648 login = qwert
23765 login = zxcvb
54362 begin = 20040516 size = 124568
65746 login = hsfgj
23648 begin = 20040517 size = 434585
54362 end = 20040518
23765 begin = 20040517 size = 737586
65746 begin = 20040516 size = 347637
23648 end = 20040519
65746 login = hsfgj
23765 end = 20040517

Хотя должно бы было получится:
asdf = 124568
zxcvb = 737586
hsfgj = 347637

:-((

anonymous
()
Ответ на: Тогда так от monk

Ух ты, спасибо большое.... Это то, что нужно, сейчас буду под себя адаптировать..

СПАСИБО!!!!

anonymous
()
Ответ на: комментарий от anonymous

/login/ { login[$1] = $4; }
/size/ { if(login[$1]!="qwert") print login[$1] " = " $7; }

io ★★
()
Ответ на: Тогда так от monk

Вопрсик, а можно ли как нить в c[$1] записать два значение, я делаю вот так: c[$1]=$4.$10 но тогда туда значения без пробелов между ними пишется, а мне бы хотелось с пробелом, как это сделать????

Спасибо

anonymous
()
Ответ на: комментарий от watashiwa_daredeska

>cat log |sort -ns |awk '$2=="login" {l=$4} $5=="size" {print l,$7}'

Но файлик не такой простой и содержит чуть меньше миллиона строк.. Поэтому эта сортировка в начале очень долго проходит, идя последовательно получается быстрее.

anonymous
()
Ответ на: комментарий от anonymous

И сюда ещё вопрос, $2==qwert означает строгое соответствие, а как написать чтобы не строго, а входило при этом не во всю строчку а именно во второй столбик, что то типа такого:

$2==/qwert/

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.