我在 AWS 实例上,需要列出此实例上的所有用户名。像这样简单的东西:
ls /home > users.txt
就足够了,但是我需要遍历每个名称并检查其PID编号,如果用户没有PID编号(即非零返回值(,那么我想从我创建的用户文本文件中删除它。
我尝试了以下方法,但收到许多错误:
#!/bin/bash
ls /home > users_inc.txt
while read line
do
id -u $line
if [$? -e 0]
then
echo $line > users.txt
fi
done < users_inc.txt
对于 bash 脚本来说相当新,任何帮助将不胜感激。
使用awk
的替代方法:
getent passwd|awk 'BEGIN{FS=":"}{if(match($6,"/home/"$1)&&$3>=1000)print$1}'
getent passwd
:流帐户记录数据库awk 'awk script'
:执行awk脚本来解析帐户记录
awk
脚本:
BEGIN{
FS=":"
}
{
if (match($6, "/home/"$1) && $3>=1000)
print $1
}
BEGIN{}
: Awk 初始化块对整个输入流执行一次。FS=":"
: 将:
定义为Field S补偿器
{}
:为输入流的每一行或每条记录执行主代码块。if (match($6, "/home/"$1) && $3>=1000)
:如果字段 #6 witch 是主目录路径匹配/home/username
(字段 #1(&&
和字段 #3 UID>=
大于或等于1000
(普通帐户的最小 UID(print $1
:然后打印字段#1中的用户名。
修改了脚本,修复了以下问题:
cd /home || { printf '%sn' "Can't cd to /home" >&2; exit 1; }
for user in *; do
if id -u "$user" >/dev/null 2>&1; then
printf '%sn' "$user"
fi
done > /path/to/users.txt
假设你的意思是ID而不是PID。
相关:
- 为什么在 Bash 中应该在"["之后和"]"之前有一个空格?
- 在 Bash 中,双方括号 [[ ]] 是否比单方括号 [ ] 更可取?
- 在 Bash 脚本中引发错误