在匹配模式之前 grep 查找单词

在匹配模式之前 grep 查找单词

我有以下输出。我想提取文本之前的数字。例如,我 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 扩展(标志)来解决-P3从获取TrainIdentifyTechnicalError

$ echo "1612 TrainIdentifyBusinessError 252 TrainIdentifySuccess 23 TrainIdentifyTechnicalError" | grep -Po "[[:digit:]]+ *(?=TrainIdentifyTechnicalError)"
23 

要从1612TrainIdentifyBusinessError

$ echo "1612 TrainIdentifyBusinessError 252 TrainIdentifySuccess 23 TrainIdentifyTechnicalError" | grep -Po "[[:digit:]]+ *(?=TrainIdentifyBusinessError)"
1612 

相关内容