シェルスクリプトのsscanfと同じ

シェルスクリプトのsscanfと同じ

いくつかの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必要があります。印刷する必要があります0n3印刷する必要があります。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](カンマを除く)。

関連情報