문자열의 단어를 필터링하고 싶습니다. 아래 명령에서 "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
사용할 수 있지만 awk
REGEXP 구문은 C
-style 부울 연산자와 약간 다르게 작동합니다. 언급한 모든 경우에서 IP 주소를 추출한다고 가정하면 다음이 작동합니다.
awk '{if (match($0,/{(TCP|UDP|ICMP)} ([[:digit:]:.]{15})/,v)) print(v[2])}' logfile.txt
여기에 사용된 match
함수는 문자열 또는 뒤에 공백과 IPv4(예: 숫자 또는 마침표로 구성된 15자 ) awk
를 검색 하고 정규식의 후반부(예: 괄호로 묶인 하위 그룹)의 실제 값을 추출합니다. 내부 배열 varuable 에 저장합니다 .TCP
UDP
ICMP
0-9
.
awk
v
일치하는 항목이 발견되면 두 번째 그룹화된 하위 표현식의 실제 값을 인쇄합니다 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