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)
awk
tem a capacidade de selecionar 'intervalos' de linhas que atendem perfeitamente a essa necessidade, comodescrito no manual GNU-awk (gawk). (Esse recurso funciona em outros awk
programas, mas o gawk
manual é fácil de vincular.)
awk '/line 2A/,0'
imprime linhas começando com a primeira que corresponde line 2A
e 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 2A
e para após uma linha correspondente, A
mas NÃO line 2A
(e, portanto, não pode ser a mesma linha da linha inicial). Vai começarde novocom umsubseqüente line 2A
e 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 2
antes de isso A
pode 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
sed
a 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 grep
em combinação com cut
e tail
. Primeiro, use grep para obter a linha na qual está a string desejada ( -n
para gerar o número da linha; -m 1
para 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é 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 para outra.
Responder4
Por favor, tente o código abaixo -
sed -n '6,$p' infile