如何用Bash脚本从i2cdetect输出中提取I2C地址
从i2cdetect输出中提取I2C地址的实用方法
Hey there! 从VxWorks转Linux还能这么快上手,必须给你点个赞😉。针对你要从i2cdetect输出里提取I2C地址(包括UU这种标记)的需求,我给你整理几个用sed、awk和grep实现的方案,都是日常运维里常用的:
方法1:用grep直接匹配(最简洁)
grep的-o选项可以只输出匹配到的内容,结合正则表达式就能精准抓出我们要的地址:
i2cdetect -y -r 3 | grep -oE '[0-9a-f]{2}|UU'
- 解释:
[0-9a-f]{2}匹配两位十六进制地址,|UU同时匹配标记为UU的设备;-E启用扩展正则,-o只输出匹配片段。 - 如果只想提取纯十六进制地址(排除
UU),把正则改成[0-9a-f]{2}即可。
方法2:用awk处理结构化输出
awk擅长处理表格类文本,刚好适配i2cdetect的行列输出:
i2cdetect -y -r 3 | awk '{ for(i=2; i<=NF; i++) { # 跳过每行开头的"xx:"字段 if($i != "--") { # 过滤掉空地址标记"--" print $i } } }'
- 解释:
NF代表当前行的总字段数,从第2个字段开始遍历,只要不是--就打印,完美提取所有有效地址。
方法3:用sed做文本替换后拆分
如果偏好sed,可以通过替换和拆分来实现:
i2cdetect -y -r 3 | sed -n ' s/^[0-9a-f][0-9a-f]: //; # 删除每行开头的地址段标记(比如"00:") s/ -- / /g; # 把所有空地址"--"替换成空格 s/^ *//; s/ *$//; # 去掉行首尾的空格 p' | tr ' ' '\n' | grep -v '^$' # 把空格换成换行,过滤空行
- 这个步骤稍多胜在直观,适合理解文本处理的逻辑。
以上几种方法都能满足你的需求,选最顺手的用就行~
内容的提问来源于stack exchange,提问作者Ali
相关产品推荐
相关产品推荐

