sed
unter AIX tut nicht was ich denke es sollte. Ich versuche, mehrere Leerzeichen durch ein einzelnes Leerzeichen in der Ausgabe von IOSTAT zu ersetzen:
# 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 sollte nach mehreren Leerzeichen (/ [] * /) suchen und diese durch ein einzelnes Leerzeichen (/ /) für die gesamte Gruppe (/ g) ersetzen.
Was mache ich falsch? Ich weiß, dass es etwas Einfaches sein muss ... AIX 5300-06
Bearbeiten: Ich habe einen anderen Computer mit mehr als 10 Festplatten. Ich verwende dies als Parameter für ein anderes Programm zu Überwachungszwecken.
Das Problem, auf das ich gestoßen bin, war, dass "awk '{print $ 5}' nicht funktioniert hat, weil ich $ 1 usw. in der Sekundärstufe verwende und Fehler mit dem Befehl Drucken ausgegeben habe. Ich habe nach einer grep / sed / cut-Version gesucht Was zu funktionieren scheint, ist:
iostat | grep "hdisk1 " | sed -e's/ */ /g' | cut -d" " -f 5
Die [] s waren "0 oder mehr", als ich dachte, dass sie "nur eine" bedeuten. Das Entfernen der Klammern hat funktioniert. Drei sehr gute Antworten machen es sehr schnell schwer, die "Antwort" zu wählen.
quelle
/[ ]*/
Entspricht keinem oder mehreren Leerzeichen, sodass die leere Zeichenfolge zwischen den Zeichen übereinstimmt.Wenn Sie versuchen, "ein oder mehrere Leerzeichen" zuzuordnen, verwenden Sie eines der folgenden Elemente:
quelle
*
macht es "optional".[ ]
Erstellt einfach eine Liste von Zeichen mit nur einem Zeichen (einem Leerzeichen). Es ist der Quantor*
, der "null oder mehr von dem vorherigen Ding" bedeutettr -s ' '
LösungÄndern Sie Ihren
*
Operator in a+
. Sie stimmen mit mindestens null Zeichen des vorherigen Zeichens überein, das mit jedem Zeichen übereinstimmt, da alles, was kein Leerzeichen ist, ... ähm ... keine Leerzeichen enthält. Sie müssen mit EINEM oder mehreren übereinstimmen. Eigentlich wäre es besser, zwei oder mehr zusammenzubringenDie in eckige Klammern gesetzte Zeichenklasse ist auch nicht erforderlich, um ein Zeichen abzugleichen. Sie können einfach verwenden:
... wenn Sie nicht auch Tabulatoren oder andere Arten von Leerzeichen zuordnen möchten, ist die Zeichenklasse eine gute Idee.
quelle
s/ */ /g
(das ist mit drei Leerzeichen, die Kommentarformatierung reduziert sie). Der Sternoperator macht das vorherige Zeichen optional. Wenn Sie also zwei oder mehr Zeichen damit verbinden möchten, müssen Sie die ersten beiden selbst (zwei Leerzeichen) verbinden. Fügen Sie dann ein drittes Leerzeichen und einen Stern hinzu, um das dritte und die folgenden Leerzeichen optional zu machen.Sie können immer das letzte Vorkommen in einer Sequenz wie der folgenden zuordnen:
Und so sind Sie auf dem richtigen Weg, aber anstatt die Sequenz durch ein Leerzeichen zu ersetzen, ersetzen Sie sie durch das letzte Vorkommen - ein einzelnes Leerzeichen. Auf diese Weise , wenn eine Folge von Räumen wird dann abgestimmt die Sequenz zu einem einzigen Raum reduziert wird, aber wenn der Null - String abgestimmt wird dann der Null - String mit mir selbst ersetzt - und kein Schaden, kein Foul. Also zum Beispiel:
AUSGABE
Trotzdem ist es wahrscheinlich weitaus besser, Regexps in dieser Situation vollständig zu vermeiden und stattdessen Folgendes zu tun:
quelle
iostat | tr -s \
Beachten Sie, dass Sie auch das tun können, was Sie versuchen
durch
Dies kann besonders nützlich sein, wenn Sie später versuchen, auch auf andere Felder zuzugreifen und / oder etwas zu berechnen.
quelle
while
.$[ .. ]
ist wahrscheinlich in neueren Versionen von bash verfügbar (vielleicht auch zsh). Ich habe die Antwort$(( .. ))
stattdessen auf eine tragbarere Version aktualisiert .Mit dem folgenden Skript können Sie mehrere Leerzeichen in ein einzelnes Leerzeichen, ein TAB oder eine andere Zeichenfolge konvertieren:
compress_spaces.sh
quelle