我有一个文件,其中存储了一些 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 实用程序中寻找类似的功能,例如sed
或grep
例如,对于以下规则,
0 0: allow icmp src 1.1.1.1 dst 1.1.0.0 mask 255.255.0.0,
我想要的所有三个值都在单独的变量中。所以如果我这样做,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]
这将把第一个零、a[2]
第二个零和该行的其余部分放入变量中b[1]
(不带逗号)