일부 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]); )
, 세 가지 값을 세 가지 다른 변수에 구문 분석하고 저장한다는 것입니다. 쉘 스크립트나 sed
또는 다음과 같은 다른 Linux 유틸리티에서 유사한 기능을 찾고 있습니다 .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]
그러면 첫 번째 0, a[2]
두 번째 0 및 줄의 나머지 부분이 변수에 저장됩니다 b[1]
(쉼표 제외).