想知道如何将这两个 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。