如何在awk中使用substr搜索模式并提取
尝试使用awk substr提取模式,但我不知道如何删除换行符。我试着去拿超云控制器x如何在awk中使用substr搜索模式并提取,awk,sed,Awk,Sed,尝试使用awk substr提取模式,但我不知道如何删除换行符。我试着去拿超云控制器x | 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'
| 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
当我运行follow awk脚本时,总是有换行符
awk '{match($0,/display_name/); nodename=substr($0,RSTART+17, RLENGTH+10); gsub(/ /, "",nodename);printf "(%s)\n",nodename}' alex-test.txt
输出:
(overcloud-Controller-1)
()
()
()
(overcloud-Controller-2)
()
()
请告知如何删除换行符?我在结尾使用tr-d'\n',但它删除了所有换行符,因此它变成了一行
(overcloud-Controller-1)()()()(overcloud-Controller-2)()()
预期产出:
(overcloud-Controller-1)
(overcloud-Controller-2)
为什么我要额外印刷新行?有什么建议吗?看来printf也印了新行。如果我只打印变量nodename,那么它也会解决我的问题
我的实际数据只有3行,然后是服务器2的解析器
| driver_info | {u'ipmi_password'
| instance_info | {u'root_gb': u'40
| name | server-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)
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)
你能试试下面的吗
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
嗯,为什么OP的代码也打印额外的空值,因为OP没有检查条件,字符串显示是否存在于任何匹配中,所以在它不存在之前,它正在打印,可能的原因是在输出中打印
()
。请尝试以下内容
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
嗯,为什么OP的代码也在打印额外的空值,因为OP没有检查条件,字符串显示是否存在于任何匹配中,所以在它不存在之前,它正在打印,可能的原因是在输出中打印
()
。更新脚本并基于@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)
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)
更新脚本并基于@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)
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)
它只印了()像你一样said@AndrewS,对于给定的示例,我的代码运行良好。你能不能也检查一下cat-v输入文件,看看是否有控制M字符,然后告诉我?我想我知道为什么。我更新了主要问题。每个解析3行。我从这里复制了数据并运行,就像你说的那样。我的真实数据是diff(每个块3行)@AndrewS,那么它对你的真实数据不起作用吗?很抱歉,我没有看到样品和你们的真实样品有什么不同?RavainderSing13,你们给了我一个想法。我的方法也很有效。但我相信你的方法也行得通。复制到此页的数据格式不正确。我将更新我的主页。但是我也会接受你的回答。它只印了()像你一样said@AndrewS,对于给定的示例,我的代码运行良好。你能不能也检查一下cat-v输入文件,看看是否有控制M字符,然后告诉我?我想我知道为什么。我更新了主要问题。每个解析3行。我从这里复制了数据并运行,就像你说的那样。我的真实数据是diff(每个块3行)@AndrewS,那么它对你的真实数据不起作用吗?很抱歉,我没有看到样品和你们的真实样品有什么不同?RavainderSing13,你们给了我一个想法。我的方法也很有效。但我相信你的方法也行得通。复制到此页的数据格式不正确。我将更新我的主页。但我也会接受你的回答。非常感谢你分享你的最终解决方案,这将帮助人们。IMHO,我想请你把这个答案添加到我的答案中,这样所有正确的答案都在同一个地方。不过,这也是我的观点,特别感谢你与我们分享。我已经投了赞成票。谢谢你和在座的每一个人!您根本没有使用字段,所以设置
FS
什么都不做。非常感谢您在上面分享您的最终解决方案,这将帮助人们。IMHO,我想请你把这个答案添加到我的答案中,这样所有正确的答案都在同一个地方。不过,这也是我的观点,特别感谢你与我们分享。我已经投了赞成票。谢谢你和在座的每一个人!您根本没有使用字段,因此设置FS
不起任何作用。