如何使用bash从每行日志文本中提取指定ID(手机号)与PIN码
问题原因
你编写的脚本逻辑是提取每行所有纯数字串按顺序拼接,会把日期、时间戳、流水号等无关数字全部纳入输出,不符合需求。
正确实现方案
方案1:一行sed命令(推荐)
直接使用sed正则捕获定位ID和PIN对应的值,性能更高写法更简洁:
sed -nE 's/.*ID[^0-9]*([0-9]+).*PIN[^0-9]*([0-9]+).*/\1#\2/p' logfile.log
正则说明:
-E启用扩展正则表达式,避免过多转义符-n关闭默认输出,只打印匹配成功的行.*ID[^0-9]*([0-9]+)匹配到ID标识后,跳过所有非数字字符,捕获后续连续数字(即ID值)存入分组1.*PIN[^0-9]*([0-9]+)匹配到PIN标识后,跳过所有非数字字符,捕获后续连续数字(即PIN值)存入分组2\1#\2将两个分组值按要求的格式拼接输出
方案2:修改原while循环写法
如果你需要保留bash循环的写法,可以用bash内置的正则匹配实现:
while read -r line; do # 正则匹配ID和PIN对应的值 if [[ $line =~ ID[^0-9]*([0-9]+).*PIN[^0-9]*([0-9]+) ]]; then echo "${BASH_REMATCH[1]}#${BASH_REMATCH[2]}" fi done < logfile.log
两种方案运行后都会输出预期结果:
0214736848#4581 0214736457#6193 0214736849#5949
内容的提问来源于stack exchange,提问作者Baguma
相关产品推荐
相关产品推荐

