我要执行此任务,必须从/ etc / shadow中提取用户名和哈希密码,但是用sed命令替换流时遇到了问题。
我已经尝试过以下命令:
sed '/s/*/NoPassword/; s/!/LockedPassword/' /etc/shadow | awk -F: '{ print $1" "$2 }' > passwords.txt
在替换“!”时效果很好使用LockedPasswords,但某些用户使用“ !!”在字段中而不是“!”,因此我尝试了其他命令。
这些完全没有结果,包含一个或多个问号的密码字段保持不变
sed '/s/*/NoPassword/; s/!+/LockedPassword/' /etc/shadow | awk -F: '{ print $1" "$2 }' > passwords.txt
sed '/s/*/NoPassword/; s/!{1,2}/LockedPassword/' /etc/shadow | awk -F: '{ print $1" "$2 }' > passwords.txt
似乎是什么问题?我只是linux和regex的初学者。
答案 0 :(得分:4)
使用awk时,您永远不需要sed。您的整个命令行可以是:
awk -F':' '{sub(/\*/,"NoPassword"); sub(/!+/,"LockedPassword"); print $1, $2}' /etc/shadow > passwords.txt
答案 1 :(得分:1)
+
和{
}
都需要在Sed中转义。因此,在解决此问题后,您的两种尝试都应该起作用:
sed '/s/*/NoPassword/; s/!\+/LockedPassword/' /etc/shadow | awk -F: '{ print $1" "$2 }' > passwords.txt
sed '/s/*/NoPassword/; s/!\{1,2\}/LockedPassword/' /etc/shadow | awk -F: '{ print $1" "$2 }' > passwords.txt
答案 2 :(得分:0)
使用-E
标志:
sed -E '/s/*/NoPassword/; s/!+/LockedPassword/' /etc/shadow | awk -F: '{ print $1" "$2 }' > passwords.txt