쉘 스크립트의 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]); ), 세 가지 값을 세 가지 다른 변수에 구문 분석하고 저장한다는 것입니다. 쉘 스크립트나 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](쉼표 제외).

관련 정보