如何用sed在authorized_keys中保留alice的最后一个公钥并删除其余?
问题场景
authorized_keys文件中存在多个Alice的公钥条目,希望仅保留最后一个(最新添加的)公钥,删除所有旧的Alice公钥,且不确定旧密钥的具体数量,需要实现原地编辑文件的通用方法。
解决方案
方法一:用awk一次性处理(推荐)
这个方法可以直接遍历文件,保留所有非Alice的行,同时仅保留最后一个Alice的行,操作简洁且安全:
# 第一步:先备份原文件,防止操作失误 cp authorized_keys authorized_keys.bak # 第二步:处理文件,保留非Alice行和最后一个Alice行 awk '/alice/{last=$0; next} {print} END{if(last) print last}' authorized_keys > temp && mv temp authorized_keys
命令解释:
/alice/{last=$0; next}:匹配到包含alice的行时,将该行内容存入变量last,并跳过当前行(不打印旧的Alice密钥){print}:所有不包含alice的行直接输出,保留其他用户的密钥END{if(last) print last}:处理完所有行后,若存在Alice的密钥,就打印最后保存的那一行
方法二:先提取最后一个Alice密钥再替换
如果更习惯用grep和sed组合,可以分两步操作:
# 备份原文件 cp authorized_keys authorized_keys.bak # 提取最后一个Alice的公钥内容 last_alice=$(grep -n alice authorized_keys | tail -n1 | cut -d: -f2-) # 删除所有Alice的旧密钥,再追加最后一个密钥 sed -i '/alice/d' authorized_keys && echo "$last_alice" >> authorized_keys
命令解释:
grep -n alice authorized_keys:列出所有含alice的行并显示行号tail -n1:取最后一行(即最新的Alice密钥)cut -d: -f2-:去掉行号,仅保留公钥内容sed -i '/alice/d' authorized_keys:删除文件中所有含alice的行echo "$last_alice" >> authorized_keys:将最后一个Alice密钥追加到文件末尾
注意事项
- 操作前务必备份原文件,避免数据丢失
- 如果需要更精准匹配Alice的密钥(比如避免误匹配其他含
alice字符串的行),可以修改grep的匹配规则,例如匹配行尾的注释部分:grep -E 'alice(@|\-.+)$' authorized_keys
内容的提问来源于stack exchange,提问作者vinWin
相关产品推荐
相关产品推荐

