Die erste Aufgabe besteht darin, die Rate aus dieser Zeile zu extrahieren. Mit GNU grep (nicht eingebettetes Linux oder Cygwin) können Sie diese -o
Option verwenden. Der gewünschte Teil enthält nur Ziffern, gefolgt von einem %
Zeichen. Wenn Sie das nicht %
selbst extrahieren möchten , benötigen Sie einen zusätzlichen Trick: eine Lookahead-Behauptung mit der Breite Null , die mit nichts übereinstimmt, aber nur dann, wenn diesem nichts folgt %
.
command1 -p=aaa -v=bbb -i=4 | grep -o -P '[0-9]+(?=%)'
Eine andere Möglichkeit ist die Verwendung von sed. Um einen Teil einer Zeile in sed zu extrahieren, verwenden Sie den s
Befehl mit einer Regex, die mit der gesamten Zeile (beginnend mit ^
und endend mit $
) übereinstimmt , und dem Teil, der in einer Gruppe ( \(…\)
) beibehalten werden soll . Ersetzen Sie die gesamte Zeile durch den Inhalt der beizubehaltenden Gruppe (n). Übergeben Sie im Allgemeinen die -n
Option zum Deaktivieren des Standarddrucks und setzen Sie den p
Modifikator, um Zeilen zu drucken, in denen etwas zu extrahieren ist (hier gibt es eine einzelne Zeile, damit es keine Rolle spielt). Siehe Nur den Teil einer Linie nach einem übereinstimmenden Muster zurückgeben und einen mit 'sed' übereinstimmenden regulären Ausdruck extrahieren, ohne die umgebenden Zeichen zu drucken, um weitere sed-Tricks zu erhalten.
command1 -p=aaa -v=bbb -i=4 | sed 's/^.*rate(\([0-9]*\)%).*$/\1/'
Noch flexibler als sed, ist awk. Awk führt Anweisungen für jede Zeile in einer kleinen imperativen Sprache aus. Es gibt viele Möglichkeiten, den Kurs hier zu ermitteln. Ich wähle die zweiten Felder aus (Felder werden standardmäßig durch Leerzeichen begrenzt) und entferne alle Zeichen, die keine Ziffern sind.
command1 -p=aaa -v=bbb -i=4 | awk '{gsub(/[^0-9]+/, "", $2); print $2}'
Der nächste Schritt, nachdem Sie die Rate extrahiert haben, besteht darin, sie als Argument an zu übergeben command2
. Das Werkzeug dafür ist eine Befehlssuspension . Wenn Sie einen Befehl eingeben $(…)
(in Dollar-Klammern), wird dessen Ausgabe in die Befehlszeile eingefügt. Die Ausgabe des Befehls wird in jedem Whitespace-Block in separate Wörter aufgeteilt, und jedes Wort wird als Platzhaltermuster behandelt. es sei denn , Sie dies geschehen soll, setzen Sie doppelte Anführungszeichen um den Befehl Substitution: "$(…)"
. Bei doppelten Anführungszeichen wird die Ausgabe des Befehls direkt als einzelner Parameter verwendet (die einzige Transformation besteht darin, dass Zeilenumbrüche am Ende der Ausgabe entfernt werden).
command2 -t "$(command1 -p=aaa -v=bbb -i=4 |
sed 's/^.*rate(\([0-9]*\)%).*$/\1/')"