【问题标题】:Oneliner to calculate complete size of all messages in maillogOneliner 计算邮件日志中所有消息的完整大小
【发布时间】:2010-11-16 00:52:23
【问题描述】:

好吧,伙计们,我真的走投无路了,不知道还能尝试什么......

我正在为一些电子邮件统计编写一个脚本,它需要做的一件事是计算邮件日志中所有消息的完整大小,这是我到目前为止所写的:

egrep ' HOSTNAME sendmail\[.*.from=.*., size=' maillog | awk '{print $8}' |  
tr "," "+" | tr -cd '[:digit:][=+=]' | sed 's/^/(/;s/+$/)\/1048576/' |  
bc -ql | awk -F "." '{print $1}'

这是我的邮件日志中的示例行:

Nov 15 09:08:48 HOSTNAME sendmail[3226]: oAF88gWb003226:  
from=<name.lastname@domain.com>, size=40992, class=0, nrcpts=24,  
msgid=<E08A679A54DA4913B25ADC48CC31DD7F@domain.com>, proto=ESMTP,  
daemon=MTA1, relay=[1.1.1.1]

所以我会尝试一步一步解释:

首先,我通过 grep 查找包含实际“大小”的所有行,然后打印第 8 个字段,在本例中为“size=40992”。

接下来我用加号替换所有逗号字符。

然后我删除除数字和加号之外的所有内容。

然后我用“(”替换行首,然后用“)”替换最后一个额外的加号,然后是“/1048576”。所以我得到一个像这样的巨大表情:

"(1+2+3+4+5...+n)/1048576"

因为我想将所有单独的消息大小相加并除以得到以 MB 为单位的结果。

最后一个 awk 命令是当我得到一个十进制数时,我真的不关心精度,所以我只打印小数点之前的部分。

问题是,这行不通...我可以发誓它在某个时候有效,会不会是我的表情太长而无法处理?

感谢您花时间阅读:)

【问题讨论】:

    标签: bash sed awk grep bc


    【解决方案1】:

    我认为单行 awk 脚本也可以。它匹配您的 egrep 模式匹配的任何行,然后对于这些行,它用 = 符号拆分第八条记录,并将第二部分(数字)添加到 SUM 变量中。当它看到文件的 END 时,它会打印出 SUM/1048576 的值(或以 Mibibytes 为单位的字节数)。

    awk '/ HOSTNAME sendmail\[.*.from=.*., size=/{ split($8,a,"=") ; SUM += a[2] } END { print SUM/1048576 }' maillog
    

    【讨论】:

    • 哇,非常感谢,这是一个很棒的方法,而且运行速度非常快!正是我想要的:)
    • +1 它也明显更快。我选择上面的 grep/sed/tr/bc 的唯一原因是因为它更接近问题中的一个衬里
    【解决方案2】:
    • 如果输入中没有换行符,则 bc 会阻塞,就像您的表达式一样。您必须将 sed 部分更改为:

    sed 's/^/(/;s/+$/)\/1048576\n/'

    • 如果总大小小于 1MB 并且 bc 输出类似于 .03333334234 的内容,最终的 awk 会很高兴地吃掉所有输出。如果您对小数部分不感兴趣,请从 bc 中删除最后一个 awk 命令和 -l 参数。

    • 我会用这个单线做:

    grep ' HOSTNAME sendmail[[0-9][0-9]*]:..*:.*from=..*, size=' maillog | sed 's|.*, size=\([0-9][0-9]*\), .*|\1+|' | tr -d '\n' | sed 's|^|(|; s|$|0)/1048576\n|' |公元前

    【讨论】:

    • 感谢您提供如此快速而详尽的回答!嗯,似乎它不仅在换行符中,按照您的建议添加了它,仍然得到“(standard_in)1:解析错误”。试过你的代码,不幸的是它不起作用我得到一个:“sed:-e表达式#1,char 31:'s'命令的RHS上的无效引用\ 1”
    • @f10bit 抱歉,StackOverflow 在这里和那里吃了几个字符,请重试
    • @f10bit: 在原始命令中的 1048576 之后添加一个 \n 似乎在这里可以正常工作
    猜你喜欢
    • 1970-01-01
    • 2018-07-29
    • 1970-01-01
    • 1970-01-01
    • 2020-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多