Online video hd

Смотреть крупно видео

Официальный сайт jetune 24/7/365

Смотреть видео бесплатно

05.08.10 07:54 deFINE

Есть вопрос!Помогите обработать лог: regexp, sed, возможно awk.

Привет.

Подскажите, как справиться с проблемой.

Есть лог такого вида с коммутаторов д-линк:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
kakaka@server ~ $ cat -v tmp | grep -A 12 -i "sh log"
^MDES-3526:admin#sh log^M
^MCommand: show log^M
^M^M
^MIndex  Time                 Log Text                                            ^M
^M-----  -------------------  ----------------------------------------------------^M
^M604    2010/08/05 06:32:14  Successful Enable Admin through Telnet from 165.14.5^M
^M                            0.1 authenticated by AAA server 83.202.172.85 (Usern^M
^M                            ame: gelb, MAC: 00-00-00-00-00-00)^M
^M603    2010/08/05 06:32:14  Successful login through Telnet from 165.14.50.1 aut^M
^M                            henticated by AAA server 83.202.233.194 (Username: g^M
^M                            elb, MAC: 00-00-00-00-00-00)^M
^M602    2010/08/05 04:58:18  Port 22 link up, 100Mbps FULL duplex                ^M
^M601    2010/08/05 04:58:13  Port 22 link down                                   ^M
 


Как видите вывод этих железок содержит непечатные символы, что несколько усложняет работу с логом. Мне нужно, чтобы каждая строка начиналась с номера записи в логе (в куске, что я привел запси с 604 по 601) и тайм стампа, как и положено. Все портит многострочный вывод записей под номерами 603 и 604. По моей задумке нужно подобрать regexp, к строкам 8,9 и 11,12, чтобы потом можно было удалить все непечатные символы и объединить нужные строки.


Пока писал пост до меня дошло, как избавится от ^M, обрамляющего весь лог:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
kakaka@server ~ $ cat -v tmp | grep -A 12 -i "sh log" | sed 's/\^M//g'
DES-3526:admin#sh log
Command: show log

Index  Time                 Log Text
-----  -------------------  ----------------------------------------------------
604    2010/08/05 06:32:14  Successful Enable Admin through Telnet from 165.14.5
                            0.1 authenticated by AAA server 83.202.172.85 (Usern
                            ame: kakaka, MAC: 00-00-00-00-00-00)
603    2010/08/05 06:32:14  Successful login through Telnet from 165.14.50.1 aut
                            henticated by AAA server 83.202.233.194 (Username: k
                            akaka, MAC: 00-00-00-00-00-00)
602    2010/08/05 04:58:18  Port 22 link up, 100Mbps FULL duplex
601    2010/08/05 04:58:13  Port 22 link down
 


Подскажите, пожалуйста как объеденить нужные строки? Я пытался засунуть в регулярное выражения разнообразные отсутпы, табуляции и переносы кареток: \a, \f, \n, \r, \t, \v.

Написал это и до меня дошло, что это пустое пространство - это пробелы, которое я тупо убрал с помощью конструкции sed 's/ //':

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
kakaka@server ~ $ cat -v tmp | grep -A 12 -i "sh log" | sed 's/\^M//g' | sed 's/                            //'
DES-3526:admin#sh log
Command: show log

Index  Time                 Log Text
-----  -------------------  ----------------------------------------------------
604    2010/08/05 06:32:14  Successful Enable Admin through Telnet from 165.14.5
0.1 authenticated by AAA server 83.202.172.85 (Usern
ame: kakaka, MAC: 00-00-00-00-00-00)
603    2010/08/05 06:32:14  Successful login through Telnet from 165.14.50.1 aut
henticated by AAA server 83.202.233.194 (Username: k
akaka, MAC: 00-00-00-00-00-00)
602    2010/08/05 04:58:18  Port 22 link up, 100Mbps FULL duplex
601    2010/08/05 04:58:13  Port 22 link down
 


А теперь осталось самое главное: как объединить нужные мне строки: 8 с 9 и 10, а 11 с 12 и 13 при условии, что таких строк в моем логе достаточно много?

P.S. Парадокс - вы еще ничего не ответили, а уже очень сильно помогли. Извиняюсь за поток сознания: бессоная ночь дает о себе знать.


Теги:

kstep 05.08.10 09:19 # +6
Навскидку (может понадобится допилить):

Перл:
1
2
3

echo -ne "123 ddddd\n    asdasdf" | perl -ne 'chomp; if (/^\s/) { s/^\s+/ /; print; } elsif (/^\d/) { print "\n"; print; };'
 


Авк:
1
2
3

:echo -ne "123 ddddd\n    asdasdf\n345 sddfgdsfg\n    sadfgdsgdf" | awk '/^[0-9]/ { print buf; buf=$0 } /^ / { sub(/^ +/, " "); buf=buf $0 } END { print buf }'
 


Сед:
1
2
3

echo -ne "123 ddddd\n    asdasdf\n678 sdfhfhdh\n345 sddfgdsfg\n    sadfgdsgdf" | sed -ne '/^[0-9]/{x;s/\n//g;p};/^ /{s/^ \+/ /;H};${H;x;s/\n//g;p}'
 
kstep 05.08.10 09:20 # +0
Лично мне больше всего сед нравится, а так — выбирай =)
kstep 05.08.10 09:30 # +2
Ах, да, ещё, пока не забыл.
/me надевает строгий учительский взгляд
RTFM. Эти строки не разбираю намеренно: перл и авк должны быть очевидны при минимальном с ними знакомстве, а про сед — читайте мануал, в нём про все команды написано. Подскажу только, что логика в сед-проге аналогичная применённой в авк варианте.
/me снимает учительскую маску.
Фууу... Эта, в общем, читайте и будет вам щастье!
kstep 05.08.10 09:33 # +0
Ой, в последнем варианте опечатка, в последней группе команд H не нужно.
deFINE 05.08.10 11:36 # +-1
Работает!!! Спасибо.

Пока что мне сед тоже ближе.

Теперь хочу разобраться, как оно работает...

Смотри, я правильно понимаю следующее.

/^[0-9]/{x;s/\n//g;p}
Мы очищаем буфер удержания, ищем строки, которые начинаются с чисел и удаляем для таких строк символ переноса строки, вставляем содержимое буфера удержания и выводим буфер на экран.

/^ /{s/^ \+/ /;H}
Удаляем лишние пробелы в строках, которые с них начинаются. Кстати, конструкция "^ \+" гораздо удобнее, чем множество пробелов - я сам не додумался. Добавляем к тому, что уже в буфере удержания, обработанные строки.

${x;s/\n//g;p}
Дальше уже знакомая конструкция, только мне не понятно, что делает $ - это такая же подстановка, как и в баше?

В итоге конструкция
sed -ne '/^[0-9]/{x;s/\n//g;p};/^ /{s/^ \+//;H};${x;s/\n//g;p}'

Действительно работает!
Удалил пробел между данными из разных строк - он мне не нужен.
kstep 05.08.10 12:52 # +2
Не совсем так.

Сед сканирует по очереди каждую строку, сверяясь в заданными шаблонами. Шаблона 3:
/^[0-9]/ — строки, начинающиеся на число,
/^ \+/ — строки, начинающиеся на 1 и более пробелов,
$ — последняя строка.

После этих шаблонов (адресов в терминологии седа) идут команды, которые надо выполнить над «попавшей» строкой.

У седа 2 внутренних буфера: буфер текущий строки, над которым работают все команды правки, и «буфер удержания» — временное хранилище, вроде регистров в виме, только тут он один.

Я использую две команды для работы с буферами: xобменять содержимое буферов строки и «удержания», Hдобавить содержимое буфера строки в буфер «удержания».

Если начинается на число, то текущая строка идёт в буфер «удержания», а содержимое буфера «удержания» идёт в буфер строки и печатается,
если на пробелы — это продолжение записи, лишние пробелы удаляются из буфера строки и потом он добавляется к буферу «удержания».

Последняя группа команд нужна для того, чтобы вывести накопленное содержимое буфера «удержания» в конце файла: к этому времени в буфере «удержания» сформирована цельная запись (включая саму последнюю строку) и если её не вывести, то последняя запись пропадёт. Я извлекаю её из буфера «удержания» в буфер строки и печатаю.

Всё остальное описано верно =)

kstep 05.08.10 13:01 # +1
Errata:
/^ / — строки, начинающиеся на пробел.
deFINE 05.08.10 12:05 # +-1
А еще вопрос.

Если сделать так к первому выводу в моем посте:
sed -ne 's/\^M//;/^[0-9]/{x;s/\n//g;p};/^ /{s/^ \+//;H};${x;s/\n//g;p};s/\^M//'


То в конце строк все равно остаются ^M:
1
2
3
4
5
6
7

define@dv5:~$ cat tmp | sed -ne 's/\^M//;/^[0-9]/{x;s/\n//g;p};/^ /{s/^ \+//;H};${x;s/\n//g;p};s/\^M//'

604    2010/08/05 06:32:14  Successful Enable Admin through Telnet from 165.14.5^M0.1 authenticated by AAA server 83.202.172.85 (Usern^Mame: gelb, MAC: 00-00-00-00-00-00)^M
603    2010/08/05 06:32:14  Successful login through Telnet from 165.14.50.1 aut^Mhenticated by AAA server 83.202.233.194 (Username: g^Melb, MAC: 00-00-00-00-00-00)^M
602    2010/08/05 04:58:18  Port 22 link up, 100Mbps FULL duplex                ^M
601    2010/08/05 04:58:13  Port 22 link down                                   ^M


По идее s/\^M//' в конце должно ведь удалить этот апендикс. Почему этого не происходит?
kstep 05.08.10 12:56 # +0
Команда s/\^M// в конце не будет иметь никакой роли, т.к. к тому моменту уже всё отпечатано (команды p). Надо оставить только первую команду s/\^M//g,
либо к каждой команде s/\n//g дописать в пару s/\^M//g:

...{x;s/\n//g;s/\^M//g;p}

%username% love BDSM!

deFINE 05.08.10 14:59 # +-1
Точно! Я о нем постоянно забываю!

Спасибо.
deFINE 05.08.10 15:03 # +-1
Жму ответить, а ответ почему-то идет к общей теме, а не к комментарию.
peter 06.08.10 15:06 # +1
Не совсем в тему, но в длинках есть возможность слать лог syslog-демону.
На примере syslog-ng:
В syslog-ng.conf добавить что-то вроде
1
2
3
4
5
6
7
source network {
    udp(ip("0.0.0.0") port(514));
};

destination switches {file("/var/log/switches"); };

log { source(network); destination(switches); };

На коммутаторе:
1
2
3
enable syslog
create syslog host 1 severity all facility local7 udp_port 514 ipaddress <ip_address_of_syslog_daemon> state enable
config log_save_timing on_demand
deFINE 06.08.10 18:27 # +0
К сожалению, к длинковскому сислог-серверу у меня доступа нет. Поэтому я пишу под свои нужды скрипт, который собирает с коммутаторов информацию и выдает ее в удобном мне виде.
peter 07.08.10 12:04 # +0
Можно поднять свой сислог-сервер и добавить еще один syslog host на коммутаторе :)
freefd 29.08.10 01:29 # +0
syslog. А это Вы велосипеды изобретаете в on air.

Лучшие блоги (все 131)
Топ пользователей Топ блогов
Топ пользователей Топ блогов
Элита (все 2532 из 199 городов)
Топ пользователей Топ блогов
welinux.ru

Смотреть видео онлайн

Онлайн видео бесплатно


Смотреть русское с разговорами видео

Online video HD

Видео скачать на телефон

Русские фильмы бесплатно

Full HD video online

Смотреть видео онлайн

Смотреть HD видео бесплатно

School смотреть онлайн