como podemos usar o awk para obter várias palavras depois de uma palavra significativa?

5

Desejo conectar-me ao meu banco de dados apenas uma vez para fazer várias SELECT consultas da seguinte forma:

#!/bin/bash
#Begin Code
query=$(echo "SELECT COUNT(*) from USER_IPTable;
      SELECT User from USER_IPTable;
      SELECT IP_Address from USER_IPTable;" | mysql -u root --password='PASS' MatchingDB)

isso retornará algo assim:

COUNT(*) 3 User user1 user2 user3 IP_Address 192.168.1.17 192.168.1.24 192.168.1.17

Eu consegui obter o COUNT usando o awk da seguinte forma:

numberOfUsers=$(echo $query| awk ' { print $2 } ')

minha pergunta é: como posso usar awk para obter todas as palavras após a palavra User de acordo com a contagem e para obter todas as palavras após a palavra IP_Address de acordo com a contagem também?

    
por Networker 29.05.2014 / 23:13

4 respostas

3

Eu tentaria algo assim:

for i in 'seq 1 $numberOfUsers';
do
    #Will print users
    echo $query | awk ' { print 'expr $i + 2' } '
    #Will print ip
    echo $query | awk ' { print 'expr $i + $numberOfUsers + 3' } '
done 
    
por 29.05.2014 / 23:37
5

A variável NF contém o número de campos, e você pode referenciar um campo usando uma variável ao preceder $ ($ i == $ 4 onde i == 4). Em seguida, faça um loop pelos campos e use uma variável de sinalização para saber quando você atingiu cada tipo de valor desejado:

<your command> | awk '{for (i=1; i<=NF; i++) {if ($i == "User") {type="user"} else if ($i == "IP_Address") {type="ip"}  else if(type == "user") { print "user value = " $i} else if (type == "ip") { print "ip value = " $i}}}'
    
por 29.05.2014 / 23:32
0

Use uma consulta e obtenha os resultados no formato csv, que é muito mais limpo:

SELECT count(*), User, IP_Address from USER_IPTable;

Depois disso, você pode usar o awk para analisar os resultados linha a linha e preencher seus arrays de usuário e ip ou trabalhar diretamente com os dados, seja o que for que você precise fazer.

    
por 29.05.2014 / 23:58
0

Se sua intenção é listar usuários e endereços IP e assumir que o MYSQL retorna uma linha por registro de saída, você pode simplesmente citar $query passado para echo para evitar que a divisão de palavras perca as novas linhas e grep dos dados de interesse da saída colunar

echo "$query" | grep -v -x -e 'COUNT(\*)' -e 'User' -e 'IP_Address' | 
tail -n +2
user1
user2
..
192.1.1.1
192.3.4.5
..
    
por 30.05.2014 / 00:31