我必须读取一个大文件并找到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在一次运行中执行此操作?如果您提供任何帮助,请解释命令;所以我将来也可以使用它
答案 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"