2016-12-19 4 views
1

Ich habe diese Saite:in bash

1024.00 MB transferred (912.48 MB/sec) 

und ich brauche nur die Nummer 912.48 zu erhalten und verwandeln es in 912,48 mit einem Bash-Skript. Ich habe versucht, sed 's/[^0-9.]*//g' tun, aber auf diese Weise bekomme ich 1024.00 912.18. Wie kann ich es tun?

Antwort

1

Eine Kombination aus awk und sed:

str='1024.00 MB transferred (912.48 MB/sec)' 
echo "$str" | awk '{print $4}' | sed 's/(//;s/\./,/' 

912,48 

oder vollständig mit awk:

echo "$str" | awk '{sub("[(]","");sub("[.]",",");print $4}'

+0

Danke, es funktioniert perfekt :) – SegFault

1

sollte diese

$ sed -r 's/.*\(([0-9.]+).*/\1/;s/\./,/' 
+0

Ich würde '/ ^. * \ (([0-9.] +). * $ /' Für ext Ra Paranoia, aber YMMV. – dhke

+0

sed: 1: "/^.*\(([0-9.]+).*$/": RE Fehler: Klammern nicht ausgeglichen – SegFault

+0

@SegFault Sie haben den umgekehrten Schrägstrich vor der ersten linken Klammer weggelassen. – karakfa

1
arbeiten
echo "1024.00 MB transferred (912.48 MB/sec)" | cut -f2 -d'(' | cut -f1 -d' ' | sed 's/\./,/' 
+0

wenn Sie ' re vermeiden 'sed', gehen den ganzen Weg und ändern sich zu 'tr '.' ','' auch. – karakfa

+0

@karakfa, ich versuchte nicht, sed zu vermeiden. Nur mit einem anderen Ansatz. Danke für das "tr" Vorschlag: – codeforester

0
echo "1024.00 MB transferred (912.48 MB/sec)" | cut -d " " -f4 | tr "." "," | tr -d "(" 
0

Eine weitere der nahezu unbegrenzte Möglichkeiten:

read x y < <(tr -dc '[0-9. ]' <<< "1024.00 MB transferred (912.48 MB/sec)") 
echo ${y} 

oder

grep -oP '(?<=\()[\d.]+' <<< "1024.00 MB transferred (912.48 MB/sec)" 
0

Hier ist ein awk die Aufgabe zu erledigen:

s='1024.00 MB transferred (912.48 MB/sec)' 
awk -F '[() ]+' '{sub(/\./, ",", $4); print $4}' <<< "$s" 

912,48 
2

Bisher jeder Antwort hier ist mit externen Tools (sed, awk, grep, tr, usw.) anstatt sich an die native bash-Funktionalität zu halten. Da das Hochfahren externer Prozesse erhebliche Auswirkungen auf die Leistung bei konstanter Zeit hat, ist es im Allgemeinen unerwünscht, wenn nur eine einzige Zeile Inhalt verarbeitet wird (bei langen Inhaltsströmen ist ein externes Tool oft effizienter).

Dieses verwendet Einbauten nur:

# one-time setup: set the regex 
re='[(]([0-9.]+) MB/sec[)]' 
string='1024.00 MB transferred (912.48 MB/sec)' 

if [[ $string =~ $re ]]; then # run enclosed code only if regex matches 
    val=${BASH_REMATCH[1]}  # refer to first (and only) match group 
    val_with_comma=${val//./,} # replace "." with "," in that group 
    echo "${val_with_comma}"  # ...and emit our output 
fi 

... wodurch man

912,48 
0

wow, so viele Antworten :)

hier ist meins, sollte ziemlich schnell sein:

grep -o '([^ ]\+' | tail -c+2 | tr '.' ','