다른 용도로 특정 데이터와 형식을 추출하기 위해 데이터 파일을 어떻게 구문 분석할 수 있나요?

다른 용도로 특정 데이터와 형식을 추출하기 위해 데이터 파일을 어떻게 구문 분석할 수 있나요?

다양한 내용이 포함된 데이터 파일이 주어지면 먼저 IP 주소로 시작하지 않는 줄을 무시한 다음 IP 주소를 출력하고 그 뒤에 기호를 포함하지 않는 중괄호 안에 있는 문자열을 출력하고 싶습니다 =. 주어진 행에는 하나 이상의 문자열이 있을 수 있습니다.

예를 들어:

입력하다:

junk12  
junk34  
198.0.12.20 [ joker penguin character=villian ] blah  
198.0.13.20 [ super_man bat_man character=hero ] blah  
198.0.14.20 [ lois_lane character=damsel ] blah  
junk56  
junk78  

산출:

198.0.12.20 joker  
198.0.12.20 penguin  
198.0.13.20 super_man  
198.0.13.20 bat_man  
198.0.14.20 lois_lane  

답변1

이를 수행하는 방법은 여러 가지가 있을 수 있지만 awk다음과 같이 할 수 있습니다.

awk 'gsub(/^[0-9.]+ \[ /,$1 " ") { a=2; while (a<=NR && $a != "]") { if ($a !~ /=/) {print $1 " " $a } ; a++ } }'

이것을 좀 더 읽기 쉬운 것으로 나누어 보겠습니다.

gsub(/^[0-9.]+ \[ /,$1 " ") { .... }

이는 숫자와 마침표로 시작하고 그 뒤에 공백과 마침표가 오는 행과 일치합니다 [. 따라서 일치 10.20.30.40 [하지만 일치하지 않습니다 junk23. 이를 첫 번째 필드로 바꾼 다음 실행합니다 {...}.

그래서 다음과 같은 줄

198.0.12.20 [ joker penguin character=villian ] blah  

다음과 같은 섹션으로 이동합니다.

198.0.12.20 joker penguin character=villian ] blah  

이제 중간 부분이 나옵니다. 여러 줄로 작성하면 이해하기가 더 쉬울 수 있습니다.

a=2;
while (a<=NR && $a != "]")
{
  if ($a !~ /=/) {print $1 " " $a }
  a++;
}

따라서 두 번째 필드(이 경우 "clown")부터 시작하여 단어가 부족하거나 가 표시될 때까지 계속합니다 ]. 찾은 각 단어에 대해 an이 포함되어 있지 않으면 =A 필드(IP 주소)를 인쇄하고 단어.

결과:

198.0.12.20 joker
198.0.12.20 penguin
198.0.13.20 super_man
198.0.13.20 bat_man
198.0.14.20 lois_lane

(아마도 이보다 더 좋은 방법이 있을 것입니다!)

관련 정보