regex - 每行一个输出组,带有组名和组 ID

标签 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)

这是我想要的输出,以逗号分隔,每行有一个组名及其 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

很难写出比这更短的东西。 此外,如果您已经精通 sedregex,那么 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/

相关文章:

正则表达式问题通过 curl 向 Varnish 服务器发送 BAN 请求

javascript - 括号内的算术运算 javascript

linux - Rsync 从本地文件夹到 NAS 并在之后删除内容

linux - 在字符串之前提取 IP

awk - awk 中唯一文本的计数不正确

python - 切片正则表达式反向引用?诺坎多?

javascript - 在动态字符串之前和之后插入字符串

bash - "Yarn: command not found"即使安装后

bash - xargs 不会在 aws cli 输出中的空格上进行分割

linux - 从 Shell 中的目录连接大量选择性文件