bba*_*025 6 regex bash awk sed
以下是id命令中有关我所属组的信息.我已经做到了,所以输出会更容易阅读.我从命令行返回时"完全"包含此输出.(谢谢@EdMorton.)
$id
uid=1(me) gid=545(Users) groups=545(Users),66049(CONSOLE LOGON),11(Authenticated Users),4095(CurrentSession),66048(LOCAL)
Run Code Online (Sandbox Code Playgroud)
这是我想要的输出,逗号分隔,每个行有一个组名和它的GID:
$ some-great-command
'Users',545
'CONSOLE LOGON',66049
'Authenticated Users',11
'CurrentSession',4095
'LOCAL',66048
Run Code Online (Sandbox Code Playgroud)
我想出了一个可怕的方法来做到这一点:
$ id | sed 's/\(.*groups=\)\(.*$\)/\2/' | awk -F "," '{ for(i = 1; i <= NF; i++) print $i;}' | sed 's/\(^[[:digit:]]\+\)[(]\([A-Za-z +_]\+\)[)]$/'"'"'\2'"'"',\1/'
Run Code Online (Sandbox Code Playgroud)
(我将再次使用更好的屏幕格式,使用\)
$ id | sed 's/\(.*groups=\)\(.*$\)/\2/' | \
awk -F "," '{ for(i = 1; i <= NF; i++) print $i;}' | \
sed 's/\(^[[:digit:]]\+\)[(]\([A-Za-z +_]\+\)[)]$/'"'"'\2'"'"',\1/'
Run Code Online (Sandbox Code Playgroud)
但我不禁想到必须有一种更好(或至少更短,更优雅)的方式来完成这个过程.谁能分享这样的解决方案?
注意:我这样做的一个原因是,有时,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)
Run Code Online (Sandbox Code Playgroud)
实际id输出:
$ id
uid=1(me) gid=545(Users) groups=545(Users),66049(CONSOLE LOGON),11(Authenticated Users),4095(CurrentSession),66048(LOCAL)
Run Code Online (Sandbox Code Playgroud)
有来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
Run Code Online (Sandbox Code Playgroud)
说明:
将执行两个find和replace命令:
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/"
Run Code Online (Sandbox Code Playgroud)
谢谢Ed!
awk -v RS=, -F'[()=]' '{print "\047"$(NF-1)"\047,"$(NF-2)}'
Run Code Online (Sandbox Code Playgroud)
例如,给出这个输入数据:
$ cat file
uid=1(me) gid=545(Users) groups=545(Users),66049(CONSOLE LOGON),11(Authenticated Users),4095(CurrentSession),66048(LOCAL)
Run Code Online (Sandbox Code Playgroud)
并用来cat file代替id:
$ cat file | awk -v RS=, -F'[()=]' '{print "\047"$(NF-1)"\047,"$(NF-2)}'
'Users',545
'CONSOLE LOGON',66049
'Authenticated Users',11
'CurrentSession',4095
'LOCAL',66048
Run Code Online (Sandbox Code Playgroud)