2010-08-02 29 views
0

je dois analyser la sortie de iostat -En sur une machine Solaris telle que lorsqu'un disque avec des erreurs se trouve, deux lignes sur ce disque sont envoyés à la finale sortie. Cela fonctionne très bien jusqu'à présent en utilisantgrep -v et -B | -A | C ne travaillent pas ensemble

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

mais lorsque j'essaie de ne pas inclure de périphériques CD/DVD, je heurte un mur. Les drapeaux contaxt (-A|B|C) ne semblent pas travailler avec -v donc je ne peux pas utiliser ceci:

-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: 

Je ne pense pas qu'il devrait y avoir une sortie parce que la ligne contenant « CD/DVD » et la ligne avant qu'il devrait être retiré. Il serait assez simple d'écrire cela comme un script dans toutes les langues, mais il doit être une seule commande qui peut être exécuté sur les hôtes sans scripts supplémentaires installés, donc je suppose que perl -e peut être utilisé. Je ne sais pas tout perl donc je n'ai pas essayé cette approche.

Quelques exemples iostat -En sortie:

-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 

Dans ce cas, je ne devrais pas avoir une sortie, car le seul appareil avec des erreurs est un lecteur optique et je ne me soucie pas de ceux-ci.

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

Ceci est la sortie que je recherche. Des idées?

Répondre

1

essayer nawk

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

Votre solution a travaillé avec un petit problème; il ne comprend pas la première ligne (c0t0d0 Erreurs Soft ...) qui était une petite correction - je viens de changer 'ligne d'impression}' 'à {print; ligne d'impression}} ' – Puddingfox

1

grep -v pattern imprime toutes les lignes qui ne correspondent pas à un modèle, mais grep -B 1 -v pattern imprime également toutes les lignes avant les lignes qui ne correspondent pas à un modèle, y compris les lignes qui ne correspondent au modèle .

Par exemple, si file contient:

ABCD 
DEFG 
GHIJ 

Alors grep -v D file vous donne:

GHIJ 

mais grep -B1 -v D file vous donne:

DEFG 
GHIJ 

Le genre de traitement que vous voulez est trop complexe pour grep.

+0

merci ok. j'ai décidé d'utiliser awk comme ghostdog74 suggéré – Puddingfox