awk를 사용하여 문자열을 찾고 단어 경계에서 일치 항목을 인쇄합니다.

awk를 사용하여 문자열을 찾고 단어 경계에서 일치 항목을 인쇄합니다.

저는 awk를 처음 접했기 때문에 이 질문을 받았을 수도 있지만 문제에 대한 해결책을 찾을 수 없습니다.

awk를 사용하여 syslog에서 문자열을 검색하고 다음 단어 경계까지만 값을 인쇄하고 싶습니다.

규칙:

  • awk만 사용할 수 있습니다.
  • Linux에서는 한 줄 명령이어야 합니다.

테스트 데이터: 시스템 로그에는 방화벽이 패킷을 삭제할 때 생성된 항목이 포함됩니다. 이 정보 줄에는 여러 값이 포함되어 있으며 길이가 다양합니다(NF는 잊어버리세요). 소스 IP는 항상 SRC=로 시작합니다.

내가 지금까지 가지고 있는 것:

awk '/SRC=/ { print $13 }' /var/log/syslog*

그러나 문제는 필드 13이 항상 SRC 값이 아니라는 것입니다.

나머지 솔루션은 이 질문에서 볼 수 있습니다.제한된 초록 나열

답변1

암소 비슷한 일종의 영양awk해결책:

awk -v FPAT='SRC=[^[:space:]]+' 'NF{ print $1 }' /var/log/syslog*

이렇게 하면 처리된 레코드가 패턴과 일치하는 하나의 필드로만 좁혀집니다.SRC=[^[:space:]]+


시간 성능 확인( testlog22756줄 있음):

$ time(awk -v FPAT='SRC=[^[:space:]]+' 'NF{ print $1 }' testlog > /dev/null)

real    0m0.186s
user    0m0.164s
sys 0m0.000s

$ time(awk '{for(i=1;i<=NF;i++) {if ($i ~ /^SRC=/) print $i}}' testlog > /dev/null)

real    0m0.282s
user    0m0.256s
sys 0m0.000s

답변2

KISS 솔루션(모든 awk 버전에서 작동해야 함) - 필드를 반복하고 하나씩 테스트하면 됩니다.

awk '{for(i=1;i<=NF;i++) {if ($i ~ /^SRC=/) print $i}}' /var/log/syslog

관련 정보