Koplizierte Sache.. AWK oder SED ??

R

rabadag

Mitglied
Hallo Forum und Unix Freunde.

Bin mal wider an einem Punkt gelang wo ich nicht weis wie ich das Script zum renne bringe.

Ziel ist es mittels for e in ls -a *.conf $dir do;

In jedem gefundenen File bestimmte Zeilen auszulesen und kürzen und in Variable die ich später benötige abzulegen.

Was ich bisher habe.

Code:
#!/bin/sh
#--Createt by Rabadag--------------------------------------------------
# Global variables:
PIDCCCAM=/var/run/AM.pid
CCCAMEXEC=/usr/local/etc/servers/bin/server.bin
CCCAMDIR=/usr/local/etc/servers/bin/
CONFIGS=/usr/local/etc/servers/config
CCCAMDISC="My Server"


cd $CONFIGS
            for e in `ls -a *.conf`; do
	cat $CONFIGS/$e | grep "USERNAME" | sed -e '/^#.*/d' | awk -F "USERNAME : "  {'print $2'} > /tmp/user.txt;
	cat $CONFIGS/$e | grep "PASSWORD" | sed -e '/^#.*/d' | awk -F "PASSWORD : "  {'print $2'} > /tmp/pass.txt;
	cat $CONFIGS/$e | grep "LISTEN PORT" | sed -e '/^#.*/d'| awk -F "LISTEN PORT : "  {'print $2'} > /tmp/port.txt;
    
	  USER=$(cat /tmp/user.txt)
	  PASS=$(cat /tmp/pass.txt)
	  PORT=$(cat /tmp/port.txt)

	    echo $USER
	    echo $PASS
	    echo $PORT
	   
	    URL="http://$USER:$PASS@localhost:$PORT"
	    echo $URL
	    
              if  wget -T 4 -t 3 $URL 
              then 
              echo "$e ok" 
                else
                 echo "$e nicht ok"
fi
done

Prob1

Leider geht das ganze nicht so wie ich das gerne hätte.
Das Pattern
USERNAME : Test
auch mal so sein kann
USERNAME:TEST oder : Test

So nüzt mir das AWK nicht fiel und mit sed versteh ich mich zu wenig um nach dem Doppelpunkt lehrreichen zu entfernen.

Prob 2
Die Variable $URL zeigt mit leider nur http://Test:@127.0.0.1:55001 als wären in den Variablen resp Files die angaben mit enter Zeichen drin.

Kann mir bitte jemand Behilflich sein das zu rennen zu bringen!!

besten Dank im Voraus
 
Ich glaube das Problem liegt eher woanders. Suche mal nach Regular Expressions ;)
 
Wundert mich stark, dass der ueberhaupt so weit kommt.
Erst wechselst du mit cd in $CONFIGS und dann cattest du noch $CONFIGS/$e. Das '$CONFIGS/' erscheint mir da zu viel des Guten.

Edit: Oops, hab uebersehen, dass das ein absoluter Pfad ist. Shame on me.

Kannst du das naechstes mal ein bisschen schoener einruecken? :D
 
Zuletzt bearbeitet:
Hmm.. Ja damit kenne ich mich leider noch nicht so gut aus.
All die Möglichkeiten richtig zu erkennen ist gar nicht einfach..

Hab jetzt mal das ganze soweit mit der Zeiel
Code:
cat $CONFIGS/$e | grep "USERNAME" | sed -e '/^#.*/d' | awk -F "USERNAME" {'print $2'} | awk -F ":" {'print $2'} > /tmp/user.txt;

Das Ergebnis im Textfiel.
username^

Sollte aber so sein
username

also die zwei Lehrschläge weg und das Umbruchzeichen am ende..
 
vielleicht löscht Du noch die Leerzeichen, während die Variable eingelesen wird....
Code:
[FONT="Courier New"]USER="`grep "USERNAME" $CONFIGS/$e | sed -e '/^#.*/d' | [B]sed -e 's/ //g[/B] | awk -F "USERNAME" {'print $2'} | awk -F ":" {'print $2'}`"[/FONT]
Du kannst die Variable übrigens auch gleich beschreiben und musst nicht den Umweg in die Temp-File nehmen...
 
vielleicht löscht Du noch die Leerzeichen, während die Variable eingelesen wird....
Code:
[FONT="Courier New"]USER="`grep "USERNAME" $CONFIGS/$e | sed -e '/^#.*/d' | [B]sed -e 's/ //g'[/B] | awk -F "USERNAME" {'print $2'} | awk -F ":" {'print $2'}`"[/FONT]
Du kannst die Variable übrigens auch gleich beschreiben und musst nicht den Umweg in die Temp-File nehmen...


Das funktioniert schon ganz gut..

aber wie kriege ich noch das Umschlag Zeichen am ende weg?
Inhalt Variable $USER = username^
Denn die Ausgabe der URL ist falsch
user
:pass
:@host:port
anstelle von
user:pass:host:port
 
aber wie kriege ich noch das Umschlag Zeichen am ende weg?
Inhalt Variable $USER = username^
Wenn es das "^"-Zeichen ist ---> wie folgt....
Code:
[FONT="Courier New"]USER="`grep "USERNAME" $CONFIGS/$e | sed -e '/^#.*/d' | sed -e 's/ //g' [B]| sed -e 's/\^$//g'[/B] | awk -F "USERNAME" {'print $2'} | awk -F ":" {'print $2'}`"[/FONT]

Es könnte aber auch eine falsch kopierte Datei sein, in der am Ende jeder Zeile ein Zeichelumbruch steht.... (DOS-Format)
Diese erkenntst Du am "^M" Zeichen am Ende einer Zeile, wenn Du die Datei mit vi öffnest....
 
Wenn es das "^"-Zeichen ist ---> wie folgt....
Code:
[FONT="Courier New"]USER="`grep "USERNAME" $CONFIGS/$e | sed -e '/^#.*/d' | sed -e 's/ //g' [B]| sed -e 's/\^$//g'[/B] | awk -F "USERNAME" {'print $2'} | awk -F ":" {'print $2'}`"[/FONT]

Es könnte aber auch eine falsch kopierte Datei sein, in der am Ende jeder Zeile ein Zeichelumbruch steht.... (DOS-Format)
Diese erkenntst Du am "^M" Zeichen am Ende einer Zeile, wenn Du die Datei mit vi öffnest....

Hmm da hast du allerdings Recht, es ist dos Format mit dem ^m Zeichen dahinter.

das interessante aber, ist: Ich übertrage mittels scp das fiele auf den Server
Auf dem Quellserver hab ich kein dos Format. aber auf dem Zielserver wo auch das Script hin soll schon. seit wann ändert SCP Formate? Ist mir unlogisch.

OK wie muss nun die ziele aussehen für das ^m zu entfernen?
.
.
.
EDIT (autom. Beitragszusammenführung) :
.

oh habs grad selbst gefunden..

Die lösung mittels
tr -d '\r$'

USER="`grep "^USERNAME" $CONFIGS/$e | tr -d '\r$' | sed -e '/^#.*/d' | sed -e 's/ //g' | sed -e 's/\^$//g' | awk -F ":" {'print $2'}`"

Das Funktioniert..
 
Zuletzt bearbeitet:

Ähnliche Themen

sed in awk

E/A-Fehler (.snapshots is not a btrfs subvolume).

Telefoninterview (Wie sich auf Bash-Shell-Fragen vorbereiten?)

Zugriff auf Samba Fileserver Freigaben verweigert(Samba 4 Active Directory Domäne)

Sed: Bestimmtes Feld einer "Zeile mit mehreren Feldern" ergänzen

Zurück
Oben