Pierwszym zadaniem jest wyodrębnienie stawki z tej linii. W GNU grep (niewbudowany Linux lub Cygwin) możesz skorzystać z tej -o
opcji. 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 s
polecenia 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ż -n
opcję wyłączenia domyślnego drukowania i wstaw p
modyfikator 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/')"