【问题标题】:Wondering how to merge these two bash commands in a single efficient one想知道如何将这两个 bash 命令合并为一个有效的命令
【发布时间】:2015-09-20 04:03:05
【问题描述】:

我有一个日志文件,其中包含我需要抓取的一些行:

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 $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)部分。 这给出了记录的已删除事务的实际数量。换句话说,一个日志条目可能意味着 1 个或多个被丢弃的事务。

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

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 但面临语法错误...

How can I pass variables from awk to a shell command?

【问题讨论】:

    标签: bash awk logfile


    【解决方案1】:

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

    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。

    【讨论】:

    • 你为什么要对它们进行排序,我认为 OP 这样做只是为了让他们可以使用 uniq ?
    • 感谢您的快速回复。我确实将这两个命令整合到一个输出中。但这并不是我正在寻找的(也许我的描述不够清楚):我想要做的是每个帐户 id (帐户 id : (YY))。
    • 谢谢格伦。因此,如果我很了解您使用一种数组来存储和计算值,对吗?模式搜索后的两行让我有点困惑......我不太了解它们?
    • 我的字段分隔符是“(”和“)”。因此,第 2 个字段是帐号,第 4 个字段是滴数。 acct[$2]++ 表示将“acct”关联数组中索引“account number”处的值递增(1);而dropped[$2] += $4 表示在索引“帐号”处的“已删除”关联数组中的值递增(按滴数)
    • 再次感谢格伦,工作就像一个魅力!最后一个我想做的额外的想法是用其名称替换帐户 ID。我有 mysql 命令来进行映射。我编辑了我的问题,以便您也有这个额外的挑战。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多