2017-05-15 26 views
-2

我需要awk/grep/sed或任何你認爲可以完成這項工作的幫助。 我有一個日誌文件,需要持續監視它,並在寫入新行時獲取一些數據。如何從實時日誌中提取數據並將其傳遞給postgres

新行很長,沒有結構化,但它們將包含以下模式UserName=SOMEUSRNAME, NetworkDevice=SOMENETWORKDEVICE, Calling-Station-ID=SOMEMACADDRESS

〔實施例:
May 15 03:59:16 MTN-LAB-ISE-B1 CISE_Passed_Authentications 0000043297 1 0 2017-05-15 03:59:16.979 +00:00 0013123384 5200 NOTICE Passed-Authentication: Authentication succeeded, ConfigVersionId=170, Device IP Address=10.97.31.130, DestinationIPAddress=10.62.56.152, DestinationPort=1812, UserName=abcd\testuser, Protocol=Radius, RequestLatency=313, NetworkDeviceName=SHROCLUSW-WLAN-LAB, User-Name=d4d748fefe96, NAS-IP-Address=10.97.31.130, NAS-Port=50005, Service-Type=Call Check, Framed-IP-Address=10.97.109.64, Framed-MTU=1500, Called-Station-ID=64-E9-50-B6-DE-05, Calling-Station-ID=D4-D7-48-FE-FE-96, NAS-Port-Type=Ethernet, NAS-Port-Id=GigabitEthernet0/5, EAP-Key-Name=,

我用tail -f命令監視日誌文件和管道它的grep/SED/AWK中提取所需要的數據的想法。 我只需要SOMEUSERNAME,SOMENETWORKDEVICE,SOMEMACADDRESS而不是模式。

當然,在完成提取之後,這會變得更加複雜,我需要將它管道到postgres。

有人可以給我一個提示如何做匹配/提取部分,也許管道postgres?

+0

歡迎來到StackOverflow。 請參考[遊覽], 學習問好的問題stackoverflow。com/help/how-to-ask, make [mcve]。一個MCVE應包含各種樣本輸入(說明所有方面)和期望的輸出。 請顯示您嘗試過的內容,包括尾部。 – Yunnosch

回答

0

這也可以用grep/sed來完成,但我個人更喜歡awk。

我做這個簡短的腳本filter.awk

{ 
    # find info in line 
    userName = gensub(/^.*UserName=([^,\r\n]+).*$/, "\\1", 1, $0) 
    networkDevice = gensub(/^.*NetworkDeviceName=([^,\r\n]+).*$/, "\\1", 1, $0) 
    callingStationId = gensub(/^.*Calling-Station-ID=([^,\r\n]+).*$/, "\\1", 1, $0) 
    # print filtered info (if any of patterns matched) 
    if (userName != "" || networkDevice != "" || callingStationId != "") { 
    print "INSERT INTO logs (username, networkdevice, calling_station_id) VALUES ('"userName"', '"networkDevice"', '"callingStationId"');" 
    } 
    # If "all patterns" is required instead of "any pattern" 
    # the "||" operators have to be replaced with "&&". 
} 

我在Cygwin的與GNU測試它AWK在慶典(窗口10):

$ cat >filter.txt <<EOF 
> May 15 03:59:16 MTN-LAB-ISE-B1 CISE_Passed_Authentications 0000043297 1 0 2017-05-15 03:59:16.979 +00:00 0013123384 5200 NOTICE Passed-Authentication: Authentication succeeded, ConfigVersionId=170, Device IP Address=10.97.31.130, DestinationIPAddress=10.62.56.152, DestinationPort=1812, UserName=abcd\testuser, Protocol=Radius, RequestLatency=313, NetworkDeviceName=SHROCLUSW-WLAN-LAB, User-Name=d4d748fefe96, NAS-IP-Address=10.97.31.130, NAS-Port=50005, Service-Type=Call Check, Framed-IP-Address=10.97.109.64, Framed-MTU=1500, Called-Station-ID=64-E9-50-B6-DE-05, Calling-Station-ID=D4-D7-48-FE-FE-96, NAS-Port-Type=Ethernet, NAS-Port-Id=GigabitEthernet0/5, EAP-Key-Name=, 
> EOF 

$ awk -f filter.awk filter.txt 
INSERT INTO logs (username, networkdevice, calling_station_id) VALUES ('abcd\testuser', 'SHROCLUSW-WLAN-LAB', 'D4-D7-48-FE-FE-96'); 

$ 

注:

  1. NetworkDevice=模式似乎不足以滿足我的需求。我用NetworkDeviceName=替換了它。 (如果我錯了,應該很容易替換。)

  2. 我不知道如何正確格式化輸出postgres也不知道提問者的數據庫結構。因此,print聲明可能需要調整。 (腳本中只有一條print語句。)但是,print語句會輸出到標準輸出通道(您可能已經預料到了這一點)。因此,它可以輕鬆地傳送到任何其他輸入消費過程。

  3. 目前還不清楚是否要求所有模式必須匹配或(至少)有一個模式必須匹配。
    我實現了「至少一個」。
    要實施「全部」,if語句中的||運算符必須由&&運算符替換。 (腳本中只有一個if聲明。)

  4. 不幸的是,gensub()函數僅適用於GNU awk。對於非GNU awk,可以使用gsub()代替另一個解決方案。但是,功能使用起來要方便得多。因此,只要非GNU awk解決方案沒有明確要求,我更喜歡它。

相關問題