URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID1
Нить номер: 43840
[ Назад ]

Исходное сообщение
"как sed или awk отрезать символы в поле"

Отправлено Linuxadmin , 12-Май-04 10:08 
Добрый день всем.
У меня ведутся логи проходящего траффика с помощью tehtereal.
Tethereal запущен с ключом -t ad, то есть в лог он выдает дату и время.
При этом время идет с милисекундами, т.е. получается поле вида 10:25:47.123456
Потом этот лог загоняется при помощи mysql - клиента соответственно на mysql - сервер. Почему-то в процессе добавления строк в таблицу иногда в поле времени вместо 10:25:47 попадает 12:34:56 т.е. милисекунды (тип данных в данном поле таблицы стоит - time).
Как бы мне обработать лог - удалить из второго поля лог файла милисекунды и точку? Или удалить из поля все символы по шаблону (то есть все символы после точки вместе с точкой)?
Заранее благодарен.

Содержание

Сообщения в этом обсуждении
"как sed или awk отрезать символы в поле"
Отправлено temny , 12-Май-04 10:24 
echo 10:25:47.123456 | sed -e s/\\.[0-9]\\{6\\}//
echo 10:25:47.123456 | awk '{split($1,a,"."); print a[1] }'

"как sed или awk отрезать символы в поле"
Отправлено LinuxAdmin , 12-Май-04 10:52 
>echo 10:25:47.123456 | sed -e s/\\.[0-9]\\{6\\}//
>echo 10:25:47.123456 | awk '{split($1,a,"."); print a[1] }'

А как целиком файл скормить?
Поле в файле второе, поля разделены пробелом.
В принципе я проблему решил проще - с помощью команды cut.
Но для развития интересно посмотреть и на sed/awk


"как sed или awk отрезать символы в поле"
Отправлено temny , 12-Май-04 11:01 
>>echo 10:25:47.123456 | sed -e s/\\.[0-9]\\{6\\}//
>>echo 10:25:47.123456 | awk '{split($1,a,"."); print a[1] }'
>
>А как целиком файл скормить?
>Поле в файле второе, поля разделены пробелом.
>В принципе я проблему решил проще - с помощью команды cut.
>Но для развития интересно посмотреть и на sed/awk

В случае, если в других полях отсутствуют записи типа "точка-шесть цифр", то так:
cat file| sed -e s/\\.[0-9]\\{6\\}//

С авком в общем случае получается сложнее, но, если записи "точка-шесть цифр" встречаются в других полях, то это более простое решение, т.к. работаем только с одним полем.
Допустим $2 - номер поля (второе), всего полей три
cat file|awk '{split($2,a,"."); printf "%s %s %s\n",$1,a[1],$3}'


"как sed или awk отрезать символы в поле"
Отправлено LinuxAdmin , 12-Май-04 11:08 
>>>echo 10:25:47.123456 | sed -e s/\\.[0-9]\\{6\\}//
>>>echo 10:25:47.123456 | awk '{split($1,a,"."); print a[1] }'
>>
>>А как целиком файл скормить?
>>Поле в файле второе, поля разделены пробелом.
>>В принципе я проблему решил проще - с помощью команды cut.
>>Но для развития интересно посмотреть и на sed/awk
>
>В случае, если в других полях отсутствуют записи типа "точка-шесть цифер", то
>так:
>cat file| sed -e s/\\.[0-9]\\{6\\}//
>
>С авком в общем случае получается сложнее, но, если записи "точка-шесть цифер"
>встречаются в других полях, то это более простое решение.
>Допустим $2 - номер поля (второе), всего полей три
>cat file|awk '{split($2,a,"."); printf "%s %s %s\n",$1,a[1],$3}'

Это все классно, но если количество полей неизвестно и в любом из них может встречаться точка?


"как sed или awk отрезать символы в поле"
Отправлено temny , 12-Май-04 11:24 
>Это все классно, но если количество полей неизвестно и в любом из
>них может встречаться точка?
Sed из предыдущего ответа так и работает
cat file | sed -e s/\\.[0-9]\\{6\\}//


Кол-во полей - любое.
Точка - в любом месте в любом кол-ве.
Убиваем первую попавшуюся запись "точка-шесть цифр" в каждой строке.

cat file | awk '{split($0,a,"\\.[0-9][0-9][0-9][0-9][0-9][0-9]"); printf "%s%s\n",a[1],a[2]}'


"как sed или awk отрезать символы в поле"
Отправлено Linuxadmin , 12-Май-04 12:14 
>>Это все классно, но если количество полей неизвестно и в любом из
>>них может встречаться точка?
>Sed из предыдущего ответа так и работает
>cat file | sed -e s/\\.[0-9]\\{6\\}//
>
>
>Кол-во полей - любое.
>Точка - в любом месте в любом кол-ве.
>Убиваем первую попавшуюся запись "точка-шесть цифр" в каждой строке.
>
>cat file | awk '{split($0,a,"\\.[0-9][0-9][0-9][0-9][0-9][0-9]"); printf "%s%s\n",a[1],a[2]}'

В данном случае результатом является только время, а остальные поля лог-файла теряются.


"как sed или awk отрезать символы в поле"
Отправлено temny , 12-Май-04 12:20 
>В данном случае результатом является только время, а остальные поля лог-файла теряются.

Чем ты пользуешься - sed или awk? + Кинь кусок лога


"как sed или awk отрезать символы в поле"
Отправлено Linuxadmin , 12-Май-04 12:26 
>>В данном случае результатом является только время, а остальные поля лог-файла теряются.
>
>Чем ты пользуешься - sed или awk? + Кинь кусок лога

пользуюсь awk
Вот кусман лога:

2004-05-12 09:17:13.848405 192.168.8.118 -> 192.168.8.255 NBNS Registration NB BUH_IRA<03>
2004-05-12 09:17:14.583898 192.168.8.118 -> 192.168.8.255 NBNS Registration NB BUH_IRA<03>
2004-05-12 09:17:15.334067 192.168.8.118 -> 192.168.8.255 NBNS Registration NB BUH_IRA<03>
2004-05-12 09:17:16.084230 192.168.8.118 -> 192.168.8.255 NBNS Registration NB BUH_IRA<03>


"как sed или awk отрезать символы в поле"
Отправлено temny , 12-Май-04 12:36 
Хм... а у меня работает:
bash-2.05b$ cat 123
2004-05-12 09:17:13.848405 192.168.8.118 -> 192.168.8.255 NBNS Registration NB BUH_IRA<03>
2004-05-12 09:17:14.583898 192.168.8.118 -> 192.168.8.255 NBNS Registration NB BUH_IRA<03>
2004-05-12 09:17:15.334067 192.168.8.118 -> 192.168.8.255 NBNS Registration NB BUH_IRA<03>
2004-05-12 09:17:16.084230 192.168.8.118 -> 192.168.8.255 NBNS Registration NB BUH_IRA<03>
bash-2.05b$ cat 123| awk '{split($0,a,"\\.[0-9][0-9][0-9][0-9][0-9][0-9]"); printf "%s%s\n",a[1],a[2]}'
2004-05-12 09:17:13 192.168.8.118 -> 192.168.8.255 NBNS Registration NB BUH_IRA<03>
2004-05-12 09:17:14 192.168.8.118 -> 192.168.8.255 NBNS Registration NB BUH_IRA<03>
2004-05-12 09:17:15 192.168.8.118 -> 192.168.8.255 NBNS Registration NB BUH_IRA<03>
2004-05-12 09:17:16 192.168.8.118 -> 192.168.8.255 NBNS Registration NB BUH_IRA<03>

Исходя из твоего ника попробую предположить, что пользуешься ты линуксом. Я пользую фрибсд. Однажды мне довелось посидеть за линуксом (RH80) там я заметил, что awk + printf работает немного непривычно.
Короче вариантов три:
1. Необходим совет линуксоида, пользующего awk.
Ау!! Линуксоиды, отзовитесь 8)
2. Попробовать sed
3. Попробовать print:
cat 123| awk '{split($0,a,"\\.[0-9][0-9][0-9][0-9][0-9][0-9]"); print a[1] a[2]}'


"как sed или awk отрезать символы в поле"
Отправлено Linuxadmin , 12-Май-04 13:44 
>Хм... а у меня работает:
>bash-2.05b$ cat 123
>2004-05-12 09:17:13.848405 192.168.8.118 -> 192.168.8.255 NBNS Registration NB BUH_IRA<03>
>2004-05-12 09:17:14.583898 192.168.8.118 -> 192.168.8.255 NBNS Registration NB BUH_IRA<03>
>2004-05-12 09:17:15.334067 192.168.8.118 -> 192.168.8.255 NBNS Registration NB BUH_IRA<03>
>2004-05-12 09:17:16.084230 192.168.8.118 -> 192.168.8.255 NBNS Registration NB BUH_IRA<03>
>bash-2.05b$ cat 123| awk '{split($0,a,"\\.[0-9][0-9][0-9][0-9][0-9][0-9]"); printf "%s%s\n",a[1],a[2]}'
>2004-05-12 09:17:13 192.168.8.118 -> 192.168.8.255 NBNS Registration NB BUH_IRA<03>
>2004-05-12 09:17:14 192.168.8.118 -> 192.168.8.255 NBNS Registration NB BUH_IRA<03>
>2004-05-12 09:17:15 192.168.8.118 -> 192.168.8.255 NBNS Registration NB BUH_IRA<03>
>2004-05-12 09:17:16 192.168.8.118 -> 192.168.8.255 NBNS Registration NB BUH_IRA<03>
>
>Исходя из твоего ника попробую предположить, что пользуешься ты линуксом. Я пользую
>фрибсд. Однажды мне довелось посидеть за линуксом (RH80) там я заметил,
>что awk + printf работает немного непривычно.
>Короче вариантов три:
>1. Необходим совет линуксоида, пользующего awk.
>Ау!! Линуксоиды, отзовитесь 8)
>2. Попробовать sed
>3. Попробовать print:
>cat 123| awk '{split($0,a,"\\.[0-9][0-9][0-9][0-9][0-9][0-9]"); print a[1] a[2]}'


Все работает, огромное спасибо. Сделал все спомощью sed, удалил еще ненужные строки и отформатировал последнее поле (отделил число в "<>" в отдельное поле) - и все в одной команде !!!
Все-таки sed - это вещь !!!
Буду и дальше изучать его возможности.
С уважением, Карелин Игорь


"как sed или awk отрезать символы в поле"
Отправлено Linuxadmin , 12-Май-04 12:30 
>>>Это все классно, но если количество полей неизвестно и в любом из
>>>них может встречаться точка?
>>Sed из предыдущего ответа так и работает
>>cat file | sed -e s/\\.[0-9]\\{6\\}//
>>
>>
>>Кол-во полей - любое.
>>Точка - в любом месте в любом кол-ве.
>>Убиваем первую попавшуюся запись "точка-шесть цифр" в каждой строке.
>>
>>cat file | awk '{split($0,a,"\\.[0-9][0-9][0-9][0-9][0-9][0-9]"); printf "%s%s\n",a[1],a[2]}'
>
>В данном случае результатом является только время, а остальные поля лог-файла теряются.
>
Прошу прошения - ошибся с синтаксисом - вместо $0 поставил $2