Use o comando sed para pesquisar no arquivo de texto as entradas 10000 e abaixo

Use o comando sed para pesquisar no arquivo de texto as entradas 10000 e abaixo

Estou tentando usar o sedcomando para pesquisar em um arquivo todas as entradas 10.000 e abaixo, mas acho que essa sedstring de pesquisa incompleta pode ser para entradas 10.000 e acima:

sed -n "/[0-9][0-9][0-9][0-9][0-9]/ q" logfile

Responder1

Você também pode fazer isso usando o seguinte método:

$ sed -n "/^[0-9]\{0,4\}$\|10000/p" logfile

Exemplo

Digamos que eu tenha um arquivo de amostra, logfileassim:

$ seq 9900 10050  | sed 's/$/ /' > logfile

Isso resulta no arquivo logfileparecido com este:

$ head -5 logfile 
9900
9901
9902
9903
9904

$ tail -5 logfile 
10046
10047
10048
10049
10050

Há um espaço à direita após cada uma dessas linhas graças à sed 's/$/ /'linha acima quando criamos o arquivo de exemplo.

Agora, quando executamos o sedcomando acima:

$ sed -n "/^[0-9]\{1,4\}[^0-9]\|10000/p" logfile  | tail -5
9996 
9997 
9998 
9999 
10000 

Conseguimos tudo até 10.000 e nada mais.

Como funciona

O procedimento acima sedfunciona encontrando linhas que começam com um intervalo de dígitos, de 0 a 9, variando em comprimento entre 1 e 4. A notação para sed, "/^[0-9]\{1,4\}[^0-9]executa esta parte. A notação [^0-9]no final indica caracteres que não são 0-9. Isso impede seda correspondência de substrings em números mais longos.

Corresponde a \|1000010000, pois é um padrão único em comparação com o restante das strings até ele. O final pdiz sedpara imprimir os resultados.

Usando grep como alternativa

O uso de sednão é realmente a ferramenta certa para pesquisa. Provavelmente é melhor usar greppara isso.

$ grep "\b\([0-9]\{1,4\}\|10000\)\b" logfile | head -5
9900 
9901 
9902 
9903 
9904 

$ grep "\b\([0-9]\{1,4\}\|10000\)\b" logfile | tail -5
9996 
9997 
9998 
9999 
10000 

O acima encontrará todas as linhas que contêm uma sequência de dígitos 10.000 ou menos. O \bdenota uma borda antes ou depois da string.

Responder2

Perl pode tornar isso mais fácil e legível:

perl -nE 'say for grep { $_ <= 10_000 } /([0-9]+)/g' your_file

Responder3

sed '/[0-9]/!d;/10000/q' <log.file

Contanto que as entradas estejam em ordem sequencial, você só precisa especificar que a linha contém um número, !caso contrário, dexclua-o. E quando você chegar na fila, 10000você qsai. Mas 10.000 ainda está impresso - será a última linha impressa.

Isso também seria muito melhor se você pudesse ancorá-lo - talvez no início da linha, como:

sed '/^[0-9]/!d;/^10000/q' <log.file

O que seria algo mais seguro – e mais rápido.

Mas, como aponta slm, grepseria mais rápido.

Responder4

sed -nr "/0|[1-9][0-9]?[0-9]?[0-9]?[0-9]?/p" logfile

informação relacionada