用单个awk命令

时间:2016-02-29 16:06:41

标签: bash awk sed

所以我有这行代码,我一直试图转换为只有一个awk命令,但到目前为止一直没有成功(没有显示)。我不是awk最有经验的人,所以我仍然在研究它的用途。如果有人能给我一些指导并指出我做错了什么,我将不胜感激。这个单行命令将拉出所有用户的列表,并删除它周围的所有不必要的信息,只显示一个名称列表。

ipa group-show ipausers | grep "Member users: | sed "s/,//g" |
sed "s/Member users: //g" | sort

我尝试了几种不同的方法,但我尝试过的最新方法是

ipa group-show | awk '/Member users/ { sub ("Member users: ", "") }'

这什么都没显示......

根据我的理解,awk能够很容易地搜索和删除多余的文本,并且对于我想要实现的内容将是一个可靠的用例。我只是无法完成我正在尝试的事情。引出了几个问题......将grepsed替换为awk的理想情况,或grepsed是否应该使用awkipa group-show这个案例?我对Group name: ipausers Description: something something Member users: user1, user2, user3, user4, user5 Member of group: something something 做错了什么(可能很多我肯定哈哈)。

来自user1 user2 user3 user4 user5

的示例文字
Icon

我想展示:

TextIcon

3 个答案:

答案 0 :(得分:3)

这个怎么样:

awk -F': ' '/Member users:/{print $2}' file

-F:将该行拆分为:<space>分隔的字段。这样,所有用户名都可以从$2获得。

更新

在评论中,您提醒我您也要删除,。对不起,错过了。根据以上命令,您可以使用gsub(),替换为$2中的空格。

awk -F': ' '/Member users:/{gsub(","," ",$2); print $2}' file

答案 1 :(得分:1)

您还可以将其缩减为单个(GNU)sed命令:

$ sed -n '/^Member users: /{s///;s/,//gp}' infile
user1 user2 user3 user4 user5

这会阻止使用-n打印,然后仅处理以Member users开头的行,然后删除该术语(s///重复并删除最后一个匹配项)和所有逗号。

一个版本(我认为 - 未经测试)可以与BSD sed一起使用(最后用分号分隔):

sed -n '/^Member users: /{s///';'s/,//gp;}' infile

答案 2 :(得分:1)

我可能会这样做:

perl -ne 's/.* users: // && print join " ", split /, /'

剥去该行的前导部分,然后在“,”

上“拆分”该行的其余部分

可以在那里轻松添加排序

perl -ne 's/.* users: // && print join " ", sort split /, /'