LINUX.ORG.RU

вывод двух разных значений из строки при помощи grep/sed/awk

 , ,


0

0

Всем привет, у меня есть строка вида:

value - - [19/Oct/2014:09:48:39 -0400] «sopla noski ololoev» 400 ggg "-" "-"

Хочу вывести отдельно дату, время и не 404, делаю так: cat file | grep -v '" 404' | awk '{print $4,$9}' | sed 's/:/\ /' | cut -c 2-

У меня выводится: 19/Oct/2014 09:48:39 400

Но проблема в том, что 400 не всегда находится на 9-ом месте, поэтом иногда awk срабатывает не корректно. Подскажите, как мне сделать, чтобы оно находило строчку, где есть любое значение отличное от '" 404' и выводило в таком формате: 19/Oct/2014 09:48:39 400

?

;-)

$ cat >file
value - - [19/Oct/2014:09:48:39 -0400] «sopla noski ololoev» 404 ggg "-" "-"
$ awk -F'[\\[: ]+' '/404/ { printf "%s %s:%s:%s 404\n", $4, $5, $6, $7 }' file
19/Oct/2014 09:48:39 404
unterwulf
()
Последнее исправление: unterwulf (всего исправлений: 1)
Ответ на: комментарий от YAR

И да, если у тебя надо лишь вывести строки, где код 404 - зачем вообще его выгрепывать? Пиши дату и 404.

YAR ★★★★★
()
Ответ на: комментарий от YAR

да, упрощая задачу я всех запутал.

Должно искать все строки не содержащие 404, а это значение может сдвигать с точки зрения awk на 1 или 2 позиции влево (просто меньше слов будет слева).

т.е. такой запрос у меня: cat file | grep -v '" 404' | awk '{print $4,$9}' | sed 's/:/\ /' | cut -c 2-

KraT_by
() автор топика
Ответ на: комментарий от sdio

после 404 модет быть не только 4 слова, а хоть 10.

Я 404 ищу по такому способу: ковычки_пробел_404 - '" 404'. Это 100% способ найти его, но оно может быть расположено в разных местах

KraT_by
() автор топика
Ответ на: комментарий от KraT_by

Какая разница тогда, где оно расположено, если ты отсеял все такие строки по выражению, а не по месту?

YAR ★★★★★
()
Ответ на: комментарий от KraT_by

Т.е. надо найти поле по шаблону: кавычки пробел три цифры
если эти три цифры не 404, то вывести дату и эти цифры

Верно?

sdio ★★★★★
()
Последнее исправление: sdio (всего исправлений: 1)
Ответ на: комментарий от YAR

Я отсеял лишние строки, чтобы у меня остались строки только содержащие любую ошибку кроме 404.

Теперь надо выдрать дату, время и номер ошибки. Дата и время всегда с точки зрения awk находится на 4ой позиции, а вот номер ошибки может изменять своё местоположение в строке. И в строке так же могут быть 3х значные цифры, которые мне не нужны. Т.к. нужный мне номер ошибки всегда идёт после " (ковычки пробел).

Если бы в awk вызвать значение не через $9, а как-нибудь awk '{print $4,(grep -o '" [0-9]{3})}', но хз как это сделать...

KraT_by
() автор топика
Ответ на: комментарий от KraT_by
sed '/" 404/!s/^.*\[\([^]]*\)\].*" \([0-9][0-9][0-9]\).*$/\1 \2/'

Не проверял, но смысл: для строк без " 404 выделить \(datе\) и три цифры \([0-9][0-9]0-9]\) после кавычки с пробелом и их подставить вместо всей строки \1 \2

sdio ★★★★★
()
Последнее исправление: sdio (всего исправлений: 3)
Ответ на: комментарий от sdio

Спасибо!

Вот так выводит то что надо: sed '/" 200/!s/^.*\[\([^]]*\)\].*" \([0-9]\{3\}\).*$/\1 \2/' | awk '{print $1,$3}' | sed 's/:/\ /'

KraT_by
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.