いくつかのACLルールの統計とカウンタを格納するファイルがあります。このファイルを読み、これらのカウンタを解析するシェルスクリプトを設計したいと思います。
同様の作業を行いました。c programming language
ファイルの内容を開き、いくつかのバッファに保存し、sscanf
ファイルの出力を解析しました。
以下はファイルの内容です
vlan_id: 0
HITS ACL rules:
0 0: allow icmp src 1.1.1.1 dst 1.1.0.0 mask 255.255.0.0,
0 1: deny icmp dst 6.8.9.1,
0 2: deny icmp src 3.2.2.1,
0 3: deny tcp src port 3210,
0 4: deny tcp src 6.0.9.9,
0 5: deny udp src port 432,
0 6: deny udp src 43.43.43.1,
0 7: deny tcp src port 435,
0 8: deny udp dst port 554,
22 9: deny all,
the number of passed packets: 0
the number of dropped packets: 22
Cプログラミング言語では、解析のために次のコードを書いています。
//Read atmost 127 characters or till it encounter comma(,).
num = sscanf(line, "%d %d: %127[^,\n]",&hits,&n,&rule[0]);
if (num == 3)
{
g_list_of_rules[i].hits = hits;
strncpy_s(g_list_of_rules[i].rule,
ACL_MAX_STR_LEN, rule,
ACL_MAX_STR_LEN-1);
i++;
}
シェルスクリプトで同様のことをしたいと思います。
私の言葉はこのsscanf関数ですが( sscanf(line, "%d %d: %127[^,\n]",&hits,&n,&rule[0]); )
、3つの値を3つの異なる変数に解析して保存するということです。シェルスクリプトsed
や次のような他のLinuxユーティリティで同様の機能を探しています。grep
たとえば、次のルールの場合
0 0: allow icmp src 1.1.1.1 dst 1.1.0.0 mask 255.255.0.0,
私が望む3つの値はすべて別々の変数にあります。したがって、echo $n1, $n2, $str
これを行うとn1
印刷する必要があります0
。印刷するn2
必要があります。印刷する必要があります0
。n3
印刷する必要があります。allow icmp src 1.1.1.1 dst 1.1.0.0 mask 255.255.0.0
誰かが考えやアイデアを持っている場合は共有してください。
答え1
あなたはこれを試すことができますawk
awk -F': ' -v OFS="," '{split($1,a," "); split($2,b,","); print a[1],a[2],b[1]}' input_file
a[1]
これにより、最初の0、2番目の0、およびa[2]
行の残りの部分が変数に保存されますb[1]
(カンマを除く)。