如何在bash中过滤(输出)某些输出

我有一个跟踪AWS CloudWatch日志的进程。 除了CloudWatch组和容器ID预先占用每一行之外,它工作得很好。 例如:

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

有没有一种方法来pipe我的日志命令我用一些types的filter,只显示行后信息[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() }' 

这基本上是无效的前四个领域。 请注意,如果您想打印某些字段,则第一个字段仍然是$ 5,但是如果您想这样做,则不需要首先将字段置空。

如果有可变数量的字段,并且总是以[PROD] -结束,那么你可以使用sed

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

它基本上取代了从行首开始的所有内容。