これらのDHCPログを人間が読めるようにする方法は?

これらのDHCPログを人間が読めるようにする方法は?

次の入力があります。

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 ""
    }
  }'

おすすめ記事