在 NetBSD 中从文本文件的特定行获取特定单词

在 NetBSD 中从文本文件的特定行获取特定单词

如何从如下列表中提取成员名称并将其输出到新文件中?

Group-name supernatural 
Members admin, Admin1, John, sam, dean 
Group-id 405

newfile.txt 的预期输出:

admin
Admin1
John
sam
dean

答案1

$ awk '/^Members/ { for (i=2; i<=NF; ++i) { sub(",$", "", $i); print $i } }' file
admin
Admin1
John
sam
dean

这用于awk查找以字符串 开头的任何行Members。当找到这样的行时,它会从第二个字段开始迭代该行的空白分隔字段。每个字段在打印在自己的行上之前都会删除其尾随逗号(如果存在)。

如果您想保存输出,请将输出重定向到新文件,使用

awk ...as above... file >newfile

使用sed

$ sed -n '/^Members[[:blank:]]*/{ s///; s/,[[:blank:]]*/,/g; y/,/\n/; p; }' file
admin
Admin1
John
sam
dean

这会找到以该字符串开头的行Members,然后删除该字符串及其后面的任何空白(制表符或空格)。然后,它会删除该行其余部分中任何逗号后面的空格,并将逗号更改为换行符,然后再打印结果列表。

使用 GNU sed,您可以结合

s/,[[:blank:]]*/,/g; y/,/\n/; p;

进入

s/,[[:blank:]]*/\n/gp;

答案2

您可以尝试使用以下 awk 和 sed 命令组合

awk '/^Members/{$1=" ";print $0}' filename |sed "s/,/\n/g"| sed -r "s/^\s+//g"

输出

admin
Admin1
John
sam
dean

答案3

用 python 尝试过,效果很好

#!/usr/bin/python
import re
import subprocess
k=re.compile(r'^Members')
y=open('u.txt','r')
for  i in y:
        if re.search(k,i):
            k=re.sub("Members"," ",i)
            print re.sub(",","\n",k).strip()
praveen@praveen:~$ 

输出

admin
 Admin1
 John
 sam
 dean

答案4

 for member in $(cat /tmp/yourfile.txt | grep Members | cut -d' ' -f2-); do 
          echo $member | cut -d, -f1  
 done

结果:

admin
Admin1
John
sam
dean

如果文件中有多个“成员”行,它就会起作用。

相关内容