rs1302 schrieb:
ein Beispiel wo Command Substitution bei mir nicht funktionieren will:
root@OpenWrt:~# echo "download 100.000" | awk '/d/ {print $2}'
100.000
root@OpenWrt:~# echo "download 100.000" | temp=$(awk '/d/ {print $2}'); echo $temp
einmal ohne und einmal mit tmp Variable. Über Variable kommt kein Ergebnis.... Kann das jemand erklären?
- äh, ja - die 2. Zeile ... da wirbelst Du wild mit Untershells herum (durch die Pipe !) und wunderst Dich,
dass hinterher bei der Muttershell nix ankommt. Du müsstest Dich da mal zu "Subshells und Environment" einlesen, fürchte ich ...
rs1302 schrieb:
versteh ich trotzdem nicht danz:
root@OpenWrt:~# speedtest-cli | awk '{printf "%.02f\n", $2} '
0.00
0.00
0.00
0.00
0.00
0.00
45.80
0.00
36.39
root@OpenWrt:~# speedtest-cli | awk '/Download:/ {printf "%.02f\n", $2} '
49.03
root@OpenWrt:~# speedtest-cli | awk '/Download:/ {printf "%.02f\n", $2*100} '
4781.00
Wieso ? - hier nimmst Du alle Zeilen (nicht nur die mit dem "Download"), und davon immer das 2. Wort, als Kommazahl.
Ist doch alles korrekt ...? 😉 (Du musst schon sauber arbeiten und genau hingucken, denn awk
macht ganz stumpf was Du ihm befiehlst !)
wie darf man awk und sed mischen? (nicht nur betreffend dieser Frage)
Klar darf man, in der Pipe ... nur nötig ist das eigentlich nicht, und meistens auch nicht elegant.
zB:
echo "Download: 12.11" | ((awk '/Download:/ {print $2}') | sed 's/\.//g')
funktioniert. Ist das so erlaubt und richtig oder gibts einen anderen Weg um $2 gleich zu bearbeiten?
Also, erstmal ist das keine Command Substitution oder sowas, sondern Du machst hier 2x ausdrücklich eine Unterhell auf !
→ Lies Dir noch einmal genau durch, was es tatsächlich an Substitutions gibt und was nicht !
Ja, Du kannst awk
sagen, es soll mit 100 malnehmen, denn hast Du's auch ...: (haben die Anderen aber auch schon gesagt !)
echo "Download: 12.11" | ((awk '/Download:/ {print $2 * 100}')
Wie weit darf eine Command Substitution gehen?
Beliebig, so viel Du willst.
Rechnen kann man in der Shell doch mit zB:
echo $((100/2))
Ja, nur ist das keine Command Substitution, sondern eine Arithmetic Expansion, also was Anderes !
Warum darf ich meine Zahl dann nicht mehr durch 100 rechnen? Zum Zeitpunkt der Berechnung sollte die zahl doch schon eine Ganzzahl sein!
Klar darfst Du. Du musst nur dran denken, dass die Zahl vorher schon Integer sein muss, und hinterher auf Integer abgeschnitten wird. (also ohne Nachkommastellen !)
root@OpenWrt:~# echo "Download: 12.11" | (awk '/Download:/ {printf "%.02f\n", $2*100}' | sed 's/\.//g')
121100
root@OpenWrt:~# echo "Download: 12.11" | $(((awk '/Download:/ {printf "%.02f\n", $2*100}' | sed 's/\.//g')/100))
-ash: arithmetic syntax error
.. nicht genau hingeguckt, wa ? 😉 Du meintest bestimmt sowas:
track@track:~$ echo $(( $( echo "Download: 12.11" | awk '/Download:/ {printf "%.02f\n", $2*100}' | sed 's/\.//g' )/100 ))
1211
LG,
track