我把它放在一起,但它很糟糕(例如,在那里的魔法数字,文本parsing..嘘!)
awk -F: '{if($3 >= 1000 && $3 < 2**16-2) print $1}' /etc/passwd
什么是正确的方法来做到这一点?
在Linux文件中只打印6个和10个字符
使用awk,grep,sedparsing大型日志文件(〜5gb)时的性能问题
如何使用awk忽略空白行和注释行
如何计算一个string出现在只有AWK的文本文件中的次数?
一些unix系统不使用/etc/passwd ,或者没有在那里指定的用户。 您应该使用getent passwd而不是读取/etc/passwd 。
我的系统也有用户被禁用,并可以更长的登录,他们的登录命令设置为/bin/false或/usr/sbin/nologin 。 你可能也想把它们排除在外。
这里是适用于我的,包括arheops awk命令和ansgar的代码,以从login.defs获取min和max:
getent passwd | grep -vE '(nologin|false)$' | awk -F: -v min=`awk '/^UID_MIN/ {print $2}' /etc/login.defs` -v max=`awk '/^UID_MAX/ {print $2}' /etc/login.defs` '{if(($3 >= min)&&($3 <= max)) print $1}' | sort -u
我不确定你为什么只做1000以上,从redhat系统启动500。
对于我这个awk脚本工作正常:
awk -F: '{if(($3 >= 500)&&($3 <65534)) print $1}' /etc/passwd
仅使用密码:
awk -F: '{if(!(( $2 == "!!")||($2 == "*"))) print $1}' /etc/shadow
从/etc/login.defs提取最小和最大用户ID,然后从/etc/passwd选择这些边距之间的ID的用户:
UID_MIN=$(awk '/^UID_MIN/ {print $2}' /etc/login.defs) UID_MAX=$(awk '/^UID_MAX/ {print $2}' /etc/login.defs) awk -F: -v min=$UID_MIN -v max=$UID_MAX '$3 >= min && $3 <= max{print $1}' /etc/passwd
这是另外一种只生成一个外部程序的方法, getent (由@AnsgarWiechers建议),以便使用本地和网络密码数据库。 这个将叉子的数量减少到只有一个叉子本身。 但是,它的可移植性受限于某些bash4。
get_users () { local IFS=$' t#' while read var val ; do case "$var" in UID_MIN) min="$val" ;; UID_MAX) max="$val" ;; esac done < /etc/login.defs declare -A users local IFS=: while read user pass uid gid gecos home shell; do if (( min <= uid && uid <= max )) && [[ ! $shell =~ '/(nologin|false)$' ]]; then users[$user]=1 fi done < <(getent passwd 2>/dev/null) echo ${!users[@]} }
所以你只是想从/ etc / passwd获取所有用户的列表? 如果是这样,我相信这将是一个更简单的解决方案:
cut -d":" -f1 /etc/passwd
编辑:
如果你只想要一个用户定义的用户(而不是系统用户)的列表,你可以使用其中的一个:
grep -E ":[0-9]{4,6}:[0-9]{4,6}:" /etc/passwd | cut -d: -f1
^这假定您的系统为用户定义的用户使用1000以上的UID和GID
grep /home /etc/passwd | cut -d: -f1
其他解决方案取决于更详细的标准和您的系统设置。
这是@ StephenOstermiller的答案的简化,只有两个过程才能完成。 我觉得也比较容易阅读(假如你熟悉awk NR==FNR习惯用法)。
getent passwd | awk 'NR==FNR { if ($1 ~ /^UID_(MIN|MAX)$/) m[$1] = $2; next } { split ($0,a,/:/); if (a[3] >= m["UID_MIN"] && a[3] <= m["UID_MAX"] && a[7] !~ /(false|nologin)$/) print a[1] }' /etc/login.defs -
两个输入的不同分割模式有点疣, 也许你可以修改更优雅的方式。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。