2015-11-09 125 views
0

我想從BASH中的錯誤日誌中解析出行,然後將某個部分發送給BASH變量,以便稍後在腳本中使用,並在嘗試傳遞它時遇到問題到一個BASH變量。將AWK輸出傳遞給BASH的問題變量

日誌文件的樣子:

1446851818|1446851808.1795|12|NONE|DID|80

我需要在第三盤的數量(在這種情況下,這個數字是12)行

這裏是命令的一個例子,我「M運行:

tail -n5 /var/log/asterisk/queue_log | grep 'CONNECT' | awk -F '[|]' '{print $3}' 

的代碼行試圖實現這一點:

  1. 抓住日誌文件的最後幾行
  2. 搜索短語(在這種情況下連接,我使用的是相同的命令來觸發不同的項目)在第三盤的線路
  3. 將這個數出這麼它可以用在別處

如果我運行上面的完整的命令,它運行成功,像這樣:

tail -n5 /var/log/asterisk/queue_log | grep 'CONNECT' | awk -F '[|]' '{print $3}' 
12 

現在,如果我嘗試它在同一條直線/命令分配給一個變量,我我無法讓它迴應變異BLE。

我賦值給一個變量時,命令如下:

tail -n5 /var/log/asterisk/queue_log | grep 'CONNECT' | brand=$(awk -F '[|]' '{print $3}') 

(這是在同一個腳本echo命令正在運行,所以變量應該是罰款,測試腳本的樣子:

#!/bin/bash 
tail -n5 /var/log/asterisk/queue_log | grep 'CONNECT' | brand=$(awk -F '[|]' '{print $3}') 
echo "$brand"; 

我知道這很可能不是最有效/最有說服力的解決方案,所以如果有其他想法/方法可以做到這一點,我也向他們開放(我的BASH技能是基本的,但有所改進)

+3

不是'富| x = $(bar)',而不是'x = $(foo | bar)'。 –

+0

管道的右側在子shell中運行,因此在管道的那一側退出時,所做的更改會丟失:'x = hello;回聲再見|讀x; echo $ x'會輸出'hello',而不是'goodbye'。 –

回答

6

您需要捕獲整個管道的輸出,不只是它的最後一節:

brand=$(tail -n5 /var/log/asterisk/queue_log | grep 'CONNECT' | awk -F '|' '{print $3}') 

您可能還需要考慮會發生什麼,如果有在含CONNECT多行文件的最後五行(或者確實如果沒有)。這將導致brand多個(或否)值。


如果你的意圖是讓從該文件中包含CONNECT最新行的第三個字段,awk幾乎可以處理整個事情,而無需tailgrep

brand=$(awk -F '|' '/CONNECT/ {latest = $3} END {print latest}') 
+3

對,也失去了grep:'tail ... | awk -F'|' '/ CONNECT/{print $ 3}'' –

+0

@我想了一下,但只看最後五行的混亂讓我停下了腳步。不過,我已根據您的評論添加了一條建議,表明與OP詢問的內容略有不同,當然這並不總是他們想要的:-) – paxdiablo

+0

Re:搜索中的行數,我的實時副本將它設置爲-n1,因爲它使用inotifywait並檢查文件即時修改,我手動運行該文件,最後一個具有適用短語的日誌條目大約是4行,所以我只是快速修改它以便進行測試/運行手。 – TD46