繁体   English   中英

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

帐户ID(xx)为我提供了我能够通过mysql查询收集的对象的名称。

以下命令(肯定没有优化,但工作)给出了每个帐户ID的匹配行数:

grep "Slow transactions" logfile| awk '{print $18}' | 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)部分。 这给出了记录的实际丢弃事务数。 换句话说,日志条目可能意味着丢弃一个或多个事务。

我有一个小命令来计算丢弃的事务数量:

grep "Slow transactions" logfile | awk '{print $24}' | sed 's/(//g' | sed 's/)//g' | awk '{s+=$1} END {print s}'
73

这意味着73项交易被取消。


这两个作品但是当我们陷入两个合并的时候我就被卡住了。 我真的不知道如何将它们结合起来; 我很确定awk能做到这一点(可能是我做过的更好的方式)但我很感激社区的任何专家都能给我一些指导。


更新因为上面的一些对于我们的一些awk专家来说太容易了所以我介绍了一个可选功能:)

如前所述,我可以将帐户ID转换为发出mysql查询的名称。 因此,现在的想法是将ID =>名称转换包含在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'"

我创建了下面的帖子,它将命令输出处理成awk但面临语法错误......

如何将变量从awk传递给shell命令?

这使用括号作为字段分隔符,因此更容易获取帐号和慢速连接的数量。

awk -F '[()]' '
    /Slow transactions/ {
        acct[$2]++
        dropped[$2] += $4
    }
    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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM