특정 문자가 포함된 줄을 기반으로 한 AWK 그룹화

특정 문자가 포함된 줄을 기반으로 한 AWK 그룹화

소스는 다음과 같습니다.

test/snmp/result/08-28-2016_12-30/AAAAA/hostname01_192.168.1.1
161/udp open  snmp
| snmp-brute: 
|   comstring1 - Valid credentials
|_  comstring2 - Valid credentials
test/snmp/result/08-28-2016_12-30/AAAAA/hostname02_192.168.1.2
161/udp open  snmp
| snmp-brute: 
|   comstring1 - Valid credentials
|_  comstring1 - Valid credentials

위의 텍스트를 어떻게 구문 분석하여 다음과 같이 만들 수 있습니까?

08-28-2016_12-30|AAAAA|hostname01|192.168.1.1|comstring1-Valid credentials -- comstring1 - Valid credentials
08-28-2016_12-30|AAAAA|hostname02|192.168.1.2|comstring1-Valid credentials -- comstring1 - Valid credentials

주요 문제는 코드가 "|" 또는 "|_" 문자를 기준으로 그룹화할 수 없다는 것입니다. 코드를 많이 변경했지만 성공하지 못했습니다. 예를 들면 다음과 같습니다.

awk '{ORS=($0 !~ "_"?FS:RS)}1'

답변1

스크립트는 레코드 구분 기호나 필드 구분 기호를 사용하여 특별한 작업을 수행할 필요가 없습니다. 예제 입력 및 출력이 주어지면 스크립트는 네 가지 행 유형 중 두 가지만 찾으면 됩니다.

test/snmp/result/08-28-2016_12-30/AAAAA/hostname01_192.168.1.1

(이것은최대문자 로 구분됨 /) 및

|   comstring1 - Valid credentials

일치는 정규식을 통해 수행할 수 있습니다.

스크립트는 첫 번째 줄 스타일과 일치해야 합니다. 예를 들어 다음과 같습니다.

/^.*\/.*\/.*\// {
    split($0, "/", fields);
    # ...more work needed :-)

다음을 사용하여 문자를 split기반으로 배열 로 /자릅니다 .subsubstrindex"hostname01_192.168.1.1").

printf완료되면 두 번째 라인 유형에서 메시지를 추출한 후 완료될 변수를 제공합니다 . 그렇게 하려면 30줄의 스크립트가 필요할 수 있습니다.

답변2

해결책은 다음과 같습니다.TxR. 이 파일 data에는 질문의 데이터가 그대로 포함되어 있습니다. reformat.txr다음을 포함합니다:

@(collect)
test/snmp/result/@date/@label/@{host}_@ipaddr
@port/udp open  snmp
| snmp-brute:@(skip)
@  (collect :gap 0)
|   @string - @val
@  (end)
|_  @endstring - @endval
@  (merge string string endstring)
@  (merge val val endval)
@(end)
@(output)
@  (repeat)
@date|@label|@host|@ipaddr|@(rep)@string - @val -- @(last)@string - @val@(end)
@  (end)
@(end)

달리기:

$ txr reformat.txr data
08-28-2016_12-30|AAAAA|hostname01|192.168.1.1|comstring1 - Valid credentials -- comstring2 - Valid credentials
08-28-2016_12-30|AAAAA|hostname02|192.168.1.2|comstring1 - Valid credentials -- comstring1 - Valid credentials

TXR은 많은 작업을 들이지 않고, 구조가 변경되거나 새로운 사례에 적응해야 할 때 추가 작업을 들이지 않고 느슨하게 구조화된 데이터에서 텍스트를 추출하는 데 적합합니다.

TXR 추출 작업 작성은 일반적으로 실제 샘플 데이터와 출력을 파일에 복사하여 붙여넣은 .txr다음 캡처 변수와 지침을 추가하여 조정하는 것으로 시작됩니다. 작업 스크립트는 데이터 자체에서 생성됩니다.

데이터 구조는 생성된 코드에서 여전히 어느 정도 식별 가능합니다.

답변3

해결되었습니다 :)

awk '$0!~/(161|brute)/ {if ($0~/_/)ORS="\n"; else ORS="";print}'

관련 정보