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

4

Eu tenho um arquivo de texto semelhante a este:

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

Eu quero "grep" da "linha 2A" para 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 alcançar isso?

    
por phong 30.01.2016 / 09:46

5 respostas

1

(expandido do comentário)

awk tem a capacidade de selecionar 'intervalos' de linhas que correspondam perfeitamente a essa necessidade, como descrito no manual do GNU-awk (gawk) . (Esse recurso funciona em outros awk s, mas o manual gawk é fácil de vincular.)

awk '/line 2A/,0' imprime linhas iniciando com a primeira que corresponde a line 2A e continua 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 que corresponde a line 2A e pára após uma linha que corresponde a A mas NÃO line 2A (e, portanto, não pode ser a mesma linha que a linha de início). Ele será iniciado novamente em subseqüente line 2A e assim por diante; se você quiser evitar que haja maneiras um pouco mais complicadas de fazer isso.

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

    
por 04.02.2016 / 15:54
2

I want to "grep" from "line 2A" to the end of file:

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

I want to "grep" from "line 2A" to the next line that contains "A":

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

I want to "grep" from the first line containing "A" to the next one:

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
    
por 30.01.2016 / 11:17
1

Acho que a melhor maneira é usar grep em combinação com cut e tail . Primeiro, use grep para obter a linha na qual a string desejada é ( -n para o número da linha de saída; -m 1 para parar a busca após a primeira partida):

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

Isso gera o número da linha e a string em si. Para cortar a string, usamos cut ( -f1 : output primeiro campo; -d: use ":" como delimitador):

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

Em seguida, usamos a saída desse comando como parâmetro na cauda. Normalmente, tail imprime as últimas k linhas, mas usando -n +k , obtemos a cauda para imprimir a partir da linha k em diante. O comando total é:

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

Para gerar as linhas até somestring usar head em vez de tail e -n -# em vez de -n +# . Você também pode combinar ambos para obter as linhas de uma string até outra.

    
por 30.01.2016 / 10:17
0

Por favor, tente o código abaixo -

sed -n '6,$p' infile
    
por 30.01.2016 / 10:43
0

O método sed é o caminho a seguir, mas e se você quiser manter as linhas superiores, mas não as grep?

Aqui está uma maneira:

{ head -1 file.txt ; sed 1d file.txt | grep <whatever> ;}

O que está acontecendo aqui?

Primeiro, cuspimos a linha superior (head -1 file.txt) Então, nós removemos a linha superior (sed 1d file.txt) e grep apenas isso.

A coisa toda é envolvida por {..;}, então você pode canalizar ou redirecionar o cabeçalho e o corpo grepped juntos depois. Assim:

{head -1 file.txt; sed 1d file.txt | grep;} > newfile.txt

Se você quiser pular as 10 primeiras linhas, mude para isso

{head -10 file.txt; sed 1,10d file.txt | grep;}

    
por 02.03.2018 / 16:02