handler Опубликовано 16 октября, 2008 Жалоба Опубликовано 16 октября, 2008 Здравствуйте Имеем вывод 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-го поля как мне отделить два поля разделенные точкой? Цитата
Ineu Опубликовано 16 октября, 2008 Жалоба Опубликовано 16 октября, 2008 tcpdump | awk '...' | awk -F. '...' Цитата
handler Опубликовано 16 октября, 2008 Автор Жалоба Опубликовано 16 октября, 2008 мне надо одно поле разобрать а не всю строку Цитата
Ineu Опубликовано 16 октября, 2008 Жалоба Опубликовано 16 октября, 2008 Первым awk возвращаете нужное поле, вторым - разбираете его. Цитата
handler Опубликовано 17 октября, 2008 Автор Жалоба Опубликовано 17 октября, 2008 если мы прогоним два прохода то второй проход будет касаться только результатов работы первого прохода а нам надо прочитать ВСЕ поля строки чтобы потом все поля поместить в базу данных Необходимо применить правило разделения полей точкой только ко второму полю во всей строке и на выходе получит всю строку по полям Цитата
cppmm Опубликовано 17 октября, 2008 Жалоба Опубликовано 17 октября, 2008 Можно сначала обработать при помощи cut, разделив всю строку по точке и вывести результат используя пробелы, а потом обработать с помощью awk(или того же cut; это уже по желанию). Примерно так: Цитата: $ echo "field1 field2.field3 field4" | cut -d . --fields=1,2 --output-delimiter=' ' | awk '{print $1, $2}' field1 field2 $ Цитата
Ineu Опубликовано 17 октября, 2008 Жалоба Опубликовано 17 октября, 2008 Алексей писал(а) 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 Печатаем сначала нужные поля, выделенные по пробелу (среди которых есть и второе, содержащее точку). Затем печатаем из них первое - т.е. всю предыдущую строку ДО точки и второе - т.е. строку ПОСЛЕ нее. В конце концов, дайте образец строки и того, что из нее нужно получить. Цитата
cppmm Опубликовано 17 октября, 2008 Жалоба Опубликовано 17 октября, 2008 Цитата: В конце концов, дайте образец строки и того, что из нее нужно получить. Это будет лучший вариант. Действительно, гадать сложно. Цитата
handler Опубликовано 18 октября, 2008 Автор Жалоба Опубликовано 18 октября, 2008 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? Цитата
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.