라이브 로그 파일의 행 일부만 표시

라이브 로그 파일의 행 일부만 표시

tail을 사용하여 라이브로 자주 팔로우하고 grep을 사용하여 관심 있는 라인을 필터링하는 로그 파일이 있습니다. 그러나 라인에는 항상 관심이 없는 많은 데이터가 포함되어 있지만 이를 파악하기가 어려웠습니다. 구문 분석하여 원하는 줄 부분만 볼 수 있습니다. 각 줄 항목의 형식은 주로 목록 태그와 따옴표로 묶인 데이터(때때로 공백 포함)입니다. 다음은 몇 가지 샘플(삭제된) 로그 줄입니다.

2017:11:29-11:29:56 filter-1 httpproxy[3194]: id="0001" severity="info" sys="SecureWeb" sub="http" name="http access" action="pass" method="CONNECT" srcip="10.11.12.13" dstip="14.3.1.4" user="" group="" ad_domain="" statuscode="200" cached="0" profile="REF_HttPro1234 (Campus2)" filteraction="REF_HttStu (Allow Policy)" size="6518" request="0x915a3e00" url="https://website.net/" referer="" error="" authtime="0" dnstime="1" cattime="73" avscantime="0" fullreqtime="61576999" device="0" auth="6" ua="" exceptions="" category="9998" reputation="unverified" categoryname="Uncategorized" country="United States" application="krux" app-id="826"
2017:11:29-11:29:56 filter-1 httpproxy[3194]: id="0001" severity="info" sys="SecureWeb" sub="http" name="http access" action="pass" method="GET" srcip="10.13.14.15" dstip="154.6.75.10" user="" group="" ad_domain="" statuscode="200" cached="0" profile="REF_HttPro1235 (Campus1)" filteraction="REF_HttStu (Allow Policy)" size="3161" request="0x6b4d5610" url="http://host.com/mini_banner.png" referer="http://www.web.com/computers.htm" error="" authtime="0" dnstime="0" cattime="64" avscantime="848" fullreqtime="50046" device="0" auth="6" ua="Mozilla/5.0 (X11; CrOS x86_64 9765.85.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.123 Safari/537.36" exceptions="" category="111" reputation="trusted" categoryname="Education/Reference" sandbox="-" content-type="image/png"

한 가지 주의할 점은 모든 태그가 모든 줄에 표시되지는 않는다는 것입니다. 예를 들어, application 및 app-id는 첫 번째 줄에 있지만 두 번째 줄에는 없습니다.

위의 행을 예제 입력으로 사용하여 출력으로 갖고 싶은 것의 예는 srcip, Categoryname 및 url 태그만 해당 순서대로 표시하는 것입니다. 원하는 출력은 다음과 같습니다.

10.11.12.13 Uncategorized https://website.net/
10.13.14.15 Education/Reference http://host.com/mini_banner.png

저는 표시되는 태그를 즉석에서 조정할 수 있도록 쉽게 적응할 수 있는 솔루션을 찾고 있습니다.

답변1

귀하의 데이터는 다음과 같이 고도로 구조화되어 있습니다.키="값", 따라서 키 이름 목록을 인수로 사용하고 해당 값만 인쇄하는 gnu awk를 사용하여 작은 쉘 스크립트를 작성할 수 있습니다. 예 myscript:

#!/bin/bash
awk -v lhs="$*" '
BEGIN{  FPAT = "[a-z-]*=\"[^\"]*\""
        nwant = split(lhs,want)
}
{       for(i=1;i<=NF;i++){
            start = match($i,/([a-z-]*)="([^"]*)"/,a)
            key[a[1]] = a[2]
        }
        for(i=1;i<=nwant;i++){printf "%s ",key[want[i]]; key[want[i]] = ""}
        printf "\n"
}'

당신은 myscript srcip categoryname url. 이는 awk 변수를 lhs인수에 단일 문자열로 설정하고 want처음에 배열로 분할됩니다. 행은 awk에 의해 패턴과 일치하는 필드로 나뉩니다.키="값"내장 FPAT변수를 사용하여.

match()각 줄에서 각 필드 에 대해 키와 큰따옴표로 묶인 부분에 대해 2개의 캡처된 그룹으로 나눕니다 . 이는 awk에 의해 array 에 배치되며 키 문자열로 색인화된 a연관 배열에 저장됩니다 .key

그런 다음 원하는 각 키에 대해 값을 인쇄하고 다음 줄에 대해 해당 값을 지웁니다(해당 줄에 이 키가 없는 경우). 분명히 이는 모든 데이터에 필요한 구조가 있고 값 내부의 (") 또는 알파벳이 아닌 문자가 있는 키를 처리하기 위해 변경이 필요하다고 가정합니다.


4.0 이전의 gnu awk(gawk) 버전에는 FPAT패턴과 일치하는 필드로 행을 분할하는 기능이 내장되어 있지 않으므로 직접 수행해야 합니다.

#!/bin/bash
awk -v lhs="$*" '
BEGIN{ nwant = split(lhs,want) }
{       input = $0
        while(match(input,"[a-z-]*=\"[^\"]*\"")>0){
            field = substr(input,RSTART,RLENGTH)
            input = substr(input,RSTART+RLENGTH)
            start = match(field,/([a-z-]*)="([^"]*)"/,a)
            key[a[1]] = a[2]
        }
        for(i=1;i<=nwant;i++){printf "%s ",key[want[i]]; key[want[i]] = ""}
        printf "\n"
}'

분명히 두 개의 일치 호출을 하나로 결합할 수 있지만 이는 원본과의 차이점을 보여줍니다.

답변2

(POSIX 호환) 사용 중 sed...

sed 's/.* srcip="\([^"]*\)" .* url="\([^"]*\)" .* categoryname="\([^"]*\)" .*/\1 \3 \2/' logfile

여기에는 멋진 내용이 없습니다. 키를 찾아 \(..\)역참조로 사용할 수 있도록 값을 괄호로 묶으면 됩니다. 그런 다음 요구 사항에 따라 공백으로 구분되고 순서가 지정된 역참조로 문자열을 대체합니다 \1 \3 \2.

산출:

10.11.12.13 Uncategorized https://website.net/
10.13.14.15 Education/Reference http://host.com/mini_banner.png

로그에 이러한 키가 모두 포함되지 않은 문자열이 포함된 경우 다음을 사용할 수 있습니다.

sed -n 's/.* srcip="\([^"]*\)" .* url="\([^"]*\)" .* categoryname="\([^"]*\)" .*/\1 \3 \2/p' logfile

그러면 패턴과 일치하는 줄만 인쇄됩니다.

물론 스트리밍 방식으로 사용하려면 파일 이름을 제거하고 다음을 수행하세요.[something sending logs to stdout] | sed ...

관련 정보