逗号分隔的列表来自$ FT_USER

时间:2016-07-05 15:03:26

标签: unix

我需要一个Unix命令,它会显示用逗号分隔的我的组列表。因此,groups $FT_USER仅显示列表,但我需要将其分隔为以逗号分隔的列表!

3 个答案:

答案 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所描述的trawk @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做上面的