我需要一个Unix命令,它会显示用逗号分隔的我的组列表。因此,groups $FT_USER
仅显示列表,但我需要将其分隔为以逗号分隔的列表!
答案 0 :(得分:1)
每当您想要将一组中的每个字符替换为另一组中的每个字符时,请使用tr
( tr ansliterate)。
在这种情况下,我们希望用逗号替换所有空格:
$ groups $FT_USER | tr ' ' ','
答案 1 :(得分:0)
您可以使用awk
groups | gawk -F " " '{$1=$1}1' OFS=","
使用groups命令的输出并通过awk程序读取它,-F " "
将其指定为空格分隔值。然后$1=$1
始终为真,我们只需使用新的输出字段分隔符打印输出即可。使用OFS=","
答案 2 :(得分:0)
请注意,这不适用于Cygwin。实际上,只要名称中有空格的组,它就不会起作用。我认为这通常只发生在Windows(Cygwin)上,但会导致错误的结果。我会很快给出一个导致问题的例子。
$ groups $FT_USER
Users CONSOLE LOGON Authenticated Users CurrentSession LOCAL
此处的群组为{'Users', 'CONSOLE LOGON', 'Authenticated Users', 'CurrentSession', 'LOCAL'}
。相信我,或者去看this post,其中有更多细节。
@Kusalananda之前给出的命令(将在大多数情况下工作)会产生以下错误输出。
$ groups $FT_USER | tr ' ' ','
Users,CONSOLE,LOGON,Authenticated,Users,CurrentSession,LOCAL
来自@SriniV的命令将提供相同的输出。一些群组名称是" split"。我们得到...,CONSOLE,LOGIN,...
而不是...,CONSOLE LOGIN,...
和...,Authenticated,Users,...
而不是...,Authenticated Users,...
(我知道,我知道:"你为什么使用Cygwin?"答案:这项工作需要它。)
要获得我们想要的输出,我们需要使用id
命令,该命令带有--zero
标志:
$ man id | grep -A 1 "\-\-zero"
-z, --zero
delimit entries with NUL characters, not whitespace;
然后我们可以使用@Kusalananda所描述的tr
或awk
@SriniV,分别。一个问题是,由于尾随,
,总会有一个尾随NUL
。这可以通过sed
命令来纠正,我们打印除最后一个逗号sed 's/\(.*\),/\1/'
之外的所有内容。请注意,.*
将打印所有内容,直到最后一个逗号。 \1
打印(反斜杠转义)括号中的所有内容,即\1
将打印.*
\(.*\),
部分找到的内容
让我们用tr
$ id --zero -Gn $FT_USER | tr '\0' ',' | sed 's/\(.*\),/\1/'
Users,CONSOLE LOGON,Authenticated Users,CurrentSession,LOCAL
现在,我们将使用awk
$ id --zero -Gn $FT_USER | gawk -F "\0" '{$1=$1}1' OFS="," | sed 's/\(.*\),/\1/'
Users,CONSOLE LOGON,Authenticated Users,CurrentSession,LOCAL
如果你觉得(就像我一样)最后sed
有点作弊,可以选择以下方式:
$ id -Gnz $FT_USER | awk 'BEGIN{FS="\0"; OFS=","}{NF--; print}'
Users,CONSOLE LOGON,Authenticated Users,CurrentSession,LOCAL
另请注意,无论您在上方看到--zero -Gn
,都可以将其替换为-Gnz
。 -G
打印出当前用户所属的所有组,-n
打印名称,而不是组ID(GID),-z
执行我们所描述的--zero
做上面的