Comando Awk - combina dois comandos

0

Lentamente, confuso meu caminho aprendendo como manipular variáveis para um script bash que estou escrevendo. Eu estou tentando usar AWK (tentei Grep mas não granular o suficiente eu não acho) para puxar a fonte e dest de iftop.

O comando iftop base que estou usando é:

sudo iftop -t -L1 -s1 -f "dst host 10.0.0"

Eu posso mudar o dst para src para obter o reverso. Portanto, o exemplo de saída do comando acima é:

interface: eth0
IP address is: 10.0.0.104
MAC address is: b8:27:eb:6a:26:84
Listening on eth0
   # Host name (port/service if enabled)            last 2s   last 10s  last 40s cumulative
--------------------------------------------------------------------------------------------
   1 10.0.0.255                               =>         0b         0b         0b         0B
     10.0.0.15                                <=     1.14Kb     1.14Kb     1.14Kb       291B
--------------------------------------------------------------------------------------------
Total send rate:                                       480b       480b       480b
Total receive rate:                                  1.29Kb     1.29Kb     1.29Kb
Total send and receive rate:                         1.76Kb     1.76Kb     1.76Kb
--------------------------------------------------------------------------------------------
Peak rate (sent/received/total):                       480b     1.29Kb     1.76Kb
Cumulative (sent/received/total):                      120B       331B       451B
============================================================================================

Estou tentando usar o AWK para enviar os dois endereços IP (ou podem ser domínios) para as variáveis em que posso fazer algo no bash.

Se eu usar um comando como:

 sudo iftop -t -L1 -s1 -f "dst host 10.0.0" 2> /dev/null | awk '/^   1 / {print $2}'

Isso me dá o primeiro IP ou domínio, mas agora preciso da segunda linha abaixo. Eu tentei usar algo como:

 sudo iftop -t -L1 -s1 -f "dst host 10.0.0" 2> /dev/null | awk '/^   1 /{c=2} c&&c-- {print $2}'

Isso quase funciona, mas por causa do espaçamento branco na segunda linha, AWK conta o que é a coluna 2 na primeira linha como coluna 1 no segundo, então a saída que obtenho é:

10.0.0.255
<=

Eu sinto que estou perto, mas não consigo descobrir como usar um único comando AWK para citar os dois números certos.

Não é possível executar facilmente uma segunda comparação de padrões para o 2º número, pois o espaço em branco antes do IP ou do domínio não é suficiente para continuar, não é o ideal, portanto, quero combinar com o primeiro e depois mova para a próxima linha, mas escolha a coluna 1 em vez da coluna 2.

Eu também quero evitar a execução de um segundo comando iftop, pois os resultados podem ser diferentes do primeiro.

Depois, preciso saber como convertê-los em variáveis para um script bash em vez de imprimi-los na tela.

Alguma idéia?

    
por Matthew Hodder 06.03.2018 / 12:39

3 respostas

1

tente

 ... | awk '$1 == "1" {print $2 ; l=NR+1 ; } NR == l { print $1 ;}'

onde

  • $1 == "1" seleciona a linha onde o primeiro campo é 1
  • {print $2 imprima seu valor
  • l=NR+1 ; } lembra da próxima linha
  • NR == l selecione a segunda linha
  • { print $1 ;} imprime o primeiro campo

lembre-se que awk não pensa em termos de coluna, apenas campo.

essas duas linhas são equivalentes usando $1 $2

 hello world
       hello              world

Atribuindo a var

... | awk '$1 == "1" {printf "A=%s\n",$2 ; l=NR+1 ; } NR == l { printf "B=%s\n",$1 ;}' > /tmp/.var
. /tmp/.var

a última linha é um ponto ( . ) um espaço ( ) e /tmp/.var

  • printf no awk precisa de uma vírgula após discussão.
por 06.03.2018 / 13:21
0

Você poderia usar isto:

sudo iftop -t -L1 -s1 -f "dst host 10.0.0" | grep -E '=>|<=' | cut -c 5- | awk '{ print $1 }'

que retorna:

10.0.0.255
10.0.0.15

O problema é que o número de "colunas" não é o mesmo nas duas linhas seguintes. No comando acima, cut é usado para excluir os primeiros 5 caracteres, portanto, exclui o "1".

 1 10.0.0.255                         =>         0b         0b         0b         0B
   10.0.0.15                          <=     1.14Kb     1.14Kb     1.14Kb       291B
    
por 06.03.2018 / 13:27
0

com grep :

... | grep -oP '^\s+\d* \K(\d+\.){3}\d+'
10.0.0.255
10.0.0.15
    
por 06.03.2018 / 13:32