Linux – “grep” de certas linhas até o final do arquivo

Linux – “grep” de certas linhas até o final do arquivo

Eu tenho um arquivo de texto semelhante a este:

line 1
line 2A
line 3
line 4A
line 5

Quero "grep" da "linha 2A" até o final do arquivo, algo assim

cat file.txt|some_grep "line 2A"

Além disso, quero "grep" da "linha 2A" para a próxima linha que contém "A", algo assim

cat file.txt| some_grep "A"

Eu quero que isso seja impresso:

line 2A
line 3
line 4A

Qual comando pode me ajudar a conseguir isso?

Responder1

(expandido do comentário)

awktem a capacidade de selecionar 'intervalos' de linhas que atendem perfeitamente a essa necessidade, comodescrito no manual GNU-awk (gawk). (Esse recurso funciona em outros awkprogramas, mas o gawkmanual é fácil de vincular.)

awk '/line 2A/,0'imprime linhas começando com a primeira que corresponde line 2Ae continuando até o final da entrada porque 0é uma condição que nunca é verdadeira.

awk '/line 2A/,/A/&&!/line 2A/'inicia a impressão com uma linha correspondente line 2Ae para após uma linha correspondente, Amas NÃO line 2A(e, portanto, não pode ser a mesma linha da linha inicial). Vai começarde novocom umsubseqüente line 2Ae assim por diante; se você quiser evitar isso, existem maneiras um pouco mais complicadas de fazer isso.

Se as linhas de parada sempre tiverem algum caractere diferente de 2antes de isso Apode ser simplificado para awk '/line 2A/,/[^2]A/'qual parada após uma linha que corresponda a qualquer caractere diferente de 2, seguido por A. Você pode querer uma variação disso, por exemplo, parar em qualquer-único- dígito-A diferente de 2A, mas não outro como WHAT; para isso a condição de parada pode ser ,/line [013-9]A/.

Responder2

Quero "grep" da "linha 2A" até o final do arquivo:

sed -n '/2A/,$p'
  • -n: suprime seda saída padrão
  • /2A/ : linhas de saída da primeira contendo "2A"
  • $: para o final do arquivo

Quero "grep" da "linha 2A" para a próxima linha que contém "A":

sed -n '/2A/,/A/p'
  • /A/ : saída até que uma linha contenha "A"

Quero "grep" da primeira linha contendo "A" para a próxima:

printf "/A\n.+1,/A/p\nq" | ed -s

$ > foo echo "line 1
line 2A
line 3
line 4A
line 5"

$ sed -n '/2A/,$p' foo
line 2A
line 3
line 4A
line 5

$ sed -n '/2A/,/A/p' foo
line 2A
line 3
line 4A

$ printf "/A\n.+1,/A/p\nq" | ed -s foo
line 2A
line 3
line 4A

Responder3

Acho que a melhor maneira é usar grepem combinação com cute tail. Primeiro, use grep para obter a linha na qual está a string desejada ( -npara gerar o número da linha; -m 1para interromper a pesquisa após a primeira correspondência):

grep -n -m 1 "somestring" filename.txt

Isso gera o número da linha e a própria string. Para cortar a string, usamos cut ( -f1: primeiro campo de saída; -d:usamos ":" como delimitador):

grep -n -m 1 "somestring" filename.txt | cut -f1 -d:

A seguir, usamos a saída deste comando como parâmetro no final. Normalmente, tail imprime as últimas k linhas, mas usando -n +k, obtemos tail para imprimir a partir da linha k. O comando total é:

tail -n +`grep -n -m 1 "somestring" filename.txt | cut -f1 -d:` filename.txt

Para gerar as linhas até somestringusar headem vez de taile -n -#em vez de -n +#. Você também pode combinar ambos para obter as linhas de uma string para outra.

Responder4

Por favor, tente o código abaixo -

sed -n '6,$p' infile

informação relacionada