Como Sed ou Grep numeram ao lado do texto

0

Eu tenho um arquivo como o abaixo. Quero devolver o valor à direita de info2. Em segundo lugar, eu gostaria de retornar o valor de info5 da mesma maneira.

ARQUIVO:

info1 218, info2 111, info3 415, info5 done,
    
por james 30.01.2018 / 20:43

4 respostas

2

com awk :

$ awk 'BEGIN { RS="," } $1 ~ /info[25]$/ { print $2 }' input
111
done

Definimos o separador de registro de entrada ( RS ) como vírgula e, em seguida, para cada registro em que o primeiro campo contém info seguido por dois ou cinco (e nada mais), imprima o segundo campo .

    
por 30.01.2018 / 21:21
0

Uma pequena melhora na resposta da choroba :

sed -n 's/.*info2 \([^,]*\).*//p' file
  • -n significa "não imprima nada exceto quando especificamente ordenado a fazê-lo ”. Isso é (um pouco) equivalente ao uso de !d da choroba para excluir (ignorar) linhas que não correspondem a info2 .
  • A coragem do comando é muito parecida com a choroba, exceto que captura uma seqüência de qualquer caractere, exceto vírgulas (não apenas numerais), para que possa extrair o done de info5 done, .
  • O comando termina com p (impressão), porque senão, com o -n , nada seria impresso.

Isso tem a vantagem de não é necessário especificar o rótulo infoN duas vezes. (E isso não gera resultados indesejados se uma linha contiver info20 , info21 , etc.)

    
por 31.01.2018 / 03:01
0

Uma solução em dois passos:

tr ',' '\n' <file | sed -n 's/^ *info[25] *//p'

O tr transforma o texto do exemplo em

info1 218   
 info2 111  
 info3 415  
 info5 done 

e o script sed remove as strings info2 e info5 (e qualquer espaço em branco circundante), deixando as partes desejadas do texto. As outras linhas são descartadas.

Resultado:

111
done

Isso é melhor feito com awk , como na solução do DopeGhoti .

Uma variação de awk com base na minha abordagem tr :

tr ',' '\n' <file | awk '/info[25]/ { print $2 }'
    
por 02.02.2018 / 16:53
-1

Você pode usar sed:

sed '/info2 [0-9]/!d;s/.*info2 \([0-9]*\).*//' file
  • /info2/ é um "endereço", qualquer linha contendo info2 é considerada como correspondendo ao endereço. !d significa "excluir linhas fora do endereço", portanto, apenas linhas contendo info2 serão processadas pelo próximo comando.
  • A substituição usa um grupo de captura para lembrar o número após info2 , e a linha inteira (tudo antes de info2 , info2 em si, o número e qualquer coisa após o número) é substituída pelo número. / li>

Se você precisar capturar "concluído" depois de info5 , não será possível usar [0-9]* , mas poderá substituí-lo por [^,]* , ou seja, sem vírgula.

    
por 30.01.2018 / 20:48