特定の文字を含む行に基づくAWKのグループ化

特定の文字を含む行に基づくAWKのグループ化

ソースは次のとおりです。

test/snmp/result/08-28-2016_12-30/AAAAA/hostname01_192.168.1.1
161/udp open  snmp
| snmp-brute: 
|   comstring1 - Valid credentials
|_  comstring2 - Valid credentials
test/snmp/result/08-28-2016_12-30/AAAAA/hostname02_192.168.1.2
161/udp open  snmp
| snmp-brute: 
|   comstring1 - Valid credentials
|_  comstring1 - Valid credentials

上記のテキストをどのように解析して次のように作成できますか?

08-28-2016_12-30|AAAAA|hostname01|192.168.1.1|comstring1-Valid credentials -- comstring1 - Valid credentials
08-28-2016_12-30|AAAAA|hostname02|192.168.1.2|comstring1-Valid credentials -- comstring1 - Valid credentials

主な問題は、コードが "|"または、「|_」文字に基づいてグループ化できないことです。コードをたくさん変更しましたが、成功しませんでした。たとえば、次のようになります。

awk '{ORS=($0 !~ "_"?FS:RS)}1'

答え1

スクリプトは、レコード区切り文字またはフィールド区切り文字を使用して特別な操作を実行する必要はありません。例の入力と出力が与えられたら、スクリプトは4つの行タイプのうち2つだけを見つけることができます。

test/snmp/result/08-28-2016_12-30/AAAAA/hostname01_192.168.1.1

(これは最大文字で区切られた/)と

|   comstring1 - Valid credentials

一致は正規表現で行うことができます。

スクリプトは最初の行スタイルと一致する必要があります。たとえば、次のようになります。

/^.*\/.*\/.*\// {
    split($0, "/", fields);
    # ...more work needed :-)

以下を使用して、文字に基づいて配列にsplit切り捨て/ます。subsubstrindex"hostname01_192.168.1.1")。

printf完了すると、2番目の行タイプからメッセージを抽出し、完了する変数を提供します。これを行うには、30行のスクリプトが必要な場合があります。

答え2

解決策は次のとおりです。TxR。このファイルdataには質問のデータがそのまま含まれています。reformat.txr以下が含まれます:

@(collect)
test/snmp/result/@date/@label/@{host}_@ipaddr
@port/udp open  snmp
| snmp-brute:@(skip)
@  (collect :gap 0)
|   @string - @val
@  (end)
|_  @endstring - @endval
@  (merge string string endstring)
@  (merge val val endval)
@(end)
@(output)
@  (repeat)
@date|@label|@host|@ipaddr|@(rep)@string - @val -- @(last)@string - @val@(end)
@  (end)
@(end)

ランニング:

$ txr reformat.txr data
08-28-2016_12-30|AAAAA|hostname01|192.168.1.1|comstring1 - Valid credentials -- comstring2 - Valid credentials
08-28-2016_12-30|AAAAA|hostname02|192.168.1.2|comstring1 - Valid credentials -- comstring1 - Valid credentials

TXRは、多くの作業を必要とせず、構造が変更された場合や新しいケースに適応する必要がある場合に、追加の作業を行わずに緩く構造化されたデータからテキストを抽出するのに適しています。

TXR抽出ジョブの作成は通常、実際のサンプルデータと出力をファイルにコピーして貼り付け、キャプチャ変数と.txr指示を追加して調整することから始まります。ジョブスクリプトはデータ自体から生成されます。

データ構造は、生成されたコードでまだある程度識別可能です。

答え3

解決しました:)

awk '$0!~/(161|brute)/ {if ($0~/_/)ORS="\n"; else ORS="";print}'

関連情報