首页 > 解决方案 > 邮件帐户和松散文件夹使用 AWK 向 CSV 报告。如何从这个例子中实现这一点?

问题描述

我正在使用这个 shellscript为每个用户生成收件箱列表和所有文件夹的大小,如下所示:

john.doe@mydomain.com's max mailbox size = 0 MB, current mailbox size = 18,78 GB.

size (MB)  msgcount     unread folder
--------- --------- ---------- ----------------------------
        0         0          0 /Chats
       42         0            /Drafts
    13118     28014         37 /Inbox
        0         6          0 /Junk
        0         1          0 /Orders
      323     13385         17 /Raster
     5772      3760          0 /Sent
        1       183          0 /Payments
        0         2          0 /Trash
-------------------------------------------------------

我需要从中挖掘数据并将其放入 CSV,在每行我将拥有电子邮件帐户以及 Trash、Sent 和 Junk 文件夹值的值。问题在于“收件箱”,因为如您所见,用户在树之外创建了文件夹(如“光栅”和“付款”)。所以我需要找到一种方法来总结这份报告中每个用户的所有不是“thrash/sent/junk”的东西。

标签: shellawkzimbra

解决方案


以下内容awk可以作为起点。它收集数据,并将数据读入内存,并在 END 事件时打印摘要。

awk -v OFS=, '
function do_print () {
        print user, s_trash, n_trash, s_sent, n_sent, s_junk, n_junk, s_other, n_other
}

/max mailbox/ { user = $1 ;
        s_trash = n_trash = s_sent = n_sent = s_junk = n_junk = s_other = n_other = 0
        next ;
}
    # Parse lines starting with '/'
$4 ~ /^\/Trash/ { s_trash += $1 ; n_trash += $2 ; next }
$4 ~ /^\/Sent/ { s_sent += $1 ; n_sent += $2 ; next }
$4 ~ /^\/Junk/ { s_junk+= $1 ; n_junk += $2 ; next }
   # Everything else goes to other
$4 ~ /^\// { s_other += $1 ; n_other = $2 ; next }

  # Print whenever there is a line of '='
/==================/ { do_print() }

END { do_print() }
'


推荐阅读