grep -v и -B | -A | -C не работают вместе - PullRequest
0 голосов
/ 02 августа 2010

Мне нужно отсканировать вывод iostat -En на машине Solaris, чтобы при обнаружении диска с ошибками две строки об этом диске отправлялись на окончательный вывод. Пока все работает нормально, используя

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

но когда я пытаюсь не включать устройства CD / DVD, я врезаюсь в стену. Флаги для контекста (-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*

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

Ответы [ 2 ]

1 голос
/ 02 августа 2010

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.

1 голос
/ 02 августа 2010

попробуй nawk

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