Видео ролики бесплатно онлайн

Смотреть hd видео

Официальный сайт seoturbina 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

В хорошем качестве hd видео

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


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

Online video HD

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

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

Full HD video online

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

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

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