como obter dados após uma string específica para comprimento específico no linux

0

considere as linhas abaixo

842567831752rajfkglxfgk  kerigjeiofjgoe jergjerio4523789573489

genfjkgnerijio 234578934897 jgioefjgio  shfhuwehjdfu7890345289103

como faço para obter quatro dígitos após 789 nas linhas acima no linux

    
por p.srikar 01.11.2017 / 10:08

3 respostas

2

Use grep

grep -Po '(?<=789).{4}'

Explicação

  • grep -P : use grep no modo Perl
  • -o : apenas retorna a parte correspondente
  • (?<=789) : lookbehind. Isso deve vir antes da parte "correspondente".
  • .{4} : corresponde a quatro caracteres (após o lookbehind). Isso é o que será retornado.

Ou use sed

sed -r 's/.*789(.{4}).*//'

Isso pressupõe que há apenas um 789 na linha.

Explicação

  • sed -r : use o sed no modo de expressão regular estendida para melhor legibilidade.
  • s/foo/bar/ : substitua foo por bar .
  • .*789(.{4}).* : corresponde ao início da linha .* , 789 , depois quatro caracteres (.{4}) , enquanto os captura com () , depois o restante da linha .* . Isso corresponde a linha inteira no total.
  • : substitua a linha inteira pelo primeiro padrão correspondente de cima.

Ou use o awk

awk '{if (match($0,/789(.{4})/,m)) print m[1]}'

Isso pressupõe que há apenas um 789 na linha. Há provavelmente meia dúzia de maneiras de fazer isso no awk.

Explicação

  • match($0,/789(.{4})/,m) : procure na linha inteira $0 pela regex 789(.{4}) e capture os quatro caracteres após 789 .
  • print m[1] : imprima o primeiro grupo de captura.

Apenas dígitos

Se você quiser apenas pegar dígitos, pode usar algo como o seguinte:

grep -Po '(?<=789).*' | sed -r 's/^[^0-9]*([0-9])[^0-9]*([0-9])[^0-9]*([0-9])[^0-9]*([0-9]).*//'

Note que esta estratégia presume que são quatro dígitos após 789 .

Explicação

  • grep -Po '(?<=789).*' : semelhante ao acima, mas imprime todos caracteres após 789 .
  • | sed -r 's/foo/bar/' : canaliza para sed usando o modo de expressão regular estendida e substituindo foo por 'bar.
  • ^[^0-9]*([0-9])[^0-9]*([0-9])[^0-9]*([0-9])[^0-9]*([0-9]).* : corresponde ao início da linha ^ , todos os caracteres não dígitos [^0-9]* e, em seguida, captura o dígito ([0-9]) . Repita isso mais três vezes e combine o restante da linha .* .
  • : substitua a linha inteira pelos grupos de captura, ou seja, os próximos quatro dígitos.

(Alternativamente, você pode simplificar a expressão sed usando o regex não-ganancioso do perl. perl -pe 's/.*?([0-9]).*?([0-9]).*?([0-9]).*?([0-9]).*//' )

    
por 01.11.2017 / 10:15
1
$ echo "842567831752rajfkglxfgk  kerigjeiofjgoe jergjerio4523789573489" | grep -oP '789\K....'
5734
$ echo "genfjkgnerijio 234578934897 jgioefjgio  shfhuwehjdfu7890345289103" | grep -oP '789\K....'
3489
0345
    
por 01.11.2017 / 10:16
0
Solução

AWK para localizar TODOS os itens de 4 dígitos após 789 :

awk -F'789' '{ for(i=2;i<=NF;i++) printf "%s%s",(i==2?"":" "),substr($i,1,4); print ""}' file
  • -F'789' - tratando 789 como separador de campo

A saída (todos os itens encontrados por linha ):

5734
3489 0345

----------

Ou simplesmente imprima cada item em uma linha separada:

awk -F'789' '{ for(i=2;i<=NF;i++) print substr($i,1,4) }' file

A saída:

5734
3489
0345
    
por 01.11.2017 / 10:58