【发布时间】:2017-01-23 12:45:52
【问题描述】:
我需要做的是从etc/group获取用户列表,然后对其进行排序,然后计算唯一条目。
现在我只能设法获取用户名。但我怀疑这是错误的。
#!/bin/bash
usernames=();
while IFS=: read -r Groups Tmp1 Tmp2 Username
do
if [ $Username!="" ];
then
usernames+=($Username);
fi;
done < /etc/group
然后我也尝试排序,但是输出非常很奇怪:
排序:
IFS=$'\n' sorted=($(sort <<<"${usernames[*]}"))
unset IFS
输出:
echo ${usernames[@]}
echo ""
echo ${sorted[@]}
结果:
root root root root root root _teamsserver root root _taskgated root root,_jabber,_postfix,_cyrus,_calendar,_dovecot _calendar,_jabber,_postfix _devicemgr,_teamsserver _eppc root _teamsserver _devicemgr _softwareupdate _locationd _teamsserver _devicemgr,_calendar,_teamsserver,_xserverdocs _teamsserver,_devicemgr _warmd
_calendar,_jabber,_postfix _devicemgr _devicemgr,_calendar,_teamsserver,_xserverdocs _devicemgr,_teamsserver _eppc _locationd _softwareupdate _taskgated _teamsserver _teamsserver _teamsserver _teamsserver,_devicemgr _warmd root root root root root root root root root root root,_jabber,_postfix,_cyrus,_calendar,_dovecot
我的 bash 经验为零,绝对无法让它发挥作用。
我需要最基本的解决方案来从 /etc/group 中获取用户名的排序列表,其中仅包含唯一条目并打印每个条目的重复次数。
例如,如果我有这个 /etc/group 文件:
nobody:*:-2:
nogroup:*:-1:
wheel:*:0:root
daemon:*:1:root
kmem:*:2:root
sys:*:3:root
tty:*:4:root
operator:*:5:root
mail:*:6:_teamsserver
我想得到这个:
root 6
_teamsserver 1
【问题讨论】:
-
请添加可验证的样本 i/p 和预期的 o/p。您的
/etc/group文件和您的输出格式。 -
试试
cut -d: -f1 /etc/group | sort | uniq -c -
刚刚添加了想要的例子
-
@spasic:需要
cut -d: -f4 /etc/group | tr ',' '\n' | sort -u | wc -l来计算唯一名称,或者cut -d: -f4 /etc/group | tr ',' '\n' | sort | uniq -c来计算每个唯一名称的出现次数。 -
您需要在
[:[ "$Username" != "" ]内的运算符周围添加空格。
标签: linux bash macos sorting unix