是否有一个简单的命令可以找出 linux sendmail 队列中每个域的当前消息数?mailq 会转储出一个详细列表,但不方便快速概览。
我正在使用 Centos 和 sendmail。
mailq -v | egrep -v '^-' | get_domains.pl | sort | uniq -c
But the above command output is as following:
1 domain.com>
上述命令不能满足我的要求,请提供这方面的帮助。
以下是更新后的输出:
domain.com> has 5 message(s)
domain.com.pk> has 1 message(s)
abc.com.pk> has 2 message(s)
xyz.coinfo.net.cn> has 1 message(s)
mmm.com> has 1 message(s)
答案1
好吧,如果您要使用 perl,不妨一路使用下去。
以下是计算每个域的消息数量的一种相当不完善的方法:
#!/usr/bin/perl
use strict;
my @mailq = `cat /home/users/rilindo/mailq`; #Had to simulate the output of the mail command here. Change this to the actual mailq path, e.g. /usr/bin/mailq
my %domains = ();
foreach my $m (@mailq) {
$m =~ s/^\s+//;
$m =~ s/\s+$//;
$m =~ s/>//;
next if $m =~ /Queue/;
if ($m =~ /\d\d:\d\d:\d\d/) {
$domains{(split(/@/,$m))[1]}++;
}
else {
$domains{(split(/@/,$m))[1]}++;
}
}
foreach my $d (keys %domains) {
print $d . " has $domains{$d} message(s)" . "\n";
}
本质上,我们将 mailq 命令的输出发送到数组中并进行迭代。对于数组中的每个记录,我们删除前导和尾随空格/换行符,然后在“@”符号处拆分。然后我们将域作为键插入(如果不存在),然后在哈希中增加它。在下一次尝试时,如果找到相同的域,它将简单地增加值。从那里,我们循环遍历哈希,然后打印出域和匹配总数。
结果:
[rilindo@localhost ~]$ ./parsemail.pl
domain.com has 6 message(s)
domain3.com has 2 message(s)
domain1.com has 2 message(s)
就像我说的,它并不完美,但它能完成工作。即使没有别的,它也能让你知道接下来该怎么做。
顺便说一句,既然你似乎了解 Perl,那么回顾一下 Perl 的哈希数据结构将会非常有用:
http://www.cs.mcgill.ca/~abatko/computers/programming/perl/howto/hash/
或者:
答案2
尝试这个:
# mailq -v | awk 'BEGIN { FS = "@" } \
!/^[a-zA-Z0-9-]|^[ \t]+(\(|\/|Total requests:)/ { print $2 }' | sort | uniq -c
答案3
“简单”是相对的。mailq 的输出解析起来非常麻烦,但还是可以做到的。典型的mailq
详细输出如下:
-Queue ID- --Size-- ----Arrival Time---- -Sender/Recipient-------
637F5CFF9C* 1497 Sat Dec 18 21:40:34 [email protected]
[email protected]
637F5CFF9d* 1497 Sat Dec 18 21:40:35 [email protected]
[email protected]
一些创造性的技巧可以让你得到你需要的东西:
首先,你需要删除最上面的那行 - 它对人类有用,但与我们的解析目标无关。
最简单的方法:mailq -v | egrep -v '^-'
现在您要获取收件人信息并提取域名。Perl 是您的好朋友 - 通过这个方便的脚本(我们称之为get_domains.pl
)传输输出:
#!/usr/bin/perl
$/ = "\n\n"; # Use a blank line as the separator.
while (<>) {
($x,$recip) = split(/\n/, $_); # Extract the recipient line
($user,$domain) = split(/@/, $recip); # Get the domain.
print "$domain\n"; # Print Recipient Domain
}
这只剩下简单的部分——计算域(通过管道sort | uniq -c
)。
因此mailq -v | egrep -v '^-' | get_domains.pl | sort | uniq -c
会给你类似的输出:
1 domain.com
1 domain2.com