2014-09-30 57 views
1

對/ etc/group文件中的組成員進行排序的最佳方式是什麼?Shell或Perl腳本/如何在/ etc/group中對組成員進行排序?

例如

tomcat::201:root,tux23,alex 
ftp::66000:tom,alex,mike 

我需要以下的輸出:提前

tomcat::201:alex,root,tux23 
ftp::66000:alex,mike,tom 

感謝, 禮服

+3

你想用這個做什麼?你能提供一些更多的細節。可能會有一些選擇! – 2014-09-30 10:14:36

回答

2

您可以使用Perl一個襯墊在每行上排列用戶名,

perl -pe 's|([^:\n]+)$| join ",", sort split /,/, $1 |e' /etc/group 

輸出

tomcat::201:alex,root,tux23 
ftp::66000:alex,mike,tom 
0

這裏是基於awk一個解決方案:

awk -F: '{ split($4, a, ","); 
      n = asort(a); 
      s = a[1]; 
      for(i = 2; i <= n; ++i) { s = s "," a[i] } 
      print $1":"$2":"$3":"s 
     }' /etc/group 
+0

我已經嘗試了您的解決方案,但我總是得到以下錯誤:「awk:非法引用數組a」 – tux20 2014-09-30 11:53:58

+0

您使用的是什麼系統?上面的作品在GNU/Linux上... – isedev 2014-09-30 11:59:54

+0

我已經使用了一個Solaris盒子。感謝您的回答。 – tux20 2014-09-30 12:04:26

0

另一個Perl的單行:

perl -F: -lape 's#$F[3]#join ",",sort split /,/,$F[3]#e' /etc/group 

perl -F: -lane 'print join ":",@F[0..2],join ",",sort split /,/,$F[3]' /etc/group 
0

另一個perl的一個襯裏:

perl -ne 'if (/(.*:\d+:)(.*)/) {print $1.join(",",sort(split(/,/,$2)))."\n";}' /etc/group