如何从 bash 中的行中找到字符串?

how to find the string from the line in bash?

我有如下字符串,

May 29 01:30:15 apps1 docker/[a:vjwdrze2e3qxrf5eck4s3yv:a][u:jack:u][5425]: 05:30:15.693 INFO  [mockAppThread:21] app.js - API Mock App Server started successfully on 0.0.0.0 with port 7001.

作为输出,我只需要时间戳和错误消息。

May 29 01:30:15 API Mock App Server started successfully on 0.0.0.0 with port 7001.

我可以通过 awk 命令获取时间戳,如下所示。

awk '{print ,,}'

我可以得到如下消息,

cut -d "-" -f2

我怎样才能在一条命令中同时获得这两者?有什么简单的获取方式吗?

关注 awk 可能会对您有所帮助。

awk '{sub(/ apps1.*app\.js/,"")} 1'  Input_file

解法二:

awk -F" app.js - " '{sub(/ apps1.*/,"",);print ,}'   Input_file

解决方案 3: 根据 Subeh 在评论中的建议,现在也添加 1 个解决方案。

awk -F'apps1|app.js -' '{ print   }' Input_file

您还可以使用 perlsed 来操作您的文件:

perl -pe 's/(?<=.{16}).*(?=-)//g' file

输入:

$ cat file 
May 28 04:28:15 apps1 docker/[a:vjwdrze2e3qxrf5eck4s3yv:a][u:jack:u][5425]: 05:30:15.693 INFO  [mockAppThread:21] app.js - TEST MESSAGE 3 
May 29 01:30:15 apps1 docker/[a:vjwdrze2e3qxrf5eck4s3yv:a][u:jack:u][5425]: 05:30:15.693 INFO  [mockAppThread:21] app.js - API Mock App Server started successfully on 0.1.0.0 with port 7001.
May 30 11:30:15 apps1 docker/[a:vjwdrze2e3qxrf5eck4s3yv:a][u:jack:u][5425]: 05:30:15.693 INFO  [mockAppThread:21] app.js - TEST MESSAGE 2 

输出:

$ perl -pe 's/(?<=.{16}).*(?=-)//g' file                                                                                                                                                                                                                        
May 28 04:28:15 - TEST MESSAGE 3 
May 29 01:30:15 - API Mock App Server started successfully on 0.1.0.0 with port 7001.
May 30 11:30:15 - TEST MESSAGE 2 

说明:

perl 命令将删除从第 17 个位置开始直到到达 - 的字符串。

取决于循环结构(关键字)。一个 sed 解决方案

sed 's/\(:[0-9]\{2\}\).*\(- API\)/ /' YourFile