Перейти к содержанию

awk и разделение полей


Рекомендуемые сообщения

Здравствуйте

Имеем вывод tcpdump в котором все поля идут через пробелы, кроме второго - оно отделено от третьего точкой

tcpdump -i eth0 | awk '{print $1, $2, $3}'

получаем второе и третье поле во втором

tcpdump -i eth0 |awk -F . '{print $1, $2, $3}'

получаем что все поля в строке разделяются точками а нам надо только одно поле выделить

tcpdump -i eth0 | awk $2~/.$/ '{print $1, $2, $3}'

не работает хотя в доке написано что есть выражение "$2~/a$/" - a последний символ 2-го поля

как мне отделить два поля разделенные точкой?

Ссылка на комментарий
Поделиться на другие сайты

если мы прогоним два прохода то второй проход будет касаться только результатов работы первого прохода а нам надо прочитать ВСЕ поля строки чтобы потом все поля поместить в базу данных

Необходимо применить правило разделения полей точкой только ко второму полю во всей строке и на выходе получит всю строку по полям

Ссылка на комментарий
Поделиться на другие сайты

Можно сначала обработать при помощи cut, разделив всю строку по точке и вывести результат используя пробелы, а потом обработать с помощью awk(или того же cut; это уже по желанию).

Примерно так:

Цитата:

$ echo "field1 field2.field3 field4" | cut -d . --fields=1,2 --output-delimiter=' ' | awk '{print $1, $2}'

field1 field2

$

Ссылка на комментарий
Поделиться на другие сайты

Алексей писал(а) Fri, 17 October 2008 13:12

если мы прогоним два прохода то второй проход будет касаться только результатов работы первого прохода а нам надо прочитать ВСЕ поля строки чтобы потом все поля поместить в базу данных

Цитата:

мне надо одно поле разобрать а не всю строку

Может Вы определитесь все-таки, ОДНО поле Вам нужно или ВСЕ? Если все, то:

xxx ~ # echo '123 456.789 000 13' | awk '{print $1, $2, $4}' | awk -F. '{print $1, $2}'

123 456 789 13

Печатаем сначала нужные поля, выделенные по пробелу (среди которых есть и второе, содержащее точку). Затем печатаем из них первое - т.е. всю предыдущую строку ДО точки и второе - т.е. строку ПОСЛЕ нее.

В конце концов, дайте образец строки и того, что из нее нужно получить.

Ссылка на комментарий
Поделиться на другие сайты

Цитата:

В конце концов, дайте образец строки и того, что из нее нужно получить.

Это будет лучший вариант. Действительно, гадать сложно.

Ссылка на комментарий
Поделиться на другие сайты

echo a b.c | awk 'split($2, i, ".") {print $1, i[1], i[2]}'

теперь помогите мне с файлами

я запускаю из крона строку типа

tcpdump ...| awk... > "some_file"

которая собирает отфильтрованную статистику в файл

т к tcpdump выдает много данных наш файлик растет с приличной скоростью и потому нам надо реализовать смену записи в файл что-то вроде

killall tcpdump

if("file_1") {

tcpdump ... | awk ... > "file_2"

mysql "load data local infile file_1 into table my_table"

rm -f file_1}

else

tcpdump ... | awk ... > "file_1"

mysql "load data local infile file_2 into table my_table"

rm -f file_2}

как мне убить tcpdump?

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...