Variable auf bestimmte zeichenfolge durchsuchen

Brusko

Well-Known Member
Guten Abend oder schon fast guten morgn :-)

Ich hab da eine $test Variable die ich mit daten aus einer datei fülle (leerzeichen zahlen buchstaben alles drin)
test=`tail -n $anzahlfuehler /$templogdatei`

nun möchte ich gerne die $test variable nach dem string "beendet" durchsuchen und bestätigen lassen z.b mit ok oder no.

Könnte mir jemand bissel aufe sprünge helfen ?

mfg Michael
 
Wie wärs mit sowas?
Code:
if [ -n "`echo $test|grep -w beendet`" ]; then echo "Hakuna Matata"; fi
Spricht an, wenn "beendet alleine steht, also durch Leerzeichen getrennt. Sonst kannst du das -w auch wegmachen. Quick and dirty.
 
hatte mit grep auch schon geliebäugelt aber war da noch nicht weiter gegkommen, ich suche gerade noch die seite wo If in script genauer erklärt wurde z.b -o für oder...ich finde die blos nicht wieder *grummel*
genauer mus ich eigentlich nach Auslesung beendet suchen, egal ob es durch leerzeichen oder nicht getrennt ist da es nicht drin vorkommen darf.

eine frage mal zsichen durch, mal sehe ich das die simikolons dahinter sind mal nicht. was ist nu richtig bzw der unterschied ? ich hab bei mir keine dahinter bislang gehts dennoch gut
 
Du könntest auch sed benutzen:
Code:
foo="etwas wurde beendet"
echo $foo | sed -ne '/beendet/p'

Das würde dir $foo ausgeben, wenn im String beendet vorkommt.
 
Hmm, kann mir zufällig jemand mit ein bisschen sed-fu aushelfen?

Ich versuche ein bestimmten wert in eine Shell Variable zu packen, das würde ich mit regex ungefär so machen:
Code:
$intput = "dumdidumm blblb KEY=VALUE";
if( $input ~= /KEY=(.+?)\s+/is ){
 $key = $1;
}

Momentan hab ich das mit sed so gemacht:

Code:
LENGTH=$(echo $IDs | sed -e 's/.*ID_LENGTH=\([0-9]*\).*/\1/')

Aber das schreibt mir die komplette eingabe in die Variable, wenn es keinen match gibt.

Kann mir jemand nen Trick verraten ?
 
so wie ich es oben schon gemacht habe, müsste es gehen.

sed -n -e 's/foo/bar/p'

-n unterdrückt das printing, das p am schluss erzwingt es, wenn foo durch bar ersetzt wurde.
 
Mannmannmann, Ihr seid ja echte Helden der Shell.

Code:
if [ "X$test" != "X${test#*beendet}" ]; then echo "fertich"; fi

Oder:

Code:
case $test in *beendet*) echo "fertich";; esac
 
Ich kann mich mir der Shell einfach nicht anfreunden, sie scheint mir keinem erkennbaren schema zu folgen oder irgendeine Ordnung zu besitzen. Sei es sed, grep oder auch allein die syntax. Wer einen Link kennt der mir das Schema oder das Warum ohne Ausreden erklärt und diesen hier posted darf sich einen Held nennen :huth:.
 
nu sind es schon einige möglichkeiten ..mal probieren was da wohl am besten klappt
FreeBSDuser nu ich wollt ebend mit dem script eine schöne logdatei machen die ich dann von anderem programm auslesen kann.die 18 Fühler mit digitemo laufen bislang ohne probleme. werden alle 2 minuten ausgelesen und nu soll das cript dazu ausgebaut werden.
 
Unix bietet einem halt mehr als einen Weg nach Rom...

Mir ging es vor allem darum, dass man einiges direkt mit sh(1) erledigen kann, ohne extra Prozesse zu forken. Normalerweise ist das natuerlich totagl egal, aber wenn ein Script tausende mal testen will, ob ein String auf irgendwas matched, dann wird eine Kombination aus echo(1) und grep(1) wirklich teuer.
 
Hallo Kili,
nun das klingt irgendwie logisch...so wenige prozesse wie möglich zu machen, ich bin aber noch anfanger und nehme gerne auch mal nen anderen Weg nach Rom :-). Aber ich werde dein Code versuchen und mir das ganze mal genauer anschauen. aber wo zu ist denn das X noch wieder vor der Varibale $test ? kann könnte man damit auch zb nach "Test Test" suchen also mit Freizeichen ?
 
Hallo Kili,
nun das klingt irgendwie logisch...so wenige prozesse wie möglich zu machen

Wie gesagt gilt das vor allem, wenn ein Schnippsel in einem Shellscript sehr oft aufgerufen wird.

Aber ich werde dein Code versuchen und mir das ganze mal genauer anschauen. ]/quote]

Bitte auch einen Blick auf die Manpage sh(1) werfen, und auch mal auf das Zeugs hier:

http://www.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_02

aber wo zu ist denn das X noch wieder vor der Varibale $test?

Historisch bedingt. Es gab Implementierungen von test(1) bzw. sh(1) mit eingebautem test(1), bei denen etwas wie

Code:
test "$foo" = "$bar"

in die Hose geht, sobald $foo und/oder $bar leer oder undefineirt sind, d.h. einer der beiden Strings die Laenge 0 hat.

Code:
test "X$foo" = "X$bar"

sorgt dafuer, dass test(1) niemals leere Strings sieht. Bleibt natuerlich die Frage, ob denn auf Systemen mit so einem alten test(1) so etwas wie Parameterexpansion mit Substringmatching (das ${foo#*beendet} Ding) funktioniert.

kann könnte man damit auch zb nach "Test Test" suchen also mit Freizeichen?

Ausprobierenderweise: ja. Was exakt erlaubt ist, muesste ich aber selbst noch mal nachlesen. Wenn Du mit case ... esac loslegst, sollte aber auf jeden Fall etwas wie

Code:
case $test in *Test\ Test*) machwas;; esac

funktionieren (also mit per Backslash geschuetztem Leerzeichen).
 
nun ist ja eine überöegung wert das mal auszuprobieren :-) aber schitt warum sind die manpages immer auf Englisch...gibs da mal ne Deutsche übersetzung *g*?
 
Zurück
Oben