Eu tenho um arquivo chamado test.out com as linhas abaixo em:
-rw-rw---- 1 informix informix 9117025 Jan 21 05:22 shop4_0_Log0000331875.Z
-rw-rw---- 1 informix informix 8897981 Jan 21 05:24 shop4_0_Log0000331876.Z
-rw-rw---- 1 informix informix 9325351 Jan 21 05:31 shop4_0_Log0000331877.Z
-rw-rw---- 1 informix informix 9645109 Jan 21 05:34 shop4_0_Log0000331878.Z
-rw-rw---- 1 informix informix 9950581 Jan 21 05:40 shop4_0_Log0000331879.Z
-rw-rw---- 1 informix informix 10655940 Jan 21 05:59 shop4_0_Log0000331880.Z
-rw-rw---- 1 informix informix 10832325 Jan 21 06:39 shop4_0_Log0000331881.Z
-rw-rw---- 1 informix informix 8521443 Jan 21 07:42 shop4_0_Log0000331882.Z
-rw-rw---- 1 informix informix 10283566 Jan 21 08:02 shop4_0_Log0000331883.Z
-rw-rw---- 1 informix informix 10633957 Jan 21 08:51 shop4_0_Log0000331884.Z
Eu quero imprimir todas as linhas acima do parâmetro grep value 331881:
Meu resultado desejado deve ser como abaixo:
-rw-rw---- 1 informix informix 9117025 Jan 21 05:22 shop4_0_Log0000331875.Z
-rw-rw---- 1 informix informix 8897981 Jan 21 05:24 shop4_0_Log0000331876.Z
-rw-rw---- 1 informix informix 9325351 Jan 21 05:31 shop4_0_Log0000331877.Z
-rw-rw---- 1 informix informix 9645109 Jan 21 05:34 shop4_0_Log0000331878.Z
-rw-rw---- 1 informix informix 9950581 Jan 21 05:40 shop4_0_Log0000331879.Z
-rw-rw---- 1 informix informix 10655940 Jan 21 05:59 shop4_0_Log0000331880.Z
Usando o comando abaixo, posso especificar quantas linhas acima imprimir:
grep -n 331881 test.out | cut -d':' -f1 | xargs -n1 -I % awk "NR<=%+0 && NR>=%-1" test.out | sed '$d'
O comando acima imprimirá apenas a quantidade especificada de linhas, neste caso 1 linha, mas quero alterar o acima para imprimir tudo acima da linha grepped. Estou lutando para encontrar uma solução para o meu problema ou uma maneira mais fácil.
Supondo que você esteja localizado no diretório que contém os arquivos listados, usando
zsh
:O
<331882->
é umzsh
glob específico que corresponde a inteiros que são 331882 ou maiores.Com algum outro shell:
Aqui, fazemos um loop sobre os nomes que começam
shop4_0_Log
e terminam com.Z
. Para cada um desses nomes, escolhemos a parte inteira do nome do arquivo e, se for 331882 ou mais, chamamosls -ld
o nome.Se os zeros à esquerda estiverem fazendo com que o shell interprete alguns dos números como octais (isso não acontece em meus testes), use
10#$number
no teste para forçar o número a ser interpretado como um inteiro decimal (isso é suportado porksh
andbash
e alguns outras conchas).Nenhuma dessas duas variações depende da presença de um arquivo de texto que contém alguma
ls
saída.Relacionado:
Eu acho que você pode usar o awk diretamente:
Isso imprimirá todas as linhas, mas para uma correspondência de linha
331881
, saia.Outra boa ferramenta seria
sed
:Tente remover a
and
condição, remova o seguinte código do seu forro:resultado