sed
sur AIX ne fait pas ce que je pense qu'il devrait. J'essaie de remplacer plusieurs espaces par un seul espace dans la sortie d'IOSTAT:
# iostat
System configuration: lcpu=4 drives=8 paths=2 vdisks=0
tty: tin tout avg-cpu: % user % sys % idle % iowait
0.2 31.8 9.7 4.9 82.9 2.5
Disks: % tm_act Kbps tps Kb_read Kb_wrtn
hdisk9 0.2 54.2 1.1 1073456960 436765896
hdisk7 0.2 54.1 1.1 1070600212 435678280
hdisk8 0.0 0.0 0.0 0 0
hdisk6 0.0 0.0 0.0 0 0
hdisk1 0.1 6.3 0.5 63344916 112429672
hdisk0 0.1 5.0 0.2 40967838 98574444
cd0 0.0 0.0 0.0 0 0
hdiskpower1 0.2 108.3 2.3 2144057172 872444176
# iostat | grep hdisk1
hdisk1 0.1 6.3 0.5 63345700 112431123
#iostat|grep "hdisk1"|sed -e"s/[ ]*/ /g"
h d i s k 1 0 . 1 6 . 3 0 . 5 6 3 3 4 5 8 8 0 1 1 2 4 3 2 3 5 4
sed devrait chercher et remplacer plusieurs espaces (/ [] * /) par un seul espace (/ /) pour tout le groupe (/ g) ... mais ce n'est pas seulement le cas ... espacer chaque caractère.
Qu'est-ce que je fais mal? Je sais que c'est quelque chose de simple ... AIX 5300-06
edit: J'ai un autre ordinateur qui a plus de 10 disques durs. J'utilise cela comme paramètre pour un autre programme à des fins de surveillance.
Le problème que j'ai rencontré était que "awk '{print $ 5}" ne fonctionnait pas parce que j'utilisais $ 1, etc. à l'étape secondaire et que je commettais des erreurs avec la commande Print. Je cherchais une version de grep / sed / cut Ce qui semble fonctionner est:
iostat | grep "hdisk1 " | sed -e's/ */ /g' | cut -d" " -f 5
Les [] étaient "0 ou plus" quand je pensais qu'ils signifiaient "un seul". En enlevant les supports, ça a fonctionné. Trois très bonnes réponses rendent très difficile le choix de la "réponse".
la source
/[ ]*/
correspond à zéro ou plusieurs espaces, de sorte que la chaîne vide entre les caractères correspond.Si vous essayez de faire correspondre "un ou plusieurs espaces", utilisez l'une de ces méthodes:
la source
*
rend "optionnel".[ ]
fait juste une liste de caractères avec un seul caractère dedans (un espace). C'est le quantificateur*
qui signifie "zéro ou plus de la chose précédente"tr -s ' '
solution la plus simpleChangez votre
*
opérateur en a+
. Vous correspondez à zéro ou plus du caractère précédent, ce qui correspond à chaque caractère car tout ce qui n'est pas un espace est ... euh ... zéro instance d'espace. Vous devez faire correspondre un ou plusieurs. En fait, il vaudrait mieux faire correspondre deux ou plusLa classe de caractères entre crochets est également inutile pour faire correspondre un caractère. Vous pouvez simplement utiliser:
... sauf si vous souhaitez également faire correspondre des tabulations ou d'autres types d'espaces, la classe de caractères est une bonne idée.
la source
s/ */ /g
(avec trois espaces, la mise en forme du commentaire les réduit ). L'opérateur en étoile rendra le caractère précédent facultatif. Par conséquent, si vous voulez en faire correspondre deux ou plus, vous devez faire correspondre les deux premiers (deux espaces), puis ajoutez un troisième espace et une étoile pour que les troisième et suivants soient facultatifs.Vous pouvez toujours faire correspondre la dernière occurrence dans une séquence de quelque chose comme:
Et vous êtes donc sur la bonne voie, mais au lieu de remplacer la séquence par un espace, remplacez-la par sa dernière occurrence, un espace unique. De cette façon , si une suite d'espaces est adaptée, la séquence est réduite à un seul espace, mais si la chaîne vide correspond alors à la chaîne vide est remplacée par elle - même - et aucun mal, aucune faute. Donc, par exemple:
SORTIE
Cela dit, il vaut probablement mieux éviter les expressions rationnelles dans cette situation et faire plutôt:
la source
iostat | tr -s \
Notez que vous pouvez aussi faire ce que vous essayez, c’est-à-dire
par
ce qui peut être particulièrement utile si vous tentez ultérieurement d'accéder à d'autres champs et / ou de calculer quelque chose - comme ceci:
la source
while
.$[ .. ]
c'est probablement disponible dans les versions récentes de bash (peut-être aussi zsh). J'ai mis à jour la réponse à un plus portable à la$(( .. ))
place.Vous pouvez utiliser le script suivant pour convertir plusieurs espaces en un seul espace, une tabulation ou toute autre chaîne:
compress_spaces.sh
la source