grep und Variablen

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von Tommy_WY, 04.05.2009.

  1. #1 Tommy_WY, 04.05.2009
    Zuletzt bearbeitet: 05.05.2009
    Tommy_WY

    Tommy_WY Mitglied

    Dabei seit:
    03.06.2008
    Beiträge:
    28
    Zustimmungen:
    0
    hi @ all,

    ich habe folgendes problem.
    in einem script (ksh unter aix) soll eine Datei error_messages.txt als array verwendet werden. in dieser datei werden fortlaufend neue auftretende fehlermeldungen eingetragen.
    mit hilfe dieser datei sollen die in einem log-verzeichnis abgelegten logfiles nach den fehlermeldungen aus der datei error_messages.txt durchsucht werden. das script soll per mail melden, wenn es eine der errors in der gerade durchsuchten log-datei findet.
    soweit funzt auch alles, bis auf die kleine tatsache, dass anscheinend die varibale, die den error enthält, von grep völlig ignoriert wird.
    anscheinend sucht grep nach dem variablennamen und nicht nach dem inhalt der variablen.

    das ganze sieht in etwa so aus, einige ausgaben dienen nur dem debug und kommen in der endversion raus. Die schleifen werden abgearbeitet, WD ist das workdir, LOG ist das logdir. Wenn ein key-word gefunden wird, soll die zeile mit dem key-word nach ${WD}/${logarray[$a]}.list geschrieben werden.

    wie gesagt, das klappt auch alles nur eben das grep anscheinend nicht
    in der version ist $errorarray[$i] gequotet --> klappt auch nicht, ohne auch nicht.

    für ne idee wäre ich wirklich dankbar.

    Code:
    ls > ${WD}/log_list
    
    while read list
    	do
    			logarray[a]="$list"
    			cp ${logarray[$a]} ./log_temp
    			while read errors
    				do
    					errorarray[i]="$errors"
    					cd ${LOG}
    					echo ${logarray[$a]}
    					echo ${errorarray[$i]}
    					cd log_temp
    					grep -in '\\${errorarray[\\$i]}' * >> ${WD}/${logarray[$a]}.list
    					((i=i+1))
    				done < ${WD}/error_message.txt
    				rm ${logarray[$a]}
    		if [ -s "${WD}/${logarray[$a]}.list" ]
    		then
    			# Fehlermeldung per Mail verschicken
    			echo > MAIL
    			echo " Something is wrong !!!!!" >>MAIL
    			echo "siehe log-File ${logarray[$a]} !!!!!!!!!!" >>MAIL
    			echo "Ende der Nachricht" >>MAIL
    			if [ -n $MAIL2 ] 
    			then
    				[ -f MAIL ] && cat MAIL |  mailx -s " ${logarray[$a]}!!!!!" $MAIL2 <${WD}/${logarray[$a]}.list
    			fi
    		fi
    		rm ${LOG}/MAIL
    		#rm ${WD}/${logarray[$a]}.list
    		echo ${a} " vorher"
    		((a=a+1))	
    		echo ${a} " nachher"
    	done < ${WD}/log_list

    Code-Tag ist verwendet.
    Hat jemand ne Idee????

    Servus
    Tommy
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 aspire_5652, 04.05.2009
    aspire_5652

    aspire_5652 Tripel-As

    Dabei seit:
    02.01.2008
    Beiträge:
    198
    Zustimmungen:
    0
    bitte künftig Code-Tags benutzen (#-Knopf)
     
  4. #3 Tommy_WY, 05.05.2009
    Tommy_WY

    Tommy_WY Mitglied

    Dabei seit:
    03.06.2008
    Beiträge:
    28
    Zustimmungen:
    0
    sorry, wusste ich nicht, ist drin
     
  5. #4 bytepool, 05.05.2009
    bytepool

    bytepool Code Monkey

    Dabei seit:
    12.07.2003
    Beiträge:
    791
    Zustimmungen:
    0
    Ort:
    /home/sweden/göteborg
    Hi,
    super, jetzt die Einrueckungen nur noch vernuenftig machen, und die Fehlerbeschreibung ein wenig verbessern, und alle sind gluecklich. ;)

    Aber mal im Ernst, ich habe deinen ersten Post nach kurzem ueberfliegen auch direkt ignoriert, weil du erstens keine Code-Tags verwendet hattest, zweitens die Fehlerbeschreibung recht schwer zu lesen ist, und drittens nicht weiter ausgefuehrt ist, um welche Zeile in deinem Code Auszug es sich eigentlich handelt. Nur so als Hinweis, fuer zukuenftige Hilfe Gesuche.

    Jetzt mit Code-Tags kann man sich das ganze ja zumindest mal angucken.

    Ja. Ich vermute du beziehst dich auf diese Zeile?
    Code:
    grep -in '\\${errorarray[\\$i]}' [...]
    
    Wenn sich die ksh in diesem Punkt nicht voellig von der bash unterscheidet, und ich denke nicht, dann musst du hier double quotes ("") statt single quotes ('') verwenden. Single quotes sorgen dafuer, dass jegliche Interpretation der Shell unterdrueckt wird, d.h. die Variable wird nicht durch ihren Inhalt ersetzt. Wobei mir auch nicht klar ist, was du mit dem double backslash (\\) erreichen willst.

    Ich vermute dass es so in etwa korrekt sein sollte:
    Code:
    grep -in "${errorarray[$i]}" [...]
    
    mfg,
    bytepool
     
  6. #5 Tommy_WY, 06.05.2009
    Tommy_WY

    Tommy_WY Mitglied

    Dabei seit:
    03.06.2008
    Beiträge:
    28
    Zustimmungen:
    0
    hi, soweit war ich mittlerweile auch schon.
    es ist richtig, dass ich " verwenden muss, allerdings mit dem nachteil, dass für grep nur das interessant ist, was in den double quotes steht.
    ein * am ende wird z. b. ignorriert.
    Code:
    grep -in "${errorarray[$i]}" * >> [...]
    
    habe jetzt die datei so angepasst, dass die variable errorarray den vollständigen grepstring enthält.
    bsp für den inhalt der error_message.txt
    'Compile failed' +
    'Result: 103' +
    'Result: 1' +​

    das script setzt das ganze jetzt so um



    das script läuft mit set -o xtrace und verbose, daher die ausgabe.

    was mit jetzt noch schwierigkeiten macht, ist das schreiben in die entsprechende datei, also der part >>
    Code:
    grep -in "${errorarray[$i]}" [B]>>${WD}/${logarray[$a]}.list[/B]
    
    ich verwende ähnliches auch in anderen scripten, aber hier klappt es einfach nicht. die dateien sind immer 0 byte gross.
    finde ich aber noch heraus oder ich werde mich mal an perl setzen.

    gruss
    tommy
     
  7. #6 bytepool, 06.05.2009
    bytepool

    bytepool Code Monkey

    Dabei seit:
    12.07.2003
    Beiträge:
    791
    Zustimmungen:
    0
    Ort:
    /home/sweden/göteborg
    Hi,
    Was glaubst du denn mit dem Stern am Ende zu erreichen?

    Woher weiss denn grep nun, was er als Input nehmen soll? Ohne wirklich zu wissen wie die ksh genau arbeitet, wuerde ich vermuten dass da der Fehler zu suchen ist.

    Nebenbei, was haelst du davon wenigstens deine Satzanfaenge gross zu schreiben? Das wuerde deinen Buchstabensalat direkt einiges lesbarer machen...

    mfg,
    bytepool
     
  8. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  9. #7 Tommy_WY, 11.05.2009
    Tommy_WY

    Tommy_WY Mitglied

    Dabei seit:
    03.06.2008
    Beiträge:
    28
    Zustimmungen:
    0
    Normalerweise schreibe ich alles klein, ist das ein Problem???
    Ich halte das nicht für Buchstabensalat, ich kann lesen.

    Für den * verweise ich gerne auf RegEx, da steht es drin.
    * bedeutet soviel, dass der Suchstring mehrmals oder keinmal vorkommen kann. Such einfach mal im Web nach Regular Expressions.

    errorerray ist, wie der Name schon sagt, ein Array. Wie die Variable gefüllt wird, steht im Quellcode.

    Aber ich seh schon, eine Antwort werde ich wohl nicht erhalten.
    Schau ich mir mal die Sache mit Perl an.

    Gruss
    Tommy
     
  10. #8 bytepool, 11.05.2009
    bytepool

    bytepool Code Monkey

    Dabei seit:
    12.07.2003
    Beiträge:
    791
    Zustimmungen:
    0
    Ort:
    /home/sweden/göteborg
    Hi,

    mit konsequenter Kleinschreibung kann ich persoenlich leben, das habe ich frueher ehrlich gesagt auch so gemacht. Aber wenn du noch nicht mal die Satzanfaenge gross schreibst, stoert das den Lesefluss doch schon extrem.
    http://catb.org/esr/faqs/smart-questions.html#writewell

    Aha, wir kommen der Sache schon naeher. Du glaubst also, das waere eine regular expression. Deswegen frag' ich ja.
    Also nehmen wir mal fuer einen Moment an,
    Code:
    foobar *
    
    waere eine regular expression, dann wuerde * nur auf das Leerzeichen hinter foobar matchen, der Ausdruck muesste natuerlich noch korrekt geklammert werden.

    Aber das ist kein regulaerer Ausdruck, sondern das * wird, bevor der Ausdruck an grep weitergegeben wird, von der ksh interpretiert. Das nennt sich globbing. Ein einzelnes Sternchen wird durch die Namen aller sich im aktuellen Verzeichnis befindlichen Dateien ersetzt.

    D.h. mit
    Code:
    grep foobar *
    
    durchsuchst du alle Dateien im aktuellen Verzeichnis nach foobar. Eventuell ist das was du willst, aber dann haettest du dich sehr ungluecklich ausgedrueckt, denn globbing hat erstmal nichts mit regular expressions zu tun.

    Wie deine grep (AIX) Version mit regular expressions umgeht, wuerde ich in der Manpage nachschlagen, ich habe hier nur GNU grep zur Verfuegung. GNU grep musst du z.B. noch ein -E mitgeben, damit bestimmte Konstrukte korrekt erkannt werden, dafuer gibt es unter anderem auch egrep.

    Du hast meine Frage nicht verstanden. Ich habe nicht gefragt was in der Variable steht, sondern woher grep seinen Input bekommt. Mit der Variable gibst du das Suchmuster an, aber wo gibst du an, wo er ueberhaupt suchen soll? Nirgendwo. Ergo: empty file. Wenn du das mit GNU grep machst, haelt das Skript einfach an, und er wartet auf Input.

    Du machst es einem aber auch nicht leicht. ;)
    Ich habe fast das Gefuehl als wuerdest du dich von meinen Fragen angegriffen fuehlen.

    Das geht natuerlich auch immer. Das ist gerade wenn es um regular expressions und Logfiles geht manchmal die bessere Loesung.

    Naja, ich hoffe wir haben jetzt alle Missverstaendnisse beseitigt...

    mfg,
    bytepool
     
Thema:

grep und Variablen

Die Seite wird geladen...

grep und Variablen - Ähnliche Themen

  1. nach variablen mit grep suchen

    nach variablen mit grep suchen: Hallo Ich kenne mich nicht besonders toll mit grep aus, und hätte da mal ne Frage: Ich will mit grep meine Implementierungen nach Variblen und...
  2. Quoting von Variablen und Grep

    Quoting von Variablen und Grep: Hola, Ich möchte in der Shell folgendes ausführen. Manuell geschrieben funktioniert das. cat $FFILE | grep '"'"$RTYPE"'"' | grep -v...
  3. Kurztipp: Unerwünschte grep-Ausgaben vermeiden

    Kurztipp: Unerwünschte grep-Ausgaben vermeiden: Selbst aus altbekannten Programmen kann man oft noch einiges mehr herausholen - man muss sich nur einmal gründlich mit ihnen auseinandersetzen....
  4. GNU Grep 2.19 freigegeben

    GNU Grep 2.19 freigegeben: Von dem Textsuchprogramm GNU Grep ist jetzt Version 2.19 erschienen, die um durchschnittlich zehn Prozent schneller als die Vorgängerversion...
  5. KWin 4.90.1 wartet auf Bugreports

    KWin 4.90.1 wartet auf Bugreports: Martin Gräßlin, Maintainer des KDE-Fenstermanagers, hat den Code für KWin/5 als für gut genug befunden, um ihn im erweiterten Kreis testen zu...