使用awk字符类正则调用gsub时输出异常的技术咨询
问题:awk使用字符类替换时输出异常
先看df -h /的原始输出:
$> df -h / Filesystem Size Used Avail Use% Mounted on rootfs 476G 370G 106G 78% /
当显式匹配大写G做gsub替换时,输出符合预期:
$> awk -v indrive="/dev/sda1" 'NR!=1{gsub(/G/,""); print $2,$4,indrive}' <(df -h /) 476 106 /dev/sda1
但使用字符类[[:alpha:]]或[a-zA-Z]做通用替换时,输出异常:
awk -v indrive="/dev/sda1" 'NR!=1{gsub(/[[:alpha:]]/,""); print $2,$4,indrive}' <(df -h /) 370 78% /dev/sda1
更新:使用[a-zA-Z]也得到相同异常结果,而使用[[:upper:]]时输出恢复正常。
原因解析
问题核心是字段分隔被破坏:
- awk默认以空白字符作为字段分隔符,原始行的字段顺序是:$1=rootfs,$2=476G,$3=370G,$4=106G,$5=78%,$6=/
- 当用
[[:alpha:]]或[a-zA-Z]替换时,会匹配rootfs里的所有小写字母,把rootfs变成空字符串。此时整行的字段顺序彻底打乱:原来的$2(476G)变成新的$1,原来的$3(370G)变成新的$2,原来的$5(78%)变成新的$4 - 所以执行
print $2,$4时,输出的就是370和78%,和预期不符 - 而使用
[[:upper:]]时,只会匹配大写的G,rootfs里的小写字母不受影响,字段分隔保持原样,因此输出正常。
内容的提问来源于stack exchange,提问作者Adam D.
相关产品推荐
相关产品推荐

