如何从 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
您还可以使用 perl
或 sed
来操作您的文件:
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
我有如下字符串,
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
您还可以使用 perl
或 sed
来操作您的文件:
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