awkを使用して重要な単語の後に複数の単語をどのように取得できますか?

awkを使用して重要な単語の後に複数の単語をどのように取得できますか?

次のような複数のクエリを実行するためにデータベースに一度だけ接続したいと思いますSELECT

#!/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)

これにより、次の内容が返されます。

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

次のようにawkを使用してCOUNTを正常に取得しました。

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

awk私の質問は、数に基づいて単語の後の各単語と数に基づいて単語の後のUser各単語をどのように取得しますか?IP_Address

答え1

変数NFにはフィールド番号が含まれています。変数を使用して、前に $ を追加してフィールドを参照できます ($i == $4、ここで i == 4)。その後、フィールドを繰り返し、フラグ変数を使用して各タイプの目的の値に達したタイミングを確認します。

<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}}}'

答え2

私は次のことを試してみます:

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 

答え3

クエリを使用して結果をcsv形式で取得する方が明確です。

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

その後、awkを使用して結果を1行ずつ解析し、ユーザーとIPの配列を入力したり、必要なすべての操作を直接データに処理したりできます。

答え4

ユーザーとIPアドレスをリストすることが目的であり、MYSQLが出力レコードごとに1行を返すと仮定する場合は、トークン化で改行がないことを防ぐために参照に渡し、列形式の出力$queryから関心のあるデータをインポートできます。echogrep

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
..

関連情報