Imprime uma faixa específica de linhas entre duas partidas começando com uma linha específica após a primeira partida

0

Como posso imprimir todos os dados entre duas correspondências, olhando de uma linha específica após a primeira partida. Por exemplo, digamos que eu tenha dois padrões Linux e Unix e há entradas entre essas duas palavras Eu gostaria de imprimir dados da linha específica após a palavra Linux , no exemplo abaixo da linha # 6 depois do Linux, até a palavra Unix :

Linux
12
32
34
556
676
77
85434
rdb
232323
232435656
Unix
98736
4345
4546456
456

resultado esperado:

85434
rdb
232323
232435656

Como posso fazer isso usando awk, sed e grep?

    
por don_crissti 28.09.2018 / 13:04

4 respostas

1

Tente isso,

awk '/^Linux$/{flag=1;next}/^Unix$/{flag=0}flag' file | tail -n +7

Ou sem tail :

awk '/^Linux$/{flag=1;n=NR;next}/^Unix$/{flag=0};flag&&NR>(n+6);' file

Explicação:

  • Pesquise o padrão ^Linux$ e, se encontrado, defina flag para 1 (verdadeiro) e mova-se diretamente para next line.
  • Continue até o padrão ^Unix$ ser encontrado e defina flag como 0 (false)
  • O flag no final é uma notação específica do awk. Se flag for verdadeiro, imprima a linha, senão não faça nada.
  • flag é apenas um nome de variável e pode ser qualquer coisa, por ex. f ou printthisline .

Usando o Gnu sed :

sed '/^Linux$/,/^Unix$/{//!b};d' file | tail -n +7
    
por 28.09.2018 / 13:13
3

Sempre que você vir um endereçamento relativo, deverá alcançar ed .

echo '/Linux/+7,/Unix/-1p' | ed -s input_file.txt -

Ou como heredoc:

ed -s input_file.txt - <<\EOF
/Linux/+7,/Unix/-1p
EOF
    
por 28.09.2018 / 13:59
1

Eu escreveria um dos

sed -n '/Linux/,/Unix/p' file | sed '1,7d;$d'
# or
awk '/Linux/ {nr = NR} /Unix/ {exit} nr && NR > nr+6' file
    
por 28.09.2018 / 16:12
0

se você pesquisar com grep , poderá fazer isso:

  • grep -A 5 "string used to search" <path-to-file(s)> mostrará as 5 linhas após a string correspondente
  • grep -B 5 "string used to search" <path-to-file(s)> mostrará as 5 linhas antes da string correspondente
  • grep -C 5 "string used to search" <path-to-file(s)> mostrará as 5 linhas depois e antes da string correspondente (C significa contexto)

para o seu exemplo, seria: grep -A 2 -B 1 "rdb" <path-to-file(s)>

    
por 28.09.2018 / 13:12