如何在/etc/group中按字母顺序对成员进行排序?

如何在/etc/group中按字母顺序对成员进行排序?

在我的/etc/group文件中,我有各种文件共享所需的组,并列出了它们的成员。其中一些列表很长,我想找到一种方法来对它们进行排序会员每组的。有简单的方法吗?

我在 Debian 9 上使用 Bash。

到目前为止,我了解了如何选择一个组,并按字母顺序对成员进行排序:

grep groupa /etc/group | cut -d":" -f4 | tr "," "\n" | sort

这需要已知组的名称。

答案1

读取组文件中的每一行。用逗号分割成员,对它们进行排序,然后再次将它们连接在一起。打印该行以及其他未触及的组件。

while IFS=: read u x g members
do
    members=$(tr ',' '\n' <<<"$members" | sort | xargs | tr ' ' ',')
    printf "%s:%s:%d:%s\n" "$u" "$x" $g "$members"
done </etc/group

答案2

您可以使用 Awk 或 Perl:

gawk -F: '
  $4 != "" {
    n = split($4,a,/,/);
    asort(a);
    for (i=1;i<n;i++) printf "%s,", a[i];
    print a[n]
  }
' /etc/group

或者

perl -F: -lne '
  print join ",", sort split /,/, $F[3] if $F[3] =~ /\S/
' /etc/group

两者都会跳过成员列表为空的组;如果您愿意,您也可以省略该测试和/或重写其他字段,例如。

$ perl -F: -lne 'print join ":", @F[0..2], join ",", sort split /,/, $F[3]' /etc/group > group.sorted
$
$ diff /etc/group group.sorted 
5c5
< adm:x:4:syslog,steeldriver
---
> adm:x:4:steeldriver,syslog

相关内容