如何用Awk替换/etc/passwd中为空/含空格/制表符的密码字段
如何用Awk修改/etc/passwd中的密码字段?
你已经能准确筛选出目标行啦,要实现替换其实只需要在原Awk命令基础上添加字段修改和完整输出的逻辑就行,我给你整理好两种场景的命令:
基础替换并输出结果
直接执行这个命令就能看到修改后的内容(不会改动原文件,先验证效果):
awk -F":" 'BEGIN {OFS=":"} ($2 == "" || $2 ~ /^[ \t]+$/) { $2 = "x" } 1' /etc/passwd
命令细节解释:
-F":":和你原来的命令一样,指定冒号作为字段分隔符BEGIN {OFS=":"}:设置输出字段分隔符也是冒号,不然修改后输出的行字段会变成用空格分隔,这很关键!($2 == "" || $2 ~ /^[ \t]+$/):我把你原来的判断改成了正则匹配,这样不仅能匹配单个空格/制表符,还能覆盖多个空格/制表符的情况,更全面{ $2 = "x" }:符合条件时,把第2个字段(密码字段)替换成字符x- 最后的
1:Awk里非0值都代表真,这里会触发默认的print $0操作,也就是输出所有行——不管有没有修改的行都会被输出
直接修改原文件(谨慎操作!)
如果验证效果没问题,要直接修改/etc/passwd的话,Awk本身不能直接编辑原文件,需要借助临时文件中转:
# 先备份原文件,一定要做! cp /etc/passwd /etc/passwd.bak # 执行替换并覆盖原文件 awk -F":" 'BEGIN {OFS=":"} ($2 == "" || $2 ~ /^[ \t]+$/) { $2 = "x" } 1' /etc/passwd > temp_passwd && mv temp_passwd /etc/passwd
示例效果
你原来筛选出的行:
user1::53556:100::/home/user1:/bin/bash
user2: :53557:100::/home/user2:/bin/bash
user3: :53558:100::/home/user3:/bin/bash
执行命令后会变成:
user1:x:53556:100::/home/user1:/bin/bash
user2:x:53557:100::/home/user2:/bin/bash
user3:x:53558:100::/home/user3:/bin/bash
内容的提问来源于stack exchange,提问作者MrJohn
相关产品推荐
相关产品推荐

