次のような複数のクエリを実行するためにデータベースに一度だけ接続したいと思います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
から関心のあるデータをインポートできます。echo
grep
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
..