2016-05-05 7 views
-1

Im получил текст, похожий на этот в файле.Как присоединиться к 3 шаблонам в виде строки с awk

OVM> 
show PhysicalDisk id='12346579123456789123456789' 
Data: 
    Page83 ID = OVM_SYS_REPO_PART_12346579123456789123456789 
    Server Reserved = No 
    Shareable = No 
    Size (GiB) = 503.37 
    State = UNKNOWN 
    Thin Provision = No 
    Type = LUN 
    User-Friendly Name = 200173800eeec23ff 
    Vendor = Lenovo 
    File System 1 = 12346579123456789123456789 
    Volume Group = 12346579123456789123456789 [Local Storage Volume Group] 
    Id = 12346579123456789123456789 [OVM_SYS_REPO_PART_12346579123456789123456789] 
    Name = OVM_SYS_REPO_PART_12346579123456789123456789 
    Locked = false 
OVM> 
show PhysicalDisk id='123465791234567891234567892' 
Data: 
    Storage Targets 1 = 0x50017380eeec0140 
    Storage Targets 2 = 0x50017380eeec0170 
    Storage Targets 3 = 0x50017380eeec0150 
    Storage Targets 4 = 0x50017380eeec0172 
    Storage Targets 5 = 0x50017380eeec0152 
    Storage Targets 6 = 0x50017380eeec0182 
    Page83 ID = 200173800eeec23aa 
    Server Reserved = No 
    Shareable = Yes 
    Size (GiB) = 16.03 
    State = UNKNOWN 
    Thin Provision = Yes 
    Type = LUN 
    User-Friendly Name = 200173800eeec23aa 
    Vendor = IBM 
    File System 1 = 123465791234567891234567892 [Server Pool File System] 
    Volume Group = 123465791234567891234567892 [FibreChannel Volume Group] 
    Id = 123465791234567891234567892 [Production Quorum LUN] 
    Name = Production LUN 
    Locked = false 
OVM> 

Я хочу, чтобы выбрать только «User-Friendly Name», «Размер» и «Имя» линии для каждого выхода (для каждого «шоу») и присоединиться к ним, как это.

User-Friendly Name = 200173800eeec23aa Name = Производство LUN Размер (Гигабайт) = 16,03

В самом деле, было бы еще лучше, если бы я мог получить:

200173800eeec23aa Продукция LUN 16.03

Я пробовал это, но по какой-то причине он придерживается \ n между каждой строкой, а не в конце трех паттернов:

awk 'match($0, /(User.*)|(Name.*)|(Size.*)/, a) {printf "%s %s %s\n", a[1], a[2], a[3]}' object_data/LUNs.txt 

Так что я на самом деле получить (в том числе, что странно identation):

User-Friendly Name = 200173800eeec23aa 
Name = Production LUN 
    Size (GiB) = 16.03 

Как я могу это исправить? Большое спасибо.

ответ

3

Вот AWK сценарий для вашей ситуации:

script.awk:

BEGIN {FS="="} 
$1 ~ "User-Friendly Name" { ufn = $2 } 
$1 ~ "Size" { sz = $2 } 
$1 ~ "Name" { printf("%s%s%s\n",ufn,$2, sz) } 

Используйте его как awk -f script.awk yourfile.

Объяснение для вашего вывода: Каждая строка соответствует . Например, строка, содержащая Size, совпадает со второй скобкой из исходного скрипта awk. Строка содержит только "Размер (Гигабайт) ...": так:

  • a[1] и a[3] пустые
  • a[2]является вся линия (в связи с .*)
  • новой строке \n от printf
+0

Спасибо это работает как шарм! – Nocturn

-1

Просто удалить '\ п' в конце каждой строки: GSUB (/ [\ п] $ /, "", $ 0)

+0

Вы действительно должны были пробовать это, это неправильно на стольких уровнях. –

0

идиоматические AWK подход:

$ awk -F' = ' ' 
    { gsub(/^ +| +\([^)]+\)$/,"",$1); m[$1]=$2 } 
    NR>1 && /^OVM/{ print m["User-Friendly Name"], m["Name"], m["Size"] } 
' file 
200173800eeec23ff OVM_SYS_REPO_PART_12346579123456789123456789 503.37 
200173800eeec23aa Production LUN 16.03