2017-05-15 25 views
-2

awk/grep/sedなどの助けが必要です。 私はログファイルを持っていて、それを継続的に監視し、書き込まれたときに新しい行からデータを取り出す必要があります。ライブログからデータを抽出してポストグルにパイプする方法

新しい行は非常に長く、構造化されていませんが、次のパターンUserName=SOMEUSRNAME, NetworkDevice=SOMENETWORKDEVICE, Calling-Station-ID=SOMEMACADDRESSを含みます。

Exmaple:
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=,

私はそれがグレップ/ SED/awkの必要なデータを抽出するために、ログ・ファイルおよびパイプを監視するために、テール-fを使用して考えていました。 私はSOMEUSERNAME、SOMENETWORKDEVICE、SOMEMACADDRESSだけ必要とし、パターンも必要としません。

もちろん、抽出が完了した後にこれをさらに複雑にするには、それをポストグルにパイプする必要があります。

誰かが私にマッチング/抽出部分と多分パイプをポストグルする方法のヒントを教えてもらえますか?

+0

ようこそStackOverflow。 [ツアー]を取ってください。 よくある質問stackoverflowcom/help/how-to-ask、 [mcve]を作成します。 MCVEには、さまざまなサンプル入力(すべての側面を示す)と望ましい出力が含まれている必要があります。 テール部分を含め、試したことを示してください。 – Yunnosch

答えて

0

これはgrep/sedでも可能ですが、個人的にはawkが好きです。

私はこの短いスクリプトfilter.awkました:私はcygwinの(ウィンドウ10)にはbashにawkのGNUでそれをテストし

{ 
    # 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 "&&". 
} 

を:

$ 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=に置き換えました。 (私が間違っている場合はこれを簡単に置き換えてください)postgresの出力を正しくフォーマットする方法や質問者のデータベース構造を知りません。したがって、おそらくprintステートメントを調整する必要があります。ただし、printステートメントは、標準出力チャネル(既に期待しているもの)に出力します。したがって、他の入力消費プロセスに簡単にパイプすることができます。

  2. すべてのパターンが少なくとも1つに一致する必要があるか(代わりに)必要となるかは不明です。
    "少なくとも1つ"を実装しました。
    "all"を実装するには、ifステートメントの||オペレータを&&オペレータに置き換える必要がありました。 (スクリプトにはif文が1つしかありません)

  3. 残念ながら、gensub()関数はGNU awkでのみ利用できます。 GNU以外のawkの場合は、gsub()を代わりに使用して解決することもできます。しかし、gensub()関数ははるかに便利です。したがって、非GNU awkソリューションが明示的に必要とされない限り、私はそれを好む。

関連する問題