Назад | Перейти на главную страницу

Как отфильтровать (исключить) определенный вывод в bash

У меня есть процесс, который отслеживает наши журналы AWS CloudWatch. Он отлично работает, за исключением того факта, что каждая строка предваряется группой CloudWatch и идентификатором контейнера. Например:

core-api 04a7ce3daf83aa018a92eb4a613c87354695dc8219f213697f7f786b81d4d [PROD] - INFO: GET 200 - 5ms core-api 04a7ce3daf83aa018a92eb4a613c87354695dc8219f213697f7f786b81d4d [PROD] - INFO: POST 200 - 7ms

Есть ли способ передать мою команду журналов, которую я использую с некоторым типом фильтра, чтобы отображать информацию о строке только после [PROD] -?

Вы можете попробовать использовать cut вырезать интересующие вас столбцы.

tail -f whatever | cut -d ' ' -f 3-

[PROD] - INFO: GET 200 - 5ms
[PROD] - INFO: POST 200 - 7ms

это -d устанавливает пробел в качестве разделителя полей, а -f указывает на отображение только третьего и последующих полей.

Определение полей тоже может стать более сложным. Предположим, вы действительно хотите избавиться только от этого раздражающего, бесполезного второго поля. Затем вы можете указать -f 1,3-.

core-api [PROD] - INFO: GET 200 - 5ms
core-api [PROD] - INFO: POST 200 - 7ms

Увидеть cut справочную страницу, чтобы узнать больше о том, что вы можете сделать с помощью этой команды.

Вы можете попробовать использовать awk. Если все строки предварены 4 полями, то

 ...| awk '{$1=$2=$3=$4=""; print $0}'

но вам может потребоваться явно очистить вывод

  ...| awk '{$1=$2=$3=$4=""; print $0; fflush() }'

Это в основном обнуляет первые 4 поля. Обратите внимание: если вы затем захотите напечатать только определенные поля, первое поле все равно будет стоить 5 долларов, но я думаю, что если вы захотите это сделать, вам не нужно будет сначала обнулять поля.

Если бы было переменное количество полей, и они всегда заканчивались [PROD] - тогда вы можете использовать sed

...| sed s '/^.* \[PROD\] -//'

который в основном заменяет все, от начала строки до - с нулем //.