次の入力があります。
Sep 23 13:43 192.168.6.200
Sep 23 13:44 192.168.6.166
Sep 23 13:45 192.168.6.200
Sep 23 13:46 192.168.6.166
Sep 23 13:47 192.168.6.200
Sep 23 13:48 192.168.6.166
Sep 23 13:49 192.168.6.176
Sep 23 13:49 192.168.6.200
Sep 23 13:50 192.168.6.166
Sep 23 13:51 192.168.6.176
Sep 23 13:51 192.168.6.200
Sep 23 13:52 192.168.6.166
Sep 23 13:54 192.168.6.166
Sep 23 13:54 192.168.6.176
Sep 23 13:56 192.168.6.176
Sep 23 13:57 192.168.6.166
次の出力が必要です。
Sep 23 13:43 192.168.6.200
Sep 23 13:51 192.168.6.200
Sep 23 13:44 192.168.6.166
Sep 23 13:57 192.168.6.166
Sep 23 13:49 192.168.6.176
Sep 23 13:56 192.168.6.176
だから私が生成したOpenWrtルーターのDHCPログがあります。 (私は「5m」のdhcpリースでdhcpサーバーを設定しました):
logread | fgrep DHCPACK | awk '{print $1" "$2" "$3" "$8}' | sed 's/:[0-9][0-9] / /g' | sort -u
しかし、言及すべき入力は言及された出力ですが、どうすればよいですか? Perlの専門家はいますか? :\ :D
ベストアンサー1
awkは(最大)fgrepとsedの親セットなので、3つすべてを呼び出す必要はありません。
logread | awk '
/DHCPACK/ {
sub(/:..$/,"",$3)
t = $1 " " $2 " " $3
if (!($8 in first)) first[$8] = t
last[$8] = t
}
END {
for (i in first) {
print first[i], i
print last[i], i
print ""
}
}'
特別な順序で表示されませんが。 IPアドレスがログに最初に表示される順序で表示されるようにするには、次のように変更できます。
logread | awk '
/DHCPACK/ {
sub(/:..$/,"",$3)
t = $1 " " $2 " " $3
if (!($8 in first)) {
first[$8] = t
ip[n++] = $8
}
last[$8] = t
}
END {
for (i = 0; i < n; i++) {
print first[ip[i]], i
print last[ip[i]], i
print ""
}
}'