grep und Variablen

T

Tommy_WY

Mitglied
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
 
Zuletzt bearbeitet:
bitte künftig Code-Tags benutzen (#-Knopf)
 
Hi,
Code-Tag ist verwendet.
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.

Hat jemand ne Idee????
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
 
Hi,


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.

vergiss die \\, das war ein versuch. hab da irgendwo irgendwas gelesen. :)

Ich vermute dass es so in etwa korrekt sein sollte:
Code:
grep -in "${errorarray[$i]}" [...]

mfg,
bytepool

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

+ read errors
+ errorarray='Compile failed' +
+ grep -in 'Compile failed' +
+ 1>> /opt/daten/nightly_build_phase2/Build_03:30:03.log.list


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
 
Hi,
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.
Was glaubst du denn mit dem Stern am Ende zu erreichen?

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.
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
 
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

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
 
Hi,

Normalerweise schreibe ich alles klein, ist das ein Problem???

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

Für den * verweise ich gerne auf RegEx, da steht es drin.

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.

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

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.

Aber ich seh schon, eine Antwort werde ich wohl nicht erhalten.

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

Schau ich mir mal die Sache mit Perl an.

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
 

Ähnliche Themen

Switche abfragen über Script

Skript soll nicht doppelt laufen... kill pkill pid cron

Verschlüsseltes Backup-Script mit rsync

script sshpass

Variable mit 'tr' ändern

Zurück
Oben