如何从shell中的警告消息中提取子字符串

时间:2016-12-16 07:31:27

标签: shell makefile

在我的makefile中,我调用了一个perl脚本,该脚本将返回包含文件路径,文件名,行号和错误消息的消息。我只需要文件路径和文件名。我的脚本将此消息打印到stdout,以便它自动显示在控制台中。

在我的makefile中,如何获取文件路径和文件名?我愿意使用grep,sed或tee或者最适合使用它们。

我的字符串是这样的:

Warning: <filepath>/<filename>: <line number> <some message>

例如:

Warning temp/output/dir/report.txt: 545 problem with parsing blah blah blah.

所以,我需要得到&#34; temp / output / dir / report.txt&#34;仅部分。最好的方法是什么?

1 个答案:

答案 0 :(得分:3)

最简单的方法是使用shell的位置参数和参数扩展。即:

$ set -- $(echo Warning: temp/output/dir/report.txt: 545 problem ...)
echo $2
temp/output/dir/report.txt:
$ echo ${2%:}       # Remove colon at the right
temp/output/dir/report.txt

这完全是POSIXy,并不依赖于任何基础。在您的情况下,您将使用

$ set -- $(script); echo ${2%:}

或者可能

$ set -- $(script 2>&1); echo ${2%:}

如果要提取的消息转到stderr而不是stdout。所有这些都假定消息是第一行。如果这个假设是假的,grep为'Warning:'字符串,它应该可以工作。