Canadian Luke Asked: 2019-05-11 09:54:45 +0800 CST2019-05-11 09:54:45 +0800 CST 2019-05-11 09:54:45 +0800 CST 如何在 /etc/group 中按字母顺序对成员进行排序? 772 在我的/etc/group文件中,我列出了各种文件共享所需的组,并列出了它们的成员。其中一些列表很长,我想找到一种方法来对每个组的成员进行排序。有没有简单的方法? 我在 Debian 9 上使用 Bash。 到目前为止,我发现了如何选择一个组,并按字母顺序对他们的成员进行排序: grep groupa /etc/group | cut -d":" -f4 | tr "," "\n" | sort 这需要已知组的名称。 debian sort 2 个回答 Voted Best Answer roaima 2019-05-11T10:22:23+08:002019-05-11T10:22:23+08:00 从组文件中读取每一行。用逗号分隔成员,对它们进行排序,然后再次将它们连接在一起。使用其他未触及的组件打印该行。 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 steeldriver 2019-05-11T10:46:53+08:002019-05-11T10:46:53+08:00 您可以使用 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
从组文件中读取每一行。用逗号分隔成员,对它们进行排序,然后再次将它们连接在一起。使用其他未触及的组件打印该行。
您可以使用 Awk 或 Perl:
或者
两个都跳过具有空成员列表的组;如果您愿意,您可以省略该测试和/或重新编写其他字段,例如。