尝试使用awk substr提取模式,但是我不知道如何删除换行符。我尝试获得overcloud-Controller-x
@Secured(Role.Code.ADMIN)
当我运行follow awk脚本时,总会有换行符。
| driver_info | {u'ipmi_password': u'******', u'ipmi_address':
u'10.x.x.x', u'deploy_ramdisk': u'de76fe92-8b1f-409b-ab9c-f50232c44f0b',
u'deploy_kernel': u'cb9c373e-c733-423a-a7a3-6a19b65b7d32',
u'ipmi_username': u'xxx'}
|
| instance_info | {u'root_gb': u'40', u'display_name':
u'overcloud-Controller-1', u'image_source': u'ea293064-cbbc-4635-9d5f-
50b91c8b20c0', u'capabilities': u'{"profile": "Controller", "boot_option":
"local"}', u'memory_mb': u'6144', u'vcpus': u'4', u'local_gb': u'837',
u'configdrive': u'******', u'swap_mb': u'0'} |
| name | server-1
| driver_info | {u'ipmi_password': u'******', u'ipmi_address':
u'10.x.x.y', u'deploy_ramdisk': u'de76fe92-8b1f-409b-ab9c-f50232c44f0b',
u'deploy_kernel': u'cb9c373e-c733-423a-a7a3-6a19b65b7d32',
u'ipmi_username': u'xxx'}
|
| instance_info | {u'root_gb': u'40', u'display_name':
u'overcloud-Controller-2', u'image_source': u'ea293064-cbbc-4635-9d5f-
50b91c8b20c0', u'capabilities': u'{"profile": "Controller", "boot_option":
"local"}', u'memory_mb': u'6144', u'vcpus': u'4', u'local_gb': u'837',
u'configdrive': u'******', u'swap_mb': u'0'} |
| name | server-2
输出:
awk '{match($0,/display_name/); nodename=substr($0,RSTART+17, RLENGTH+10); gsub(/ /, "",nodename);printf "(%s)\n",nodename}' alex-test.txt
请告知如何删除换行符?我在末尾使用tr -d'\ n',但它删除了所有换行符,因此它变成了一行。
(overcloud-Controller-1)
()
()
()
(overcloud-Controller-2)
()
()
预期输出:
(overcloud-Controller-1)()()()(overcloud-Controller-2)()()
为什么我要打印多余的换行符?有什么建议吗?看来printf也打印换行符。如果我只打印变量nodename,那么它也会解决我的问题。
我的真实数据只有3行,然后是服务器2的解析器
(overcloud-Controller-1)
(overcloud-Controller-2)
根据@ RavainderSing13的想法更新脚本并开始工作。我只是在awk前面添加了RS和FS,就是这样。谢谢。
| driver_info | {u'ipmi_password'
| instance_info | {u'root_gb': u'40
| name | server-1
答案 0 :(得分:1)
请您尝试以下。
awk -v RS="" -v FS="[|\n]" -v s1="'" '
{
for(i=1;i<=NF;i++){
if($i ~ /display_name/){
split($(i+1),array,"[,]")
sub(/^u/,"",array[1])
gsub(s1,"",array[1])
print "("array[1]")"
}
}
}' Input_file
输出如下。
(overcloud-Controller-1)
(overcloud-Controller-2)
恕我直言,为什么OP的代码也要打印额外的NULL值,因为OP没有检查条件,即字符串显示是否存在任何匹配项,所以即使它不存在,也正在打印,可能是打印{输出中为{1}}。
答案 1 :(得分:1)
根据@ RavainderSing13的想法更新脚本并开始工作。我只是在awk前面添加了RS和FS,就是这样。谢谢。
awk -v RS="" -v FS="[|\n]" '{match($0,/display_name/);
nodename=substr($0,RSTART+17, RLENGTH+10); gsub(/ /, "",nodename);printf
"(%s)\n",nodename}' ava-ipmi.txt
(overcloud-Controller-2)
(overcloud-Controller-0)
(overcloud-Controller-1)
答案 2 :(得分:0)
$ awk -v RS= -F\' '{print "("$34")"}' file
(overcloud-Controller-1)
(overcloud-Controller-2)