Pierwszym zadaniem jest wyodrębnienie stawki z tej linii. W GNU grep (niewbudowany Linux lub Cygwin) możesz skorzystać z tej -oopcji. Część, którą chcesz, to ta, która zawiera tylko cyfry, a po niej %znak. Jeśli nie chcesz wyodrębnić %samego siebie, potrzebujesz dodatkowej sztuczki: asertywne stwierdzenie zerowej szerokości , które nie pasuje do niczego, ale tylko wtedy, gdy po nim nie następuje nic %.
command1 -p=aaa -v=bbb -i=4 | grep -o -P '[0-9]+(?=%)'
Inną możliwością jest użycie sed. Aby wyodrębnić część linii w sed, użyj spolecenia z wyrażeniem regularnym pasującym do całej linii (zaczynając od ^i kończąc na $), z częścią do zachowania w grupie ( \(…\)). Zastąp całą linię zawartością grup, które chcesz zachować. Ogólnie rzecz biorąc, przekaż -nopcję wyłączenia domyślnego drukowania i wstaw pmodyfikator do drukowania linii, w których jest coś do wyodrębnienia (tutaj jest jedna linia, więc to nie ma znaczenia). Zobacz Zwracanie tylko części linii po pasującym wzorcu i Wyodrębnianie wyrażenia regularnego dopasowanego do „sed” bez drukowania otaczających znaków, aby uzyskać więcej sztuczek sed.
command1 -p=aaa -v=bbb -i=4 | sed 's/^.*rate(\([0-9]*\)%).*$/\1/'
Bardziej elastyczny niż sed, jest awk. Awk wykonuje instrukcje dla każdej linii w małym imperatywnym języku. Istnieje wiele sposobów wyodrębnienia stawki; Zaznaczam drugie pola (pola są domyślnie ograniczone białymi spacjami) i usuwam wszystkie znaki, które nie są cyframi.
command1 -p=aaa -v=bbb -i=4 | awk '{gsub(/[^0-9]+/, "", $2); print $2}'
Następnym krokiem, po wyodrębnieniu stawki, jest przekazanie jej jako argumentu command2. Narzędziem do tego jest zawieszenie polecenia . Jeśli umieścisz polecenie w środku $(…)(nawias dolara), jego dane wyjściowe zostaną podstawione w linii poleceń. Dane wyjściowe polecenia są dzielone na osobne słowa w każdym bloku białych znaków, a każde słowo jest traktowane jako wzór wieloznaczny; chyba że chcesz to się stało, umieścić w cudzysłowie podstawienia polecenia: "$(…)". W przypadku podwójnych cudzysłowów dane wyjściowe polecenia są używane bezpośrednio jako pojedynczy parametr (jedyną transformacją jest to, że znaki nowej linii na końcu danych wyjściowych są usuwane).
command2 -t "$(command1 -p=aaa -v=bbb -i=4 |
sed 's/^.*rate(\([0-9]*\)%).*$/\1/')"