awk出力のさまざまなフィールドに複数の変数を設定する

awk出力のさまざまなフィールドに複数の変数を設定する

私はかなり減らすことができると思う変数の初期化がたくさんあります。解析されるファイルは次のとおりです。

                   -------------------- ACL Stats Per Interface ----------------------
                   Entries         Packets                         Dropped  
                            Recent      Total  PerMax      Recent    Total    PerMax 
Slot 0 /Port 0
Trusted              1         196    1311578     386           0          0       0
Untrusted            3          20  217217953  852794           0          0       0

...スクリプトのコードスニペットは次のとおりです。

expect_results="stats.txt"

acl_stats_per_interface_trusted_entries_s0_p0=`grep -A 2 "Slot 0 /Port 0" $expect_results | grep "Trusted" | awk '{print $2}' `
acl_stats_per_interface_trusted_recent_packets_s0_p0=`grep -A 2 "Slot 0 /Port 0" $expect_results | grep "Trusted" | awk '{print $3}' `
acl_stats_per_interface_trusted_total_packets_s0_p0=`grep -A 2 "Slot 0 /Port 0" $expect_results | grep "Trusted" | awk '{print $4}' `
acl_stats_per_interface_trusted_permax_packets_s0_p0=`grep -A 2 "Slot 0 /Port 0" $expect_results | grep "Trusted" | awk '{print $5}' `
acl_stats_per_interface_trusted_dropped_recent_s0_p0=`grep -A 2 "Slot 0 /Port 0" $expect_results | grep "Trusted" | awk '{print $6}' `
acl_stats_per_interface_trusted_dropped_total_s0_p0=`grep -A 2 "Slot 0 /Port 0" $expect_results | grep "Trusted" | awk '{print $7}' `
acl_stats_per_interface_trusted_dropped_permax_s0_p0=`grep -A 2 "Slot 0 /Port 0" $expect_results | grep "Trusted" | awk '{print $8}' `

grep同じファイルを7回pingして一度だけgrepしてこれらの変数を各個別のawk出力に設定する方法はありますか?

ベストアンサー1

FWIW私はawkを使用して入力ファイルからテキストと値を抽出し、その出力を手動でシェル変数などを作成せずに.promファイルとして印刷します。

$ cat tst.awk
$1 ~ /^-+$/ {
    #    -------------------- ACL Stats Per Interface ----------------------
    gsub(/^[[:space:]]*-+[[:space:]]+|[[:space:]]+-+[[:space:]]*$/,"")
    fileHdr = $0
    next
}

/^[[:space:]]/ {
    if (NF == 3) {
        #    Entries         Packets                         Dropped
        colName[1] = $1
        for (i=2; i<=NF; i++) {
            colHdr[i] = $i
        }
    }
    else {
        #        Recent      Total  PerMax      Recent    Total    PerMax
        for (i=1; i<=3; i++) {
            colName[i+1] = $i "_" colHdr[2]
        }
        for (; i<=NF; i++) {
            colName[i+1] = $i "_" colHdr[3]
        }
    }
    next
}

/^Slot/ {
    # Slot 0 /Port 0
    slot = $2
    port = $NF
    next
}

/^[[:alpha:]]/ {
    # Trusted              1         196    1311578     386           0          0       0
    # Untrusted            3          20  217217953  852794           0          0       0
    rowName = $1
    for (i=2; i<=NF; i++) {
        out = tolower(fileHdr "_" rowName "_" colName[i-1] "_s" slot "_p" port) "=" $i
        gsub(/[[:space:]]+/,"_",out)
        print out
    }
}

$ awk -f tst.awk file
acl_stats_per_interface_trusted_entries_s0_p0=1
acl_stats_per_interface_trusted_recent_packets_s0_p0=196
acl_stats_per_interface_trusted_total_packets_s0_p0=1311578
acl_stats_per_interface_trusted_permax_packets_s0_p0=386
acl_stats_per_interface_trusted_recent_dropped_s0_p0=0
acl_stats_per_interface_trusted_total_dropped_s0_p0=0
acl_stats_per_interface_trusted_permax_dropped_s0_p0=0
acl_stats_per_interface_untrusted_entries_s0_p0=3
acl_stats_per_interface_untrusted_recent_packets_s0_p0=20
acl_stats_per_interface_untrusted_total_packets_s0_p0=217217953
acl_stats_per_interface_untrusted_permax_packets_s0_p0=852794
acl_stats_per_interface_untrusted_recent_dropped_s0_p0=0
acl_stats_per_interface_untrusted_total_dropped_s0_p0=0
acl_stats_per_interface_untrusted_permax_dropped_s0_p0=0

公開した入力ファイルと同じ形式で別のファイルを生成するツールがある場合は、上記のawkスクリプトは特別なシェルスクリプトを作成せずにそのまま動作する必要があります。異なる形式の入力ファイルに対して同じアプローチを使用するようにスクリプトを調整できます。

おすすめ記事