Почтовые аккаунты и свободные папки отправляются в CSV с помощью AWK. Как этого добиться на этом примере? - PullRequest
0 голосов
/ 17 октября 2019

Я использую этот шеллскрипт для генерации списка входящих сообщений и размеров всех папок для каждого пользователя следующим образом:

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» для каждого пользователя из этого отчета.

1 Ответ

0 голосов
/ 17 октября 2019

Следующее 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() }
'

...