我只想连接到数据库一次来执行多个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 逐行解析结果并填充您的用户和 ip 数组,或者直接处理数据,无论您需要做什么。
答案4
如果您的目的是列出用户和 IP 地址,并假设 MYSQL 每条输出记录返回一行,您可以简单地引用$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
..