首页 > 解决方案 > 每行一个输出组,带有组名和组 ID

问题描述

这是命令中有关我所属组的信息id我已经做到了,所以输出会更容易阅读。我将这个输出“完全”包括在内,因为它是从命令行返回的。(感谢@EdMorton。)

$id
uid=1(me) gid=545(Users) groups=545(Users),66049(CONSOLE LOGON),11(Authenticated Users),4095(CurrentSession),66048(LOCAL)

这是我想要的输出,以逗号分隔,每行有一个组名及其 GID:

$ some-great-command
'Users',545
'CONSOLE LOGON',66049
'Authenticated Users',11
'CurrentSession',4095
'LOCAL',66048

我想出了一个可怕的方法来做到这一点:

$ id | sed 's/\(.*groups=\)\(.*$\)/\2/' | awk -F "," '{ for(i = 1; i <= NF; i++) print $i;}' | sed 's/\(^[[:digit:]]\+\)[(]\([A-Za-z +_]\+\)[)]$/'"'"'\2'"'"',\1/'

(我会用更好的屏幕格式再次把它放在这里,使用\

$ id | sed 's/\(.*groups=\)\(.*$\)/\2/' | \
awk -F "," '{ for(i = 1; i <= NF; i++) print $i;}' | \
sed 's/\(^[[:digit:]]\+\)[(]\([A-Za-z +_]\+\)[)]$/'"'"'\2'"'"',\1/'

但我不禁认为必须有更好的(或至少更短更优雅)的方式来完成这个过程。任何人都可以分享这样的解决方案吗?

注意:我这样做的一个原因是,有时getent group GID我工作的地方有点挑剔。我看过其他一些帖子,例如这个,但它没有我想要的答案。

一个更易读的id输出版本,与控制台提供的不同!后面有换行符(Users)(注意右括号后面的空格)和后面(LOCAL),(逗号后面没有空格)。

$ id
uid=1(me) gid=545(Users) 
groups=545(Users),66049(CONSOLE LOGON),
11(Authenticated Users),4095(CurrentSession),66048(LOCAL)

实际id输出:

$ id
uid=1(me) gid=545(Users) groups=545(Users),66049(CONSOLE LOGON),11(Authenticated Users),4095(CurrentSession),66048(LOCAL)

标签: regexbashawksed

解决方案


来了perl

$ id | perl -pe "s/.*=/,/;s/,(\d+)\(([^)]+)\)/'\2',\1\n/g"                                                                 
'arobert',1000
'adm',4
'cdrom',24
'sudo',27
'dip',30
'plugdev',46
'lpadmin',113
'sambashare',128

说明:

将执行两个查找和替换命令:

  • s/.*groups=/,/用于删除组定义之前的所有内容
  • s/,(\d+)\(([^)]+)\)/'\2',\1\n/g将采取以下行动详述@demo

写比这更短的东西会很困难。此外,如果您已经擅长sedand regexperl那么添加到您的技能列表中可能是一个不错的加分项。

正如Ed Morton所提到的,当前命令在输出末尾perl生成一个额外的。EOL如果要删除它,可以使用以下增强perl命令:

$ id | perl -pe "s/.*=/,/;s/,(\d+)\(([^)]+)\)/'\2',\1\n/g;s/\n\n/\n/"

谢谢埃德!!!_


推荐阅读