Como posso usar o comando grep para extrair a linha que é a próxima linha da linha greping?

5

Eu tenho um arquivo de texto como (a parte específica do arquivo inteiro);

!        lat             long          elev (m)
!      44.5199005      11.6468000       50.4276

Eu preciso extrair a segunda linha e salvá-las em outro arquivo de texto. Os números são variáveis e "!" A sintaxe também existe várias vezes no texto. Para a primeira linha, há sempre 8 espaços entre "!" e "lat", mas este não é o caso da segunda linha. Existe algum comando disponível para permitir que eu extraia a próxima linha após grep "! lat" text

    
por deepblue_86 23.10.2015 / 09:42

3 respostas

9

Você pode usar grep -A1 'expression'

Do manual:

-A num
--after-context=num
    Print num lines of trailing context after matching lines.

No seu caso:

grep -A1 "!        lat" foo | grep -v "!        lat"

deve funcionar para extrair apenas a segunda linha.

Nota:
Você pode usar grep -P '^! {8}lat' em vez de digitar muitos . Isso é menos propenso a erros. O -P flag ativa expressões regulares no estilo perl e {8} (Há um espaço antes do '{') corresponde exatamente a 8 espaços.

    
por Wayne_Yux 23.10.2015 / 09:51
4

Você pode obter a saída desejada de uma só vez da opção grep usando -z para tratar as linhas do arquivo de entrada a serem separadas por caracteres NUL em vez de caracteres de nova linha para que caracteres de nova linha possam ser correspondidos literalmente. Você pode fazer:

grep -Pzo '!\s{8}lat[^\n]*\n\K[^\n]+' file.txt
  • -P nos permitirá usar o PCRE, -o nos obterá apenas a parte desejada

  • !\s{8}lat[^\n]*\n corresponderá à linha com lat depois de ! e 8 espaços, também corresponderá ao caractere de nova linha à direita, \K descartará essa correspondência

  • [^\n]+ corresponderá à próxima linha, ou seja, o que queremos como saída.

Aqui eu também suponho que não há espaço após lat , se deve haver pelo menos um espaço que você pode fazer:

grep -Pzo '!\s{8}lat\s+[^\n]*\n\K[^\n]+' file.txt

Exemplo:

$ cat file.txt 
!        lat             long          elev (m)
!      44.5199005      11.6468000       50.4276
!      30.5199005      2445.6468000       23.89

$ grep -Pzo '!\s{8}lat[^\n]*\n\K[^\n]+' file.txt 
!      44.5199005      11.6468000       50.4276
    
por heemayl 23.10.2015 / 11:28
1
  1. awk

    awk '/! {8}lat/ {a=1; next} a {a=0; print};' foo
    
  2. sed

    sed -n '/! \{8\}lat/{n;p}' foo
    
por A.B. 23.10.2015 / 11:00

Tags