ソースは次のとおりです。
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
切り捨て/
ます。sub
substr
index
"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}'