Как найти шаблон и извлечь его с помощью substr в awk - PullRequest
0 голосов
/ 15 февраля 2019

Попытка извлечь шаблон, используя awk substr, но я не знаю, как удалить символ новой строки.Я пытаюсь получить overcloud-Controller-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

, когда я запускаю следующий скрипт 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.Я просто добавил RS и FS перед awk, вот и все.Спасибо.

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)

Ответы [ 3 ]

0 голосов
/ 15 февраля 2019

Обновил скрипт и начал работать на основе идеи @ RavainderSing13.Я просто добавил RS и FS перед awk, вот и все.Спасибо.

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)
0 голосов
/ 16 февраля 2019
$ awk -v RS= -F\' '{print "("$34")"}' file
(overcloud-Controller-1)
(overcloud-Controller-2)
0 голосов
/ 15 февраля 2019

Не могли бы вы попробовать следующее.

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 не проверяет условиелибо отображение строки присутствует в любом совпадении, либо нет, поэтому, если оно НЕ присутствует, оно печатает, возможная причина этого - вывод () на выходе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...