2013-07-30 3 views
2

Я пытаюсь выяснить, как фильтровать дреды журналов героику, используя awk, sed или какой-либо другой инструмент. Как вы можете видеть примеры ниже, команда фильтрует строки с grep, относящимися только к router. Но я не мог понять, как отфильтровать остальные.Как анализировать/фильтровать строку журнала с awk или sed

heroku logs -t | grep router | ???

2013-07-20T20: 44: 40,855998 + 00: 00 Heroku [маршрутизатор]: при = Информация = метод GET путь =/oauth2/обратного вызова ошибки = ACCESS_DENIED хост = app.herokuapp.com FWD =» 123.234.456.78 "dyno = web.5 connect = 1ms service = 55ms status = 302 bytes = 5

2013-07-20T20: 44: 40.855998 + 00: 00 heroku [router]: at = info method = GET path =/oauth2/callback/succesuser =% 7B% 22user% 3Aexample% 40example.com% 22% 2C% 22force% 22% 3Afalse% 7D host = app.herokuapp.com fwd = "123.234.456.78" dyno = web.5 connect = 1 мс обслуживание = 312 мс статус = 302 байта = 5

Вопрос 1) Есть часть, которая дает подробную информацию о времени обслуживания в строках журнала: (service=55ms и service=312ms из примеров) Предположим, я хочу видеть только те, у которых время обслуживания более 300 мс. Как я могу это достичь?

Дополнительный вопрос) Есть ли шанс, что я могу форматировать эти строки через запятую, как это: timestamp,path,service

Пример выходов для дополнительного вопроса:

2013-07-20 20:44 : 40,/oauth2/callback? Error = access_denied, 55`

2013-07-20 20: 44: 40,/oauth2/callback/succesuser =% 7B% 22user% 3Aexample% 40example.com% 22% 2C % 22force% 22% 3Afalse% 7D, 312`

ответ

1

Использование awk. Поместите это в файле awk0:

 
BEGIN  {OFS = ","} 

      {split($10,arr,"\="); time = arr[2] + 0} 

time > 300 {print $1, $5, time} 

Тогда это должно работать:

heroku logs -t | grep router | awk -f awk0 

Удачи!

1

Смотрите, если это СЭД выражение любого использования:

sed '/[3-9][0-9][0-9][m][s]/!d' 
sed '/[3-9][0-9][0-9][m][s]/!d 

Вот пример:

printf '301ms\n300ms\n302ms\n200ms\n40ms' | sed '/[3-9][0-9][0-9][m][s]/!d' 

=> 301ms 
=> 300ms 
=> 302ms 

Чтобы получить только те строки, с дополнительной чем 300мс, используйте вместо этого:

sed '/[3-9][0-9][1-9]/!d' 

Другой пример:

printf '301ms\n300ms\n302ms\n200ms\n40ms' | sed '/[3-9][0-9][1-9][m][s]/!d' 

=> 301ms 
=> 302ms 

Причина выше - это /[3-9][0-9][1-9]/!d --also отфильтровывает число меньше, чем 300, из-за ! заросший тростником штуковина - рассказывает СЭД, чтобы удалить все строки, которые не соответствуют шаблону [3-9][0-9][1-9][m][s] ,

+0

@shelter, Хорошо, я отредактирую свое сообщение. –

+0

отлично, спасибо за демо. Это помогает уточнить! Всем удачи. – shellter

+1

Я думаю, что отфильтровать от 100 до 300. Если время обслуживания меньше 100 мс, то они все еще не отфильтрованы. – pars

Смежные вопросы