다양한 내용이 포함된 데이터 파일이 주어지면 먼저 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
(아마도 이보다 더 좋은 방법이 있을 것입니다!)