我有以下输出。我想提取文本之前的数字。例如,我 grep forTrainIdentifyBusinessError
并希望1612
显示出来。我 grepTrainIdentifyTechnicalError
并希望3
显示出来。
1612 TrainIdentifyBusinessError 252 TrainIdentifySuccess 3 TrainIdentifyTechnicalError
答案1
你可以使用sed
......例如
$ sed -nr 's/.*( |^)([0-9]+) TrainIdentifyBusinessError.*/\2/p' file
1612
或者
$ sed -nr 's/.*( |^)([0-9]+) TrainIdentifySuccess.*/\2/p'
252
或者
$ sed -nr 's/.*( |^)([0-9]+) TrainIdentifyTechnicalError.*/\2/p'
3
-n
在我们要求之前不要打印任何内容-r
使用ERE.*
线路上任意数量的任意字符( |^)
空格或行首([0-9]+)
一位或多位数字以及(save this)
\2
向后引用第二个(saved pattern)
p
打印编辑后的行
事后想...如果您需要定期执行此操作,您可以创建一个 shell 函数(添加到您的 shell~/.*rc
文件,例如,~/.bashrc
如果您使用 bash),例如:
getnum() { sed -nr 's/.*( |^)([0-9]+) TrainIdentify'"$1"'.*/\2/p' "$2" ; }
使用示例(在命令行上指定字段和文件名 - 如果文件始终是同一个文件,您可以将其完整路径放在函数内而不是"$2"
):
$ getnum BusinessError file
1612
$ getnum TechnicalError file
3
$ getnum Success file
252
答案2
grep
这可以使用 Perl 扩展(标志)来解决-P
。3
从获取TrainIdentifyTechnicalError
:
$ echo "1612 TrainIdentifyBusinessError 252 TrainIdentifySuccess 23 TrainIdentifyTechnicalError" | grep -Po "[[:digit:]]+ *(?=TrainIdentifyTechnicalError)"
23
要从1612
TrainIdentifyBusinessError
$ echo "1612 TrainIdentifyBusinessError 252 TrainIdentifySuccess 23 TrainIdentifyTechnicalError" | grep -Po "[[:digit:]]+ *(?=TrainIdentifyBusinessError)"
1612