로그의 형식은 다음과 같습니다.
Junk Junk Junk : Junk Junk Junk:IP/Port Junk Junk
를 사용하여 검색하고 싶습니다 IP
. 출력은 IP/Port
해당 로그 파일의 각 줄의 일부여야 합니다.
나는 가능한 모든 조합과 내가 아는 모든 것을 시도했습니다 grep
: D cut
이것이 가능합니까? 아니면 일부 로그 구문 분석 도구를 계속 사용해야 합니까?awk
bash
편집하다:형식이 완전히 동일하지 않으며 위치가 Junk:IP/Port
변경되어 사용이 불가능할 수도 있으니 주의하시기 바랍니다awk '{print $7}'
고쳐 쓰다:샘플 로그 추가
DATE NAME-FIREWALL : %RULE-NUM: Teardown TCP connection PKT-NUM for LAN1:X.X.X.X/XX to LAN2:X.X.X.X/XX duration 0:0:0 bytes XXXX TCP FINs
DATE NAME-FIREWALL : %RULE-NUM: Built inbound TCP connection PKT-NUM for LAN1:X.X.X.X/XX (X.X.X.X/XX) to LAN2:X.X.X.X/XX (X.X.X.X/XX)
LAN2 옆에 있는 IP/포트 부분을 검색해서 가져와야 합니다.
답변1
무엇에 대해
awk '{for(i=1;i<=NF;i++) if ( $i ~ /[^:]*:/ ) { n=split($i,A,":"); if (length(A[2]) && n==2) print A[2] ; }} ' b.txt
X.X.X.X/XX
X.X.X.X/XX
X.X.X.X/XX
X.X.X.X/XX
편집: (LAN 사용)
awk '{for(i=1;i<=NF;i++) if ( $i ~ /[^:]*:/ ) { n=split($i,A,":"); if (length(A[2]) && n==2) printf "%s -- %s\n",A[1], A[2] ; }} ' b.txt
LAN1 -- X.X.X.X/XX
LAN2 -- X.X.X.X/XX
LAN1 -- X.X.X.X/XX
LAN2 -- X.X.X.X/XX
답변2
이 시도:
grep -Po 'LAN2:\K(\d{1,3}.){3}\d{1,3}/\d*' file
이는 블록을 찾아 PATTERN:ipdigits.ipdigits.ipdigits.ipdigits/digits
해당 ipdigits.ipdigits.ipdigits.ipdigits/digits
부분을 인쇄합니다( \K
"깨끗한" 일치). 이는 ipdigits
1~3개의 문자를 포함해야 함을 의미합니다. 더 많은 필터를 적용할 수 있습니다(1~255와 일치).
시험
$ cat a
Junk Junk Junk : Junk Junk LAN2:123.123.2.2/56 Junk Junk
Junk Junk Junk : Junk Junk LAN3:22.33.44.55/22 Junk Junk
$ grep -Po 'LAN2:\K(\d{1,3}.){3}\d{1,3}/\d*' a
123.123.2.2/56