gpt4 book ai didi

linux - 对字符串数组中的唯一条目进行排序和计数

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:22:28 24 4
gpt4 key购买 nike

我需要做的是从 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

最佳答案

每个“用户名”字段实际上是一个可选的空用户名逗号分隔列表。要分隔用户名,您需要用逗号分隔条目。

如果我从你的循环开始,我可能会使用:

sorted=($(while IFS=: read -r Groups Tmp1 Tmp2 Usernames
do
if [ -n "$Usernames" ];
then
echo "$Usernames"
fi
done < /etc/group |
tr ',' '\n' |
sort -u
))

echo "${sorted[@]}"

这会绕过中间的 usernames 数组。如果你真的想要那样,那么保留你的原始循环并在 sort 之前通过 tr 命令将输入​​通过管道传递给 sort:

IFS=$'\n' sorted=($(tr ',' '\n' <<<"${usernames[*]}" | sort -u))

这会生成一个数组,sorted,其中包含按排序顺序排列的唯一名称列表。

如果您想要的只是唯一名称的计数,我可能会在 awk 中完成所有操作。事实上,我很想使用 awk 而不是 while 循环。

如果您想要计算每个唯一名称的出现次数,那么您可以使用 sort | 而不是 sort -u uniq -c。统计信息的选项和变体很多——关键是您需要用逗号分隔 /etc/group 文件的最后一个字段。如果您出于某种原因在该列表中有空格,您可能也必须摆脱它们。 tr ', ' '\n' 会那样做。

使用 awk,您可以:

awk -F: '{ n = split($4, a, ","); for (u = 1; u <= n; u++) count[a[u]]++i }
END { for (u in count) print u, count[u] }' /etc/group

它将第四个字段拆分为数组a,然后统计count数组中每个名字的出现次数。最后,它打印 count 数组中的条目。在我的 Mac 上,它产生了:

root 11
_warmd 1
_locationd 1
_jabber 2
_taskgated 1
_postfix 2
_devicemgr 4
_calendar 3
_cyrus 1
_teamsserver 6
_dovecot 1
_xserverdocs 1
_eppc 1
_softwareupdate 1

您可以根据需要进一步排序。

关于linux - 对字符串数组中的唯一条目进行排序和计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39511989/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com