特定の文字を含む行に基づく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行のスクリプトが必要な場合があります。

おすすめ記事