我们如何使用 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 逐行解析结果并填充您的用户和 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
..

相关内容