Imprima apenas o primeiro jogo uma vez

2

Eu tenho um snippet de código que estou usando para analisar um arquivo de log e imprimir as informações de que preciso.

for i in $(cat ~/jlog/""); do
        grep "" ~/jlog/"" |
        awk '/\([a-zA-Z0-9.]+/ {print }' 
 done;

O problema é quando eu insiro entrada, ele exibe a resposta várias vezes:

(1.3.51.0.1.1.10.10.30.48.2084865.2084839/1.2.840.113619.2.284.3.17454802.933.1401109176.280.1)
(1.3.51.0.1.1.10.10.30.48.2084865.2084839/1.2.840.113619.2.284.3.17454802.933.1401109176.283.1)
(1.3.51.0.1.1.10.10.30.48.2084865.2084839/1.2.840.113619.2.80.977011700.14346.1401109696.2)
(1.3.51.0.1.1.10.10.30.48.2084865.2084839/1.2.840.113619.2.80.977011700.14346.1401109706.51)
(1.3.51.0.1.1.10.10.30.48.2084865.2084839/1.2.840.113619.2.80.977011700.14346.1401109758.100)
(1.3.51.0.1.1.10.10.30.48.2084865.2084839/1.2.840.113619.2.80.977011700.14346.1401109773.149)
(1.3.51.0.1.1.10.10.30.48.2084865.2084839/1.2.840.113619.2.80.977011700.14346.1401109810.198)
(1.3.51.0.1.1.10.10.30.48.2084865.2084839/1.2.840.113619.2.80.977011700.14346.1401109818.247)

Existe alguma maneira que eu possa cortar isso para que eu possa ter apenas a primeira série de exibição de dados uma vez. Eu só preciso de 1.3.51.0.1.1.10.10.30.48.2084865.2084839 para imprimir uma vez.

Eu tentei mudar isso também, mas o Bash não gosta:

for i in $(cat ~/jlog/""); do
        grep "" ~/jlog/"" |
        awk '/\([a-zA-Z0-9.]+/' |
        awk -F'[(/]' ' {print , exit}'
done;

Então tentei isso:

for i in $(cat ~/jlog/""); do
        grep "" ~/jlog/"" |
        awk -F'[(/]' '/\([a-zA-Z0-9.]+/ {print , exit }'
done;
    
por ryekayo 17.06.2014 / 16:19

3 respostas

2

Tente isso,

for i in $(cat ~/jlog/""); do
        grep "" ~/jlog/"" |
        awk '/\([a-zA-Z0-9.]+/ {print ; exit}' 
done;

exit no comando awk sai depois de imprimir a primeira correspondência.

OR

Apenas canalize a saída do comando for para o comando awk abaixo,

for .... | awk -F'[(/]' '{print ;exit}'
    
por Avinash Raj 17.06.2014 / 16:23
2

Você não precisa do for loop - uma única chamada grep produzirá todas as linhas correspondentes do arquivo, então você está repetindo a mesma operação várias vezes quantas forem as linhas. no arquivo.

Tecnicamente, você não precisa dos dois awk e grep , pois ambos podem fazer correspondência textual. Se você quiser uma resposta mais específica, poste uma extração do arquivo de log e um exemplo de qual saída você deseja.

    
por steeldriver 17.06.2014 / 16:39
1

Você não explicou o que está fazendo, então vou fazer algumas suposições. Eu suponho que você está executando um script chamado foo.sh e dando a ele uma string e um nome de arquivo como argumento. Estes então se tornam e , respectivamente. Presumivelmente, você está executando com algo semelhante a

foo.sh SearchPattern LogFileName

Em qualquer caso, o loop for é i) completamente inútil, já que você não está usando a variável i criada pelo loop for i in ... . ii) muito errado, já que isso fará com que i tome o valor de cada palavra e não a linha inteira, que provavelmente você estava pensando iii) a causa de todos os seus problemas. Você está obtendo os mesmos resultados várias vezes porque está executando o mesmo comando várias vezes. Você obterá um resultado para cada linha do seu arquivo.

De qualquer forma, o que você quer pode ser feito com algo tão simples como

grep "" ~/jlog/"" | awk '/\([a-zA-Z0-9.]+/ {print }' 

Ou mais simples:

awk '/'""'/\([a-zA-Z0-9.]+/ {print }' ~/jlog/""

O awk observa que "" não está entre as aspas simples. Isso faz com que o bash o expanda para o que estiver atualmente em antes de ser passado para awk .

    
por terdon 17.06.2014 / 19:55