awk를 사용하여 하위 문자열 인덱스에서 OR을 사용하는 방법

awk를 사용하여 하위 문자열 인덱스에서 OR을 사용하는 방법

문자열의 단어를 필터링하고 싶습니다. 아래 명령에서 "TCP" 필터의 단어를 출력할 수 있습니다.

awk '{print substr($0, index($0, "{TCP}"))}'

이것은 내 샘플 입력입니다.

01/08-21:03:05.312358 [] [1:5000001:1] Attack Detected [] [Priority: 0] {TCP} 139.150.160.188:40001 -> 192.168.2.1:80` 

그래서 나중에 IP를 추출하고 싶습니다 {TCP}. 나는 추출물을 사용했습니다 sed. 로그 파일에 {ICMP}AND 프로토콜이 있는지 알고 싶습니다 . OR 연산처럼 Between 문자열을 {UDP}사용하여 필터링할 수 있나요 ?||

필터에 "OR"을 사용하여 UDP 및 ICMP도 필터링할 수 있나요? 이것이 가능한가...?

 awk '{print substr($0, index($0, "{TCP}" || "{UDP}" ||"{ICMP}"))}'

감사해요.

답변1

사용할 수 있지만 awkREGEXP 구문은 C-style 부울 연산자와 약간 다르게 작동합니다. 언급한 모든 경우에서 IP 주소를 추출한다고 가정하면 다음이 작동합니다.

awk '{if (match($0,/{(TCP|UDP|ICMP)} ([[:digit:]:.]{15})/,v)) print(v[2])}' logfile.txt

여기에 사용된 match함수는 문자열 또는 뒤에 공백과 IPv4(예: 숫자 또는 마침표로 구성된 15자 ) awk를 검색 하고 정규식의 후반부(예: 괄호로 묶인 하위 그룹)의 실제 값을 추출합니다. 내부 배열 varuable 에 저장합니다 .TCPUDPICMP0-9.awkv

일치하는 항목이 발견되면 두 번째 그룹화된 하위 표현식의 실제 값을 인쇄합니다 v[2](첫 번째는 프로토콜의 OR 그룹입니다).(...)이 기능을 사용하려면 match()GNU Awk가 필요하다는 점에 유의하세요!

이는 조건이 충족되면(호출이 0이 아닌 값을 반환함) 하나의 작업만 수행되는 간단한 작업 문이므로 match()일반적인 " <condition> { <actions> }" 구문 으로 작성할 수도 있습니다 awk.

awk 'match($0,/{(TCP|UDP|ICMP)} ([[:digit:]:.]{15})/,v)) {print v[2]}' logfile.txt

관련 정보