Tubulação de comandos do Linux - grep e padrão de correspondência

1

Alguém pode, por favor, explicar o que acontece neste comando: Estrutura do arquivo de log:

IPsrc: IPdst: port: pacotes

@ max='cut -f4 -d: logfile | sort -n -r | head -1'
grep "$max"$ logfile | cut -f1,3,4 -d: | sort | uniq

Não consigo entender como a primeira linha é usada para definir um padrão para o grep.

Estou usando o Ubuntu para testar isso.

Qualquer link / explicação é útil.

virtual@virtual-VirtualBox:~$ @max='cut -f4 -d: intrulog | sort -n -r | head -1' grep   "$max"$ intrulog | cut -f1,3,4 -d: | sort | uniq
virtual@virtual-VirtualBox:~$ 

Como você pode ver, quando eu executo estes comandos, o grep não retorna nada. Se eu executar o comando na primeira linha, recebo a saída esperada, mas no primeiro caso, $ max não é passado para o grep como o padrão de filtro correto

virtual@virtual-VirtualBox:~$ cut -f4 -d: intrulog | sort -n -r | head -1
24
virtual@virtual-VirtualBox:~$ 

APENAS PARA AJUDAR OS VISITANTES FUTUROS Estrutura do intrulog (IPsrc: IPdst: port: packets), reduzida para algumas linhas:

192.168.164.142:137.37.8.8:8080:5
192.168.160.37:137.37.8.5:8080:13
192.168.155.47:137.37.8.12:443:24
192.168.161.92:137.37.8.5:21:24
192.168.156.77:137.37.8.8:8080:13
192.168.164.84:137.37.8.9:8080:9

Espera-se que os comandos retornem o IPSrc, a porta e o número de pacotes:

192.168.155.47:443:24
192.168.161.92:21:24
    
por ThatJoeGuy 12.05.2011 / 00:10

2 respostas

2

EDIT (para esclarecer pergunta):

Os comandos devem ser executados em duas linhas separadas. Acredito que também haja uma parte incorreta disso. Eu acredito que o símbolo @ antes do max não é necessário. O segundo $ no comando grep também parece desnecessário. Finalmente, no seu exemplo, as aspas simples ao redor do comando cut devem ser marcas de seleção ('da tecla ~ em oposição a'). O comando completo provavelmente deve ser (em linhas separadas):

max='cut -f4 -d: intrulog | sort -n -r | head -1'
grep "$max" logfile | cut -f1,3,4 -d: | sort | uniq

Se você quiser executá-lo como uma única linha, adicione um ponto-e-vírgula entre eles.

RESPOSTA ORIGINAL:

max está sendo atribuído ao valor cut -f4 -d: intrulog | sort -n -r | head -1 , que faz o seguinte na ordem:

  • cut é chamado para processar o arquivo intrulog , escolhendo a quarta coluna em um conjunto delimitado por dois pontos ( : )
  • sort é chamado para classificar a saída de cut para colocar os números mais altos no topo
  • head é chamado para reduzir a saída apenas para a linha superior.

Considerados todos juntos, ele basicamente obtém o maior valor na quarta coluna do arquivo chamado intrulog e retorna esse valor como o valor max , que grep procura em logfile .

A partir de que grep é encontrado, cut é chamado novamente para retornar as primeira, terceira e quarta colunas, que são classificadas por sort em ordem alfabética e aparadas por uniq para mostrar apenas resultados exclusivos. / p>     

por 12.05.2011 / 00:40
0

A primeira linha define uma variável de ambiente chamada max, que grep então chama. O $ referencia a variável que você configurou na primeira linha.

Teste echo $USER ou echo $HOME para ver outras variáveis de ambiente.

    
por 12.05.2011 / 00:43

Tags