繁体   English   中英

如何在不以“特定字符”结尾的 bash 中显示所有用户

[英]How to show all users in bash which does not end with “specific character”s

system中所有名称中没有结尾字符的用户a , s , t , r , m , z必须显示在 Bash 中。

用户名可以从/etc/passwd文件的第一列中获得。 但我无法感知从搜索中排除这些字符的正确方法。

我应该使用 grep 吗? 还是只是一个切口?

就像是

grep -o '^[^:]*[^astrmz:]:' /etc/passwd | tr -d :

或者

cut -d: -f1 /etc/passwd | grep '[^astrmz]$'

[^blah]匹配除列出的字符之外的任何字符,与[blah]相反。

GNU grep使用前瞻

grep -Po '^[^:]*[^astrmz:](?=:)' /etc/passwd

或者使用awk代替:

awk -F: '$1 ~ /[^astrmz]$/ { print $1 }' /etc/passwd

或者在没有外部命令的纯bash中:

while IFS=: read -r name rest; do
  if [[ $name =~ [^astrmz]$ ]]; then
    echo "$name"
  fi
done < /etc/passwd

如您所见,有很多潜在的方法。

使用bash时简单的一个衬垫:

compgen -u | grep -v '[astrmz]$'

compgen -u命令将产生一个用户列表(没有/etc/passwd中存在的所有额外字段); compgenbash中的内置函数,通常用于用户名补全。

这应该可以解决问题:

cut -d: -f1 /etc/passwd | grep -vE 's$|t$|r$|m$|z$'

cut 命令从密码文件中删除用户名。 然后 grep -v (不匹配) grep -E 进行多重匹配(OR OR OR) $ 符号表示要匹配的最后一个字符

例如,在我的 Mac 上,我得到:

_gamecontrollerd
_ondemand
_wwwproxy
_findmydevice
_ctkd
_applepay
_hidd
_analyticsd
_fpsd
_timed
_reportmemoryexception

(您会看到没有以这 5 个字母结尾的名称)。

祝你好运。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM