2015-07-02 36 views
1

我已經包含了一些行我需要抓住一個日誌文件:想知道如何在合併這兩個命令的bash一個高效的

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的,但面臨的語法錯誤交易的帖子...

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

回答

3

這使用圓括號作爲您的字段分隔符,因此更容易獲取帳號和慢速連接的數量。

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 

必需GNU AWK用於通過索引排序數組遍歷的 「sorted_in」 的方法。

+0

你是如何對它們進行排序的,我認爲OP只做過,所以可以使用uniq? – 123

+0

感謝您的快速回復。我將這兩個命令確實放到了一個輸出中。但這並不是我正在尋找的東西(也許我的描述不夠清楚):我想要做的是每個賬戶ID(賬戶ID)都有X(「放緩交易:(X)」)的總和:(YY))。 – Xxmusashi

+0

答覆已更新。 –

相關問題