次の出力を含むファイルがあります。
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
配列の2番目のフィールドa
と行の他の要素を印刷します。$1
最初のフィールドを宣言し、$4
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
説明が価値を加えてくれることを願っています。