概要
ファイルの特定の列に含まれているIPv6をフル表記にしたい。
実行結果
(時間、ipv6、メッセージ)のセットのデータを、(時間時間、ipv6、ipv6フル表記、メッセージ)のセットへ変換する。
・入力ファイル
sample.txt
2016/08/08 22:00:00 2001:0db8:bd05:01d2:288a:1fc0:0001:10ee aaa
2016/08/08 22:01:00 2001:0db8:0020:0003:1000:0100:0020:0003 bbb
2016/08/08 22:02:00 2001:db8:20:3:1000:100:20:3 ccc
2016/08/08 22:03:00 2001:0db8:0000:0000:1234:0000:0000:9abc ddd
2016/08/08 22:04:00 2001:db8::1234:0:0:9abc eee
2016/08/08 22:05:00 2001:db8::9abc fff
2016/08/08 22:06:00 127.0.0.1 ggg
・変換用シェル
GetIPv6FullAddress.sh
#!/bin/sh
inf=$1
cat ${inf} |
awk ' \
# v6フル表記変換 \
function v6Full(v6ip, v6full, cnt, array, i ) { \
cnt = split(v6ip, array, ":" ) ; \
if(cnt == 1) { return v6ip ; } \
for(i=0; i<=8-cnt; i++) { \
sub("::", ":0000::", v6ip) ; \
} \
sub("::", ":", v6ip) ; \
cnt = split(v6ip, array, ":") ; \
for(i=1; i<=8; i++) { \
v6full = sprintf("%s%04s:", v6full, array[i]) ; \
} \
sub(":$", "", v6full) ; \
return v6full ; \
} \
# メイン処理 \
{ \
fullip = v6Full($3, a, cnt, array, i) ; \
printf("%s %s %-39s %-39s %s\n", $1, $2, $3, fullip, $4) ; \
} \
'
・実行結果
$ sh v6FullAddress.sh sample.txt
2016/08/08 22:00:00 2001:0db8:bd05:01d2:288a:1fc0:0001:10ee 2001:0db8:bd05:01d2:288a:1fc0:0001:10ee aaa
2016/08/08 22:01:00 2001:0db8:0020:0003:1000:0100:0020:0003 2001:0db8:0020:0003:1000:0100:0020:0003 bbb
2016/08/08 22:02:00 2001:db8:20:3:1000:100:20:3 2001:0db8:0020:0003:1000:0100:0020:0003 ccc
2016/08/08 22:03:00 2001:0db8:0000:0000:1234:0000:0000:9abc 2001:0db8:0000:0000:1234:0000:0000:9abc ddd
2016/08/08 22:04:00 2001:db8::1234:0:0:9abc 2001:0db8:0000:0000:1234:0000:0000:9abc eee
2016/08/08 22:05:00 2001:db8::9abc 2001:0db8:0000:0000:0000:0000:0000:9abc fff
2016/08/08 22:06:00 127.0.0.1 127.0.0.1 ggg
参考文献
下記参考にさせていただきました。
http://blog.n-z.jp/blog/2014-06-14-jus-usp.html