/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

関連情報