I have a process that tails our AWS CloudWatch logs. It works great, except for the fact that every line is prepended by the CloudWatch group and container ID. For example:
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\] -//'
, который в основном заменяет все от начала строки до -
на ноль //
.