Awk Sed查找并将结果分配给多个变量

时间:2015-12-21 19:00:38

标签: linux bash awk sed

我必须读取一个大文件并找到FamlyType的出现。一旦我找到了,我需要分配在faimlytype部分下面的内容,在这些部分下我需要为变量分配多个数据点,以便我进行进一步的测试。

FamilyType

FamilyKind              String      G
userName:               String:     MATT_HANS
serviceList:           String:         H2O
hostList:               String:     159.220.108.80
protocol:               String:         UDP
portNumber:             Numeric:        8149
port:                  String:      TCPIP


FamilyType

FamilyKind              String      f
userName:               String:     Geroge_lucas
serviceList:           String:      WWW
hostList:               String:     159.220.108.70
protocol:               String:     TCP
portNumber:             Numeric:    8166
port:                  String:      TCPIP

所以我需要在我的脚本中编写一个例程来查找Familtype然后分配用户名&服务专员hoslist和portNumebrto变量 所以结果应该是

请注意,每个变量前面都有很多前导空格

userName1="MATT_HANS"
serviceList1="H2O"
hostList1:"159.220.108.80"
portNumber1="8149"

userName2="Geroge_lucas"
serviceList2="WWW"
hostList2:"159.220.108.70"
portNumber2="8166"

我正在使用Bounre shell / Bash
是否可以使用sed或awk在一次运行中执行此操作?如果您提供任何帮助,请解释命令;所以我将来也可以使用它

1 个答案:

答案 0 :(得分:3)

awk救援!

$ awk -v q="\"" '/FamilyType/{f=1} 
    f && /userName|serviceList|hostList|portNumber/
                   {sub(":","1=",$1); 
                    print $1 q $3 q
                   } 
           /port:/{f=0;print ""}' file

userName1="MATT_HANS"
serviceList1="H2O"
hostList1="159.220.108.80"
portNumber1="8149"

userName1="Geroge_lucas"
serviceList1="WWW"
hostList1="159.220.108.70"
portNumber1="8166"

PS。你的hostList有":"签名,这将所有内容转换为" ="标志。如果不是拼写错误你需要专门处理它,但我不认为需要它。

更新:为变量后缀设置增量计数器。

$ awk -v q="\"" '/FamilyType/{f=1;c++} 
  f && /userName|serviceList|hostList|portNumber/
                             {sub(":",c"=",$1); 
                              print $1 q $3 q
                             } 
                      /port:/{f=0;print ""}' file

userName1="MATT_HANS"
serviceList1="H2O"
hostList1="159.220.108.80"
portNumber1="8149"

userName2="Geroge_lucas"
serviceList2="WWW"
hostList2="159.220.108.70"
portNumber2="8166"