Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在awk中使用substr搜索模式并提取_Awk_Sed - Fatal编程技术网

如何在awk中使用substr搜索模式并提取

如何在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'

尝试使用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', 
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
不起任何作用。