2017-01-22 4 views
0

, выполнив следующую команду:вывода команды переформатирование Linux

[email protected] # hpasmcli -s "show dimm" | egrep "Module|Status" 

будет производить:

Module #:      1 
Status:      Ok 
Module #:      3 
Status:      Ok 
Module #:      6 
Status:      Ok 
Module #:      8 
Status:      Ok 
Module #:      1 
Status:      Ok 
Module #:      3 
Status:      Ok 
Module #:      6 
Status:      Ok 
Module #:      8 
Status:      Ok 

Как я могу переформатировать выход стать как:

Module: 1 3 6 8 ... 
Status: OK OK OK OK 
+0

hpasmcli, я понимаю вашу ситуацию. Удачи. – phoxis

ответ

1

Использование AWK

hpasmcli -s "show dimm" | awk ' 
/^Module/ { m = m sprintf("%4s", $3) } 
/^Status/ { s = s sprintf("%4s", $2) } 
END  { print "Module:" m "\n" "Status:" s }' 

Пример вывод:

Module: 1 3 6 8 1 3 6 8 
Status: Ok Ok Ok Ok Ok Ok Ok Ok 

блоки в фигурных скобках после регулярных выражений /^Module/ и /^Status/ выполняется, когда текущая запись (строка) совпадает с соответствующим регулярным выражением. Значения собираются в переменные m и s. На END обе переменные печатаются на стандартный вывод.

sprintf функции возвращают строки, проложенные до указанной ширины (4).


В качестве альтернативы, разделить записи с двоеточием, используя -F: вариант. Но тогда вам нужно будет обрезать значения с помощью gsub функции, например:

hpasmcli -s "show dimm" | awk -F: ' 
/^Module/ { gsub(/ +/, "", $2); m = m sprintf("%4s", $2) } 
/^Status/ { gsub(/ +/, "", $2); s = s sprintf("%4s", $2) } 
END  { print "Module:" m "\n" "Status:" s }' 

Использование Perl

hpasmcli -s "show dimm" | perl -e ' 
while (<>) { 
    push @m, m/:\s*(\S+)$/ if /^Module/; 
    push @s, m/:\s*(\S+)$/ if /^Status/; 
} 
print "Module: ", join("", map { sprintf "%4s", $_ } @m), "\n"; 
print "Status: ", join("", map { sprintf "%4s", $_ } @s), "\n";' 

Цикл while читает входную строку. Если строка начинается с «Module», тогда значение извлекается из строки с использованием выражения m/:\s*(\S+)$/. Соответствующая группа непространственных символов (\S+) добавляется к @m или @s массивам. Наконец, элементы массива соединяются и печатаются на стандартный вывод.

0

Вы можете настроить два grep s и cut s таким образом, в сочетании с printf для форматирования и echo конкатенировать значения:

echo -e "Module: $(printf %5d $(hpasmcli -s "show dimm" | grep Module | cut -f2 -d:))\nStatus: $(printf %5s $(hpasmcli -s "show dimm" |grep Status | cut -f2 -d:))" 

Если вы хотите, чтобы сделать один звонок hpasmcli, то:

hpasmcli -s "show dimm" > outfile 
echo -e "Module: $(printf %5d $(grep Module outfile | cut -f2 -d:))\nStatus: $(printf %5s $(grep Status outfile | cut -f2 -d:))" 

Выход:

Module:  1 3 6 8 1 3 6 8 
Status: Ok Ok Ok Ok Ok Ok Ok Ok 
+0

Это работает, но требуется Статус: XXX в новой строке – Fshamri

+0

Я только что сделал исправление. – codeforester