2010-08-02 2 views
0

Мне нужно сканировать вывод iostat -En на машине Solaris, чтобы при обнаружении диска с ошибками две строки об этом диске были отправлены в окончательный вывод. До сих пор это прекрасно работает, используяgrep -v и -B | -A | -C не работает вместе

iostat -En | grep 'Errors: [1-9]' -A 1 

но когда я пытаюсь не включать CD/DVD-устройства, я ударяю о стену. В contaxt флаги (-A|B|C) не похоже на работу с -v поэтому я не могу использовать это:

-bash-4.0$ iostat -En | grep -B 1 -vi "CD/DVD" | grep 'Errors: [1-9]' -A 1 
c0t3d0   Soft Errors: 2 Hard Errors: 0 Transport Errors: 0 
Vendor: TSSTcorp Product: CD/DVDW TS-L632D Revision: SR02 Serial No: 

Я не думаю, что должен быть какой-нибудь выход здесь, потому что строка, содержащая «CD/DVD» и строка перед ней должна быть удалена. Было бы достаточно просто написать это как скрипт на любом языке, но это должна быть единственная команда, которая может быть запущена на компьютерах без дополнительных скриптов, поэтому я полагаю, что можно использовать perl -e. Я не знаю любой perl, поэтому я не пробовал этот подход.

Некоторые примеры iostat -En выход:

-bash-4.0$ iostat -En 
c0t0d0   Soft Errors: 0 Hard Errors: 0 Transport Errors: 0 
Vendor: SEAGATE Product: ST973402SSUN72G Revision: 0603 Serial No: *removed* 
Size: 73.40GB <73400057856 bytes> 
Media Error: 0 Device Not Ready: 0 No Device: 0 Recoverable: 0 
Illegal Request: 0 Predictive Failure Analysis: 0 
c0t3d0   Soft Errors: 2 Hard Errors: 0 Transport Errors: 0 
Vendor: TSSTcorp Product: CD/DVDW TS-L632D Revision: SR02 Serial No: 
Size: 0.00GB <0 bytes> 
Media Error: 0 Device Not Ready: 0 No Device: 0 Recoverable: 0 
Illegal Request: 2 Predictive Failure Analysis: 0 
c0t1d0   Soft Errors: 0 Hard Errors: 0 Transport Errors: 0 
Vendor: SEAGATE Product: ST973402SSUN72G Revision: 0603 Serial No: *removed* 
Size: 73.40GB <73400057856 bytes> 
Media Error: 0 Device Not Ready: 0 No Device: 0 Recoverable: 0 
Illegal Request: 0 Predictive Failure Analysis: 0 

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

c0t1d0   Soft Errors: 0 Hard Errors: 1 Transport Errors: 0 
Vendor: SEAGATE Product: ST973402SSUN72G Revision: 0603 Serial No: *removed* 

Это результат, который я ищу. Есть идеи?

ответ

1

попробовать nawk

iostat -En | nawk '/Errors: [1-9]/{ getline line; if (line!~/CD|DVD/) print line} 
+0

Ваше решение сработало с одной небольшой проблемой; он не включал первую строку (c0t0d0 Soft Errors ...), которая была небольшим исправлением - я только что изменил 'print line}' на '{print; print line}} ' – Puddingfox

1

grep -v pattern печатает все строки, которые не соответствуют шаблону, но grep -B 1 -v pattern также печатает все строки до строки, которые не соответствуют шаблону, в том числе линий, которые делают соответствовать шаблону ,

Например, если file содержит:

ABCD 
DEFG 
GHIJ 

Тогда grep -v D file дает:

GHIJ 

но grep -B1 -v D file дает:

DEFG 
GHIJ 

Вид обработки вы хотите слишком комплекс для grep.

+0

ОК спасибо. Я решил использовать awk как ghostdog74 – Puddingfox

Смежные вопросы