我正在深入研究一些电子邮件日志,我想查看哪些电子邮件超过了特定的大小。实际上,在日志中,我有文本'size ='后跟值。有没有办法在'size ='后面找到超过所选限制的所有值?
行示例:
Sep 2 02:11:27 mailsys postfix/qmgr[2989]: F24C712000BA: from=<root@mail.ro>, size=462, nrcpt=1 (queue active)
Sep 2 03:19:54 mailsys postfix/qmgr[2989]: 863AE1200097: from=<c.ivan@mail.ro>, size=554, nrcpt=1 (queue active)
Sep 2 04:01:34 mailsys postfix/qmgr[2989]: A763712000BA: from=<nbounce-24-512645-898600-d25ee-bc28d1c8@nzadev.eu>, size=39992, nrcpt=1 (queue active)
我想只输出超过10MB(10485760字节)的行的新文本文件。
答案 0 :(得分:3)
要获得大小超过39900的所有行,请使用:
$ awk -F'[ =]+' '$10+0>39900' file
Sep 2 04:01:34 mailsys postfix/qmgr[2989]: A763712000BA: from=<nbounce-24-512645-898600-d25ee-bc28d1c8@nzadev.eu>, size=39992, nrcpt=1 (queue active)
工作原理:
-F'[ =]+'
这告诉awk使用任何序列的空格或等号作为字段分隔符。使用以这种方式定义的字段分隔符,大小位于第十个字段$10
中。
$10+0>39900
如果字段10(大小)大于39900,则告诉awk打印该行。我们将0添加到字段10以确保awk将字段10视为数字,而不是字符串。
当然,你可以使用你想要的任何数字来代替39900。例如,使用10 MB,10485760:
awk -F'[ =]+' '$10+0>10485760' file
答案 1 :(得分:1)
假设size =前面有空格,我们可以这样做:
awk -v MIN_SIZE=10000 '{ SIZE = 0 } ; / size=[[:digit:]]/ { SIZE = $0 ; sub( /^.* size=/, "", SIZE ) ; sub( /[^[:digit:]].*$/, "", SIZE ) ; SIZE += 0 } ; SIZE > MIN_SIZE { print }' file
详情:
awk -v MIN_SIZE '
{
# Reset size for a new line
SIZE = 0
}
# Process any line including size=
/ size=[[:digit:]]/ {
SIZE = $0
# Removing anything before size=
sub( /^.* size=/, "", SIZE )
# Remove anything after the digits
sub( /[^[:digit:]].*$/, "", SIZE )
# Convert SIZE to a number
SIZE += 0
}
SIZE > MIN_SIZE {
print
}' file
答案 2 :(得分:0)
也可以使用match()
使用GNU awk
awk -v max_size=39990 'match($0,/size=([0-9]+)/,arr) && arr[1]>=max_size' logfile
其他awk
awk -v max_size=39990 'match($0,/size=[0-9]+/){s=substr($0,RSTART,RLENGTH);sub(/[^0-9]+/,"",s); }s+0>=max_size' logfile
更好的可读性
awk -v max_size=39990 '
match($0,/size=[0-9]+/){
s=substr($0,RSTART,RLENGTH);
sub(/[^0-9]+/,"",s);
}s+0>=max_size
' logfile
答案 3 :(得分:0)
$ awk '/, size=/ { # if there is size in the record
for(i=1;i<=NF;i++) # iterate all fields
if(/^size=/) { # starts with a size=
split($i,a,"=") # split at =
if(a[2]+0>39991) # compare the size value to threshold
print # output if needed
}
}' file
Sep 2 04:01:34 mailsys postfix/qmgr[2989]: A763712000BA: from=<nbounce-24-512645-898600-d25ee-bc28d1c8@nzadev.eu>, size=39992, nrcpt=1 (queue active)