shell 脚本中的 sscanf 等效项

shell 脚本中的 sscanf 等效项

我有一个文件,其中存储了一些 ACL 规则的统计信息和计数器。我想设计一个 shell 脚本来读取该文件并解析这些计数器。

我做了类似的事情,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++;

   }

我想在 shell 脚本中完成类似的事情。

我的意思是这个 sscanf 功能( sscanf(line, "%d %d: %127[^,\n]",&hits,&n,&rule[0]); ),我在三个不同的变量中解析和存储三个值。我正在 shell 脚本或任何其他 Linux 实用程序中寻找类似的功能,例如sedgrep

例如,对于以下规则,

0 0: allow icmp src 1.1.1.1 dst 1.1.0.0 mask 255.255.0.0,

我想要的所有三个值都在单独的变量中。所以如果我这样做,echo $n1, $n2, $str 那么n1应该打印0n2应该打印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]这将把第一个零、a[2]第二个零和该行的其余部分放入变量中b[1](不带逗号)

相关内容