소스는 다음과 같습니다.
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
기반으로 배열 로 /
자릅니다 .sub
substr
index
"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}'