想知道如何将这两个 bash 命令合并为一个有效的命令
Wondering how to merge these two bash commands in a single efficient one
我有一个日志文件,其中包含我需要抓取的一些行:
Jul 2 06:42:00 myhostname error proc[12345]: 01310001:3: event code xxxx Slow transactions attack detected - account id: (20), number of dropped slow transactions: (3)
Jul 2 06:51:00 myhostname error proc[12345]: 01310001:3: event code xxxx Slow transactions attack detected - account id: (20), number of dropped slow transactions: (2)
Account id(xx) 为我提供了一个对象的名称,我可以通过 mysql 查询收集到该对象。
以下命令(肯定没有优化,但有效)为我提供了每个帐户 ID 的匹配行数:
grep "Slow transactions" logfile| awk '{print }' | awk -F '[^0-9]+' '{OFS=" ";for(i=1; i<=NF; i++) if ($i != "") print($i)}' | sort | uniq -c
14 20
输出 (14 20) 表示帐户 ID 20 被观察到 14 次(日志文件中的 14 行)。
然后我还有丢弃的慢事务数:(2) 部分。
这给出了记录的实际丢弃事务数。换句话说,一个日志条目可能意味着 1 个或多个丢弃的事务。
我有一个小命令来计算丢弃的事务数:
grep "Slow transactions" logfile | awk '{print }' | sed 's/(//g' | sed 's/)//g' | awk '{s+=} END {print s}'
73
这意味着 73 笔交易被丢弃。
这两个作品,但当谈到合并两者时,我被卡住了。我真的不知道如何将它们结合起来;我很确定 awk 可以做到这一点(并且可能是我做的更好的方法)但是如果社区中的任何专家可以给我一些指导,我将不胜感激。
更新
由于上面的内容对于我们的一些 awk 专家来说太简单了,所以我介绍了一个可选功能 :)
如前所述,我可以将帐户 ID 转换为发出 mysql 查询的名称。所以,现在的想法是将 ID => name 转换包含到 awk 命令中。
mySQL 查询如下所示(XX 是帐户 ID):
mysql -Bs -u root -p$(perl -MF5::GenUtils -e "print get_mysql_password.qq{\n}") -e "SELECT name FROM myTABLE where account_id= 'XX'"
我在下面创建了 post,它处理命令输出到 awk 但面临语法错误...
How can I pass variables from awk to a shell command?
这使用括号作为您的字段分隔符,因此更容易获取帐号和慢速连接数。
awk -F '[()]' '
/Slow transactions/ {
acct[]++
dropped[] +=
}
END {
PROCINFO["sorted_in"] = "@ind_num_asc" # https://www.gnu.org/software/gawk/manual/html_node/Controlling-Scanning.html
for (acctnum in acct)
print acctnum, acct[acctnum], dropped[acctnum]
}
' logfile
根据您的示例输入,此输出
20 2 5
"sorted_in"按索引排序数组遍历的方法需要 GNU awk。
我有一个日志文件,其中包含我需要抓取的一些行:
Jul 2 06:42:00 myhostname error proc[12345]: 01310001:3: event code xxxx Slow transactions attack detected - account id: (20), number of dropped slow transactions: (3)
Jul 2 06:51:00 myhostname error proc[12345]: 01310001:3: event code xxxx Slow transactions attack detected - account id: (20), number of dropped slow transactions: (2)
Account id(xx) 为我提供了一个对象的名称,我可以通过 mysql 查询收集到该对象。
以下命令(肯定没有优化,但有效)为我提供了每个帐户 ID 的匹配行数:
grep "Slow transactions" logfile| awk '{print }' | awk -F '[^0-9]+' '{OFS=" ";for(i=1; i<=NF; i++) if ($i != "") print($i)}' | sort | uniq -c
14 20
输出 (14 20) 表示帐户 ID 20 被观察到 14 次(日志文件中的 14 行)。
然后我还有丢弃的慢事务数:(2) 部分。 这给出了记录的实际丢弃事务数。换句话说,一个日志条目可能意味着 1 个或多个丢弃的事务。
我有一个小命令来计算丢弃的事务数:
grep "Slow transactions" logfile | awk '{print }' | sed 's/(//g' | sed 's/)//g' | awk '{s+=} END {print s}'
73
这意味着 73 笔交易被丢弃。
这两个作品,但当谈到合并两者时,我被卡住了。我真的不知道如何将它们结合起来;我很确定 awk 可以做到这一点(并且可能是我做的更好的方法)但是如果社区中的任何专家可以给我一些指导,我将不胜感激。
更新 由于上面的内容对于我们的一些 awk 专家来说太简单了,所以我介绍了一个可选功能 :)
如前所述,我可以将帐户 ID 转换为发出 mysql 查询的名称。所以,现在的想法是将 ID => name 转换包含到 awk 命令中。
mySQL 查询如下所示(XX 是帐户 ID):
mysql -Bs -u root -p$(perl -MF5::GenUtils -e "print get_mysql_password.qq{\n}") -e "SELECT name FROM myTABLE where account_id= 'XX'"
我在下面创建了 post,它处理命令输出到 awk 但面临语法错误...
How can I pass variables from awk to a shell command?
这使用括号作为您的字段分隔符,因此更容易获取帐号和慢速连接数。
awk -F '[()]' '
/Slow transactions/ {
acct[]++
dropped[] +=
}
END {
PROCINFO["sorted_in"] = "@ind_num_asc" # https://www.gnu.org/software/gawk/manual/html_node/Controlling-Scanning.html
for (acctnum in acct)
print acctnum, acct[acctnum], dropped[acctnum]
}
' logfile
根据您的示例输入,此输出
20 2 5
"sorted_in"按索引排序数组遍历的方法需要 GNU awk。