Use o comando sed para procurar o arquivo de texto pelas entradas 10000 e abaixo

3

Estou tentando usar o comando sed para pesquisar um arquivo em todas as entradas de 10000 ou menos, mas acho que essa string de pesquisa sed incompleta pode ser para entradas 10000 ou mais:

sed -n "/[0-9][0-9][0-9][0-9][0-9]/ q" logfile
    
por user70573 15.06.2014 / 04:23

4 respostas

4

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 com esta aparência:

$ head -5 logfile 
9900
9901
9902
9903
9904

$ tail -5 logfile 
10046
10047
10048
10049
10050

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

Agora, quando executarmos o comando sed acima:

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

Recebemos tudo até 10000 e nada mais.

Como funciona

O sed acima trabalha localizando linhas que começam com um intervalo de dígitos, 0-9, com comprimento entre 1 até 4. A notação para sed , "/^[0-9]\{1,4\}[^0-9] executa essa parte. A notação [^0-9] no final diz caracteres que não são 0-9. Isso interrompe sed de substrings correspondentes em números maiores.

O \|10000 corresponde a 10000, já que é um padrão único em comparação com o restante das strings. O trailing p informa sed para imprimir os resultados.

Usando o grep como alternativa

O uso de sed não é realmente a ferramenta certa para pesquisar. 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 texto acima encontrará todas as linhas que contêm uma cadeia de dígitos que são 10000 ou inferiores. O \b denota uma borda antes ou depois da string.

    
por 15.06.2014 / 05:36
2

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

perl -nE 'say for grep { $_ <= 10_000 } /([0-9]+)/g' your_file
    
por 15.06.2014 / 07:49
1
sed '/[0-9]/!d;/10000/q' <log.file

Contanto que as entradas estejam em ordem seqüencial, você só precisará especificar que a linha contenha um número ! else d elete it. E quando chegar a linha 10000 you q uit. Mas 10000 ainda é impresso - será a última linha impressa.

Isso também seria muito melhor se você pudesse ancorar - talvez até o começo da linha como:

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

O que seria uma coisa mais segura - e mais rápida.

Mas, como aponta slm, grep seria mais rápido.

    
por 15.06.2014 / 07:57
0
sed -nr "/0|[1-9][0-9]?[0-9]?[0-9]?[0-9]?/p" logfile
    
por 15.06.2014 / 04:33

Tags