bash - 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
解决方案
推荐阅读
- javascript - jquery/javascript 冲突错误,jquery 旧版本有问题
- google-cloud-platform - 更新我的项目的范围后,谷歌身份验证令牌会起作用吗?
- javascript - 为什么说我不能设置属性 fontSize 因为某些东西是未定义的?
- windows - 如何在不重定向到 WOW6432Node 的情况下使用 32 位 Powershell 访问 64 位注册表项
- laravel-5 - 在 2 模型中使用 try catch 时如何修复 laravel 中的回滚事务?
- swift - 检查用户是否已经在 SwiftyStoreKit 中购买了产品
- python-3.x - 如何从 python3 中解开 python 2 中的 sklearn.tree.DescisionTreeRegressor
- eslint - ESLint 规则强制对单参数箭头函数不使用括号
- docker - 创建服务失败并显示“未指定命令”
- python - 如何从最后一行开始对时间序列数据进行反向重采样?