如何在 bash 中过滤掉某些输出

如何在 bash 中过滤掉某些输出

我有一个跟踪 AWS CloudWatch 日志的流程。它运行良好,只是每行前面都添加了 CloudWatch 组和容器 ID。例如:

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

有没有办法将我使用的日志命令与某种类型的过滤器一起传输,以便仅显示之后的行信息[PROD] -

答案1

您可以尝试使用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手册页以了解使用此命令可以执行的更多操作。

答案2

您可以尝试使用 awk。如果所有行都以 4 个字段开头,则

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

但您可能需要明确刷新输出

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

这基本上会使前 4 个字段为空。请注意,如果您随后只想打印某些字段,则第一个字段仍为 $5,但我想如果您想这样做,您首先就不需要使这些字段为空。

如果字段数量可变,并且它们总是以 结尾,[PROD] -那么您可以使用 sed

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

它基本上将从行首到行末的所有内容替换-为 null //

相关内容