You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 17:57:05