这是来自 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
在我工作的地方有点挑剔。我看过其他一些帖子,例如this one , 但它没有我想要的答案。
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)
最佳答案
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
很难写出比这更短的东西。
此外,如果您已经精通 sed
和 regex
,那么 perl
可以很好地添加到您的技能列表中。
如 Ed Morton 所述,当前 perl
命令在输出末尾生成一个额外的 EOL
。如果要删除它,可以使用以下增强的 perl
命令:
$ id | perl -pe "s/.*=/,/;s/,(\d+)\(([^)]+)\)/'\2',\1\n/g;s/\n\n/\n/"
谢谢 Ed !!!
关于regex - 每行一个输出组,带有组名和组 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50382257/