Como obter uma substring baseada no índice de outra string

1

Eu preciso extrair o valor inteiro de alguns arquivos de log. O valor inteiro sempre aparece após uma subcadeia return code . Mas pode ou não ter material adicional após essa subseqüência. Abaixo estão dois exemplos de entradas:

Job with id 0 ended with status COMPLETED, return code 16, in 1 minute 12 seconds 
Job with id 0 COMPLETED with return code 255

Então, aqui eu quero 16 no primeiro caso e 255 no segundo caso.

Minha abordagem inicial foi usar o awk - mas a coluna na qual o valor requerido ocorre não é consistente; então falhou.

Como posso conseguir isso de maneira confiável?

    
por Bajal 17.03.2016 / 18:10

3 respostas

2

Use a expansão de parâmetros:

#! /bin/bash

strings=('Job with id 0 ended with status COMPLETED, return code 16, in 1 minute 12 seconds'
         'Job with id 0 COMPLETED with return code 255'
        )

for string in "${strings[@]}" ; do
    code=${string#*return code }
    code=${code%%[!0-9]*}
    echo $code
done

# remove o padrão da esquerda, % da direita.

    
por 17.03.2016 / 18:20
2

Usar perl uma solução usando regexp pode ser:

perl -ne 'print "$2\n" if m/(code )(\d*)/' a.txt

Isso imprime os números 16 e 255 para stdout, cada um em uma linha separada ( \n ). Aqui a.txt contém as duas linhas

Job with id 0 ended with status COMPLETED, return code 16, in 1 minute 12 seconds
Job with id 0 COMPLETED with return code 255
    
por 17.03.2016 / 18:27
0

Aqui está uma versão sed :

sed -e 's/.*return code \([0-9]\+\).*//' logfile.txt

Remove tudo da linha, exceto os dígitos imediatamente após return code .

ou, usando regexps estendidos com o GNU sed:

sed -r -e 's/.*return code ([0-9]+).*//' logfile.txt 

OBSERVAÇÃO: algumas versões de sed usam -E em vez de -r para ativar expressões regulares estendidas.

Observe também que esses scripts sed irão imprimir inalteradas quaisquer linhas que não correspondam à expressão regular. Se não for isso que você deseja, use a opção sed -n e o comando p para imprimir apenas as linhas correspondentes, por exemplo:

sed -n -r -e 's/.*return code ([0-9]+).*//p' logfile.txt 
    
por 18.03.2016 / 00:32