Diese Website existiert nur weil wir Werbung mit AdSense ausliefern.
Bitte den AdBlocker daher auf dieser Website ausschalten! Danke.

Variable mit Variable definieren

Alles rund um die verschiedenen Konsolen und shells sowie die Programmierung unter Linux

Moderator: Moderatoren

Antworten
Linux-cReAtUrE
Newbie
Newbie
Beiträge: 3
Registriert: 5. Jun 2005, 20:33
Kontaktdaten:

Variable mit Variable definieren

Beitrag von Linux-cReAtUrE »

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: Alles auswählen

Suchkriterium=$(Zeile// /[[:space:]])
hat es nicht funktioniert
nun meine neue Idee:

Code: Alles auswählen

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...
Benutzeravatar
nobbiew
Hacker
Hacker
Beiträge: 497
Registriert: 1. Mär 2004, 23:26

Beitrag von nobbiew »

Du denkst ziemlich kompliziert.

Versuch mal folgendes

Code: Alles auswählen

for line in `cat $TEMP_FILE`
do
if [ "${searchlist}" == "" ]; then 
	searchlist=$line; 
else
searchlist="${searchlist}[[:space:]]$line"
fi
done
echo $searchlist;
Benutzeravatar
robi
Moderator
Moderator
Beiträge: 3204
Registriert: 25. Aug 2004, 02:13

Re: Variable mit Variable definieren

Beitrag von robi »

Linux-cReAtUrE hat geschrieben: 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: Alles auswählen

grep "$(cat $TEMP_FILE)" logdatei
oder jedes Wort als einzelnen suchkriterium dann so hier

Code: Alles auswählen

grep -e $( sed -e "s/ / \-e /g" $TEMP_FILE ) logdatei
robi
Linux-cReAtUrE
Newbie
Newbie
Beiträge: 3
Registriert: 5. Jun 2005, 20:33
Kontaktdaten:

Beitrag von Linux-cReAtUrE »

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: Alles auswählen

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]
Benutzeravatar
TeXpert
Guru
Guru
Beiträge: 2166
Registriert: 17. Jan 2005, 11:22

Beitrag von TeXpert »

ich versteh auch noch nicht so ganz was Du willst ;) aber ich versuchs mal:

Eingabe1: Datei mit Suchwortliste:

Code: Alles auswählen

foo
bar
baz
daraus soll Suchmaske werden:

Code: Alles auswählen

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: Alles auswählen

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: Alles auswählen

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: Alles auswählen

wort[[:space:]]+wort[[:space:]]+wort
damit immer mindestens 1 Whitespace auftritt. Das wäre dann mit Bashmitteln so möglich:

Code: Alles auswählen

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

Code: Alles auswählen

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.

Code: Alles auswählen

# to resolve all your problems, try this:
HOWTO='pack c5,41*2,sqrt 7056,unpack(c,H)-2,oct 115' && perl -le "print $HOWTO"
Ich beantworte keine Supportfragen per PM!
Antworten