
Estou tentando usar o sed
comando para pesquisar em um arquivo todas as entradas 10.000 e abaixo, mas acho que essa sed
string 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, logfile
assim:
$ seq 9900 10050 | sed 's/$/ /' > logfile
Isso resulta no arquivo logfile
parecido 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 sed
comando 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 sed
funciona 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 sed
a correspondência de substrings em números mais longos.
Corresponde a \|10000
10000, pois é um padrão único em comparação com o restante das strings até ele. O final p
diz sed
para imprimir os resultados.
Usando grep como alternativa
O uso de sed
não é realmente a ferramenta certa para pesquisa. Provavelmente é melhor usar grep
para 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 \b
denota 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, d
exclua-o. E quando você chegar na fila, 10000
você q
sai. 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, grep
seria mais rápido.
Responder4
sed -nr "/0|[1-9][0-9]?[0-9]?[0-9]?[0-9]?/p" logfile