다음 출력이 포함된 파일이 있습니다.
ora.abc.db
1 ONLINE ONLINE serverA Open
2 ONLINE ONLINE serverB Open
ora.xyz.db
1 ONLINE ONLINE serverA Open
2 ONLINE ONLINE serverB Open
2 ONLINE ONLINE serverC Open
이 파일의 형식을 다음과 같이 지정하고 싶지만 을 사용하고 싶습니다 shell script
. awk를 사용할 수 있다고 생각하지만 논리가 없습니다.
abc abc1 ONLINE serverA
abc abc2 ONLINE serverB
xyz xyz1 ONLINE serverA
xyz xyz2 ONLINE serverB
xyz xyz3 ONLINE serverC
답변1
이는 다음과 같은 방법일 수 있습니다.
$ awk '/^ora/ {split($0,a,"."); next} {print a[2], a[2]$1, $2, $4}' a
abc abc1 ONLINE serverA
abc abc2 ONLINE serverB
xyz xyz1 ONLINE serverA
xyz xyz2 ONLINE serverB
xyz xyz2 ONLINE serverC
설명하다
/^ora/
로 시작하는 줄에 적용됩니다ora
. 여기서split
콘텐츠는 포인트를 기반으로 하며.
배열에 저장됩니다a
. 그래서a[1]=ora
,a[2]=abc
, ...이고 다음 줄로next
점프합니다 .awk
print
배열의 두 번째 필드a
와 행의 다른 요소를 인쇄합니다.$1
첫 번째 필드를 선언하고$4
네 번째 필드를 선언합니다.
답변2
약간 확장되었지만 기본적으로는 동등한 스크립트:
{
if($0 ~ /^ora/) { # look for lines starting (^) with "ora"
split($0, temp, "."); # find the elements of the line an put in array
serverName = temp[2]; # the "middle bit" - what was found between two dots
next; # nothing else to do with this line
}
else {
print serverName, serverName$1, $3, $4; # string together the bits
# note that each $n corresponds to the nth "word"
# by default fields are separated by white space
# you can set the variable FS to something else (e.g. FS=",")
# to deal with other formate
}
}
파일에 넣고 server.awk
입력이 있으면 log.txt
다음으로 호출하십시오.
awk -f server.awk log.txt
설명이 가치를 더해주기를 바랍니다.