AWK字符串和值大于

时间:2017-09-11 06:35:04

标签: linux awk

我正在深入研究一些电子邮件日志,我想查看哪些电子邮件超过了特定的大小。实际上,在日志中,我有文本'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字节)的行的新文本文件。

4 个答案:

答案 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)