저는 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:]]+
시간 성능 확인( testlog
22756줄 있음):
$ 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