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

时间:2019-02-15 16:49:07

标签: awk sed

尝试使用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

3 个答案:

答案 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)