Linux shell下校验竖线数量的正则及大文件高效校验方案
需求实现方案
1. 匹配指定竖线数量的正则表达式
仅校验每行竖线数量严格等于N(示例中N=10)的正则规则如下:
^([^|]*\|){N}[^|]*$
规则说明:
^匹配行首,$匹配行尾,确保校验覆盖整行内容[^|]*匹配任意数量的非竖线字符(含空值、带空格的字母数字串,完全符合字段要求)([^|]*\|){N}重复N次「任意内容+1个竖线」的组合,刚好匹配N个竖线- 结尾的
[^|]*匹配最后一个竖线之后的字段内容
如果要匹配10个竖线的行,把N替换为10即可:^([^|]*\|){10}[^|]*$
Shell中使用示例(grep实现):
输出所有竖线数量不等于10的错误行:
grep -vE '^([^|]*\|){10}[^|]*$' input.txt
2. 比sed更快的校验方案
处理数万行的场景,awk的性能远高于sed和正则grep,因为awk原生支持字段分隔符判断,不需要做复杂的正则匹配:
实现逻辑:
N个竖线对应N+1个字段,直接判断每行的字段数量是否等于11(对应10个竖线)即可,命令如下:
# 输出所有错误行的行号和对应竖线数量 awk -F '|' 'NF != 11 {print "错误行号:"NR",实际竖线数量:"NF-1}' input.txt
极速校验(仅判断是否存在错误,不需要明细):
遇到第一个错误就直接退出,适合大文件快速校验:
awk -F '|' 'NF != 11 {exit 1}' input.txt if [ $? -eq 0 ]; then echo "所有行格式校验通过" else echo "存在格式错误的行" fi
性能对比参考:
相同10万行样本下的处理速度排序:awk > grep -E > sed,其中awk的处理速度是sed的3-5倍。
内容的提问来源于stack exchange,提问作者Shubham Patwa
相关产品推荐
相关产品推荐

