首页 > 解决方案 > Bash 解析大型日志文件

问题描述

我是 bash、awk、脚本的新手;所以请帮助我改进。

我有大量的文本文件,每个都有几百 MB 的大小。不幸的是,它们并非都以任何一种格式完全标准化。另外,这里有很多遗留物,还有很多垃圾和乱码。我希望检查所有这些文件以查找具有有效电子邮件 ID 的行,如果存在,则将其打印到名为电子邮件 ID 的第一个字符的文件中。因此,多个文本文件被解析并组织成名为 az 和 0-9 的文件。如果电子邮件地址以特殊字符开头,则它将被写入名为“_”下划线的文件中。该脚本还修剪行以删除空格;并替换单引号和双引号(这是应用程序要求)

我的脚本工作正常。这里没有错误/错误。但这非常慢。我的问题:有没有更有效的方法来实现这一目标?解析 30 GB 日志需要我大约 12 小时 - 太多了!grep/cut/sed/another 会更快吗?

示例 txt 文件

!bar@foo.com,address
#john@foo.com;address
john@foo.com;address µÖ
email1@foo.com;username;address
email2@foo.com;username
  email3@foo.com,username;address   [spaces at the start of the row]
 email4@foo.com|username|address   [tabs at the start of the row]

我的代码:

awk -F'[,|;: \t]+' '{
    gsub(/^[ \t]+|[ \t]+$/, "")
    if (NF>1 && $1 ~ /^[[:alnum:]_.+-]+@[[:alnum:]_.-]+\.[[:alnum:]]+$/)
    {
        gsub(/"/, "DQUOTES")
        gsub("\047", "SQUOTES")
        r=gensub("[,|;: \t]+",":",1,$0)
        a=tolower(substr(r,1,1))
        if (a ~ /^[[:alnum:]]/)
            print r > a
        else
            print r > "_"
    }
    else
        print $0 > "ErrorFile"
}' *.txt

标签: bashawksedgrep

解决方案


推荐阅读