• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Variable mit Variable definieren

Tach auch...

Habe da mal ein Problem mit nem Bash script..
Ich versuche mit grep eine Zeile (ca 14 Wörter) als Suchkriterium in einer Log File zu suchen

Dazu lese ich die Zeile vorher aus einer temp Datei aus.
Da dort Leerzeichen drin sind, Meckert grep rum.

Nun habe ich versucht die Wörter zu zählen
und mit einer For Schleife die Leerzeichen durch [[:space:]] zu ersetzen.
mit
Code:
Suchkriterium=$(Zeile// /[[:space:]])
hat es nicht funktioniert
nun meine neue Idee:
Code:
Anz=$(wc -w $TEMP_FILE)
Anz=${Anz:0:2}
exec 3<&0 0< $TEMP_FILE
typeset -i i=1
while
read line
do
IFS=" "
set -- $line
for (( i=0; i < $Anz; i++ ))
do
NEW_Zeile=$NEW_Zeile$($i)"[[:space:]]"
done
echo $NEW_Zeile

Also duch das "set -- $line" nutze ich dann die Systemvariablen $1, $2, $3 usw
und diese will ich dann mit "i" in der Schleifer erhöhen
das die einzelnen Variablen mit [[:space:]] hintereinander gehängt werden, so das ich einen Satz (Zeile) erhalte und an grep übergeben kann...

Das $($i) ist dieses mit der Variable von i generieren lassen...

Hoffe das von Euch einer nen heissen Tipp hat, danke schon mal...
 
Du denkst ziemlich kompliziert.

Versuch mal folgendes
Code:
for line in `cat $TEMP_FILE`
do
if [ "${searchlist}" == "" ]; then 
	searchlist=$line; 
else
searchlist="${searchlist}[[:space:]]$line"
fi
done
echo $searchlist;
 
A

Anonymous

Gast
Linux-cReAtUrE schrieb:
Ich versuche mit grep eine Zeile (ca 14 Wörter) als Suchkriterium in einer Log File zu suchen
Dazu lese ich die Zeile vorher aus einer temp Datei aus.
Da dort Leerzeichen drin sind, Meckert grep rum.

Ich werde nicht so ganz schlau ob du alles suchst dann so hier

Code:
grep "$(cat $TEMP_FILE)" logdatei

oder jedes Wort als einzelnen suchkriterium dann so hier
Code:
grep -e $( sed -e "s/ / \-e /g" $TEMP_FILE ) logdatei

robi
 
Also da sage ich doch mal ein
Riesen Dankeschön....

Und zu meiner Umständlichkeit...

" Bin ja noch am Üben " ;-)
Und wenn man noch nicht alle Tricks und Kniffe weiss, nimmt man das was man kennt...

Übung macht den Meister... und die meisten Scripts werden doch eh erst zum schluss optimiert und minimiert, nehme ich mal an..

Und nochmals Danke

Nun habe ich ein weiteres Problem...

`egrep $searchlist $TEMP_FILE2`

gibt mir kein Ergebniss, nichts
und es soll als If abrage laufen

Evtl bin ich da ja wieder zu kompliziert....

If ob vorhanden
wenn ja Zeilennummer auslesen
und ab der Zeile in einer Anderen File ein SuchFilter anfangen lassen -> mit sed halt den rest der Datei löschen und mit grep den rest durchforsten
sieht bisher so aus...
Code:
if [ "`grep -E $searchlist /var/log/templog`" ]; then
	VarCode=":"
	Zeile=$($line%$VarCode)
	sed -e '1,$Zeile d' /var/log/templog_count &> /var/log/templog
fi

Also wieso läuft grep nun nicht? (Beide Scripts sind in einem)
Und ist der Rest denn so iO, für den If und mit sed...

[/quote][/code]
 
ich versteh auch noch nicht so ganz was Du willst ;) aber ich versuchs mal:

Eingabe1: Datei mit Suchwortliste:
Code:
foo
bar
baz

daraus soll Suchmaske werden:

Code:
foo bar baz

das wäre am einfachsten so (dabei werden alle Whitespaces am Anfang und am Ende des gesamten Strings abgeschnitten, sind die gewünscht, ist das END-Konstrukt anzupassen)

Code:
SUCHMASKE="$(perl -ne 'BEGIN {$a="";} END{$a =~ s/\s+$//; $a =~ s/^\s+//; print $a;} {chomp; $a .= "$_ ";}' < suchworte.txt)"

denn irgendwie will mir der Sinn der [[:space:]] nicht klar werden, grep findet auch die Zeichenkette 'foo bar baz' wenn danach gesucht wird... da ist die entsprechende Zeichenklasse nicht nötig (es sei denn Du willst auch Tabulatoren erschlagen...)


der Vorschlag von robi:
Code:
grep "$(cat $TEMP_FILE)" logdatei
ist dann nicht geeignet, wenn immer alle Worte in einer Zeile auftreten sollen, da durch die Zeilenwechsel dann auch teilmengen gefunden werden.


Die Verwendung von der Whitespace-Klasse macht IMHO aber nur dann Sinn, wenn Du mehrere Spaces oder Tabs nutzen willst, dann muss die RegEx aber so aussehen:
Code:
wort[[:space:]]+wort[[:space:]]+wort
damit immer mindestens 1 Whitespace auftritt. Das wäre dann mit Bashmitteln so möglich:

Code:
 while read input ; do SUCHLISTE="$SUCHLISTE[[:space:]]+$input"; done < suchworte.txt
jetzt noch schnell das führende space abschneiden:

Code:
SUCHLISTE="`echo "$SUCHLISTE" | sed -e 's/^\[\[:space:\]\]+\+//'`"

jetzt passt ein egrep "$SUCHLISTE" logfile auf viele verschiedene Vorkommen ;)


aber Du siehst, Du solltest genauer sagen was Du willst, damit man Dir besser helfen kann.
 
Oben