私はかなり減らすことができると思う変数の初期化がたくさんあります。解析されるファイルは次のとおりです。
-------------------- 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スクリプトは特別なシェルスクリプトを作成せずにそのまま動作する必要があります。異なる形式の入力ファイルに対して同じアプローチを使用するようにスクリプトを調整できます。