Para grep por uma palavra antes do padrão correspondente

0

Eu tenho a saída abaixo. Eu quero extrair o número antes do texto. Como, por exemplo, eu faço grep para TrainIdentifyBusinessError e quero que 1612 seja exibido. Eu grep para TrainIdentifyTechnicalError e quero que 3 seja exibido.

1612 TrainIdentifyBusinessError 252 TrainIdentifySuccess 3 TrainIdentifyTechnicalError
    
por sapna 21.12.2016 / 15:13

2 respostas

2

Isso pode ser resolvido usando a extensão Perl para grep (o -P flag). Para obter 3 de TrainIdentifyTechnicalError :

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

Para obter 1612 de TrainIdentifyBusinessError

$ echo "1612 TrainIdentifyBusinessError 252 TrainIdentifySuccess 23 TrainIdentifyTechnicalError" | grep -Po "[[:digit:]]+ *(?=TrainIdentifyBusinessError)"
1612 
    
por 21.12.2016 / 16:04
2

Você pode usar sed em vez de ... por exemplo

$ sed -nr 's/.*( |^)([0-9]+) TrainIdentifyBusinessError.*//p' file
1612

ou

$ sed -nr 's/.*( |^)([0-9]+) TrainIdentifySuccess.*//p'
252

ou

$ sed -nr 's/.*( |^)([0-9]+) TrainIdentifyTechnicalError.*//p'
3
  • -n não imprime nada até pedirmos
  • -r use ERE
  • .* qualquer número de qualquer caractere na linha
  • ( |^) space ou início da linha
  • ([0-9]+) um ou mais dígitos e (save this)
  • de volta ao segundo (saved pattern)
  • p imprime a linha editada

Afterthought ... se você precisar fazer isso regularmente, você poderia fazer uma função shell (adicionar ao arquivo ~/.*rc do seu shell, por exemplo, ~/.bashrc se você usar o bash), por exemplo:

getnum() { sed -nr 's/.*( |^)([0-9]+) TrainIdentify'"$1"'.*//p' "$2" ; }

Exemplo de uso (especifique o campo e o nome do arquivo na linha de comando - se o arquivo for sempre o mesmo arquivo, você poderá colocar o caminho completo dentro da função, em vez de "$2" ):

$ getnum BusinessError file
1612
$ getnum TechnicalError file
3
$ getnum Success file
252
    
por 21.12.2016 / 15:23