%c форматированная строка показывает разное поведение в shell'е и в C

Используя переменные awk и множественные совпадения, вы можете прочитать каждую строку, сохранить то, что вам нужно, а затем напечатать последнее совпадение и начать сначала.

#!/usr/bin/awk -f

BEGIN {
  DISK=""
  DEVICE=""
  FS=" : "
  print "Physical Disk\tdevice\t\t\t\t\t\tShareddisk"
  }

/Physical Disk/ {
  DISK=$2
  FS="="
}

/device/ {
  DEVICE=$2
}

/shareddisk/ {
  print DISK "\t" DEVICE "\t" $2
  FS=" : "
  }

Затем запустите скрипт в вашем файле awk -f ./script.awk ./disk.txt

$ awk -f ./parse.awk ./disk.txt
Physical Disk   device                                          Shareddisk
'IBM (67)       /dev/mapper/360050768018206483000000000000453   true
'IBM (58)       /dev/mapper/36005076801820648300000000000043f   true
'IBM (59)       /dev/mapper/360050768018206483000000000000440   true
'IBM (71)       /dev/mapper/360050768018206483000000000000497   true

Чтобы разбить скрипт на части, он начинается с блока BEGIN, который запускается в самом начале. Он определяет некоторые переменные, устанавливает разделитель полей FS и печатает заголовок. Первое совпадение происходит для Physical Disk и сохраняет имя диска в переменной. Разделитель полей меняется на =, так как в строках Device и Shared Disk используется =. При попадании в строку, соответствующую /shareddisk/, переменные печатаются, а разделитель полей снова изменяется, чтобы соответствовать следующей строке физического диска.

Edit

Это предполагает формат файла:

cat disk.txt
Physical Disk : 'IBM (67)
  device=/dev/mapper/360050768018206483000000000000453
  shareddisk=true
Physical Disk : 'IBM (58)
  device=/dev/mapper/36005076801820648300000000000043f
  shareddisk=true
Physical Disk : 'IBM (59)
  device=/dev/mapper/360050768018206483000000000000440
  shareddisk=true
Physical Disk : 'IBM (71)
  device=/dev/mapper/360050768018206483000000000000497
  shareddisk=true
5
25.01.2019, 00:22
0 ответов

Теги

Похожие вопросы