Beiträge von rijo im Thema „bash snippet“

    Code
    $ uptime|sed 's/.*up \([^,]*\), .*/\1/'

    In deinem Echo Befehl lässt du in einer substitution den Befehl uptime ablaufen und schickst ihn über eine pipe an den Befehl sed.

    Was führt der Befehl sed jetzt mit der Ausgabe des Befehl uptime aus?

    ich will hier mal versuchen, die sprache der mathematiker in ein verständliches linux-user-deutsch zu übersetzen.

    'uptime' übergibt sein ausgabe mittels pipe-operator "|" an 'sed'. die eigentliche ausgabe von 'uptime' sieht bei mir dabei wie folgt aus:

    'sed' übernimmt nun diesen string von 'uptime' und wendet das argument "s/regexp/replacement/" darauf an. das argument besteht dabei aus 2 teilen. s/.*up \([^,]*\), .*/\1/

    zum einen die reguläre expression (regexp):  .*up \([^,]*\), .*  und das replacement:  \1 

    die reguläre expression ist für den gemeinen linuxuser dabei nicht ganz so leicht zu verstehen. sie lässt sich grob in 3 teile unterteilen. ich habe sie mal farblich markiert.

    .*up \([^,]*\), .*

    ".*" -- steht für einen string beliebiger länge in dem auch jedes zeichen beliebig oft vorkommen kann.

    "up " -- steht für die zeichen, nach denen als erstes gesucht wird. dabei muss/sollte man wissen, das das leerzeichen nach dem 'up' mit in die suche einbezogen wird. es wird also im ersten teil nach einem string gesucht, der mit beliebigen zeichen beginnt und auf "up " endet.

    der mittlere teil "\([^,]*\)," lässt sich auch nochmal unterteilen. dabei dienen die klammern " \( "," \) " der deklaration für bis zu 9 puffer-variablen, die 'sed' zwischenspeichern kann. alles was zwischen diesen klammern steht wird also in einer variable von \1 bis max. \9 gespeichert.

    [^,]* -- steht für: verwerfe jedes komma , das im weiteren gefunden wird, speichere aber jedes andere zeichen "*" in einer puffer-variable. in diesem fall im ersten puffer \1. das komma am ende der deklaration \(...\), weisst 'sed' an nur die zeichen zu speichern, die bis zum nächsten komma gefunden werden.

    der dritte teil " .*" steht für den rest des stings, den 'uptime' übergeben hat. auch hier ist das leerzeichen wieder ein teil des strings. von 'sed' bearbeitet, sieht der string von 'uptime' dann folgendermassen aus:

    der regexp-teil .*up \([^,]*\), .* des arguments von 'sed'

    ".*up " = "22:19:36 up "

    \([^,]*\), = "5 days" = puffer-variable \1, die letztendlich als 'replacement' ausgegeben wird.

    " .*" = " 4:19, 1 user, load average: 0,85, 0,48, 0,41"

    der replacement-teil \1 des arguments von 'sed'

    "\1" = "5 days"



    wer genau hinschaut, dem wird auffallen, das nur die tage ausgegeben werden, nicht aber die seitdem zusätzlich vergangenen stunden. um das auszugleichen müsste man für 'sed' noch eine zweite puffer-variable definieren und die befehlzeile entsprechend erweitern.

    uptime|sed 's/.*up \([^,]*\),\([^,]*\).*/\1 and\2 hours/'

    rijo...

    faxxy - ganz so kritisch würde ich das jetzt nicht sehen, aber du hast schon recht. ich nutze diese app auch unter android. könnte mir aber vorstellen, das vs2-free-users unser threadstarter diese app möglicherweise nicht kennt oder kannte!? und dann kann sowas schon mal passieren. für linux gibt es so unsagbar viel im netz. das es hier nicht unbedingt nötig ist. aber etwas vergleichbares im netz zu finden kann manchmal auch ganz schön ausarten. meistens findet man solche dinge eher etwas zufällig beim surfen im netz als beim gezielten suchen danach.

    rijo...