sed in Shell-Script?! Ausgabe einer einzelnen Zeile

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
brahma
Beiträge: 653
Registriert: 28.08.2003 11:05:46
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Münsterland

sed in Shell-Script?! Ausgabe einer einzelnen Zeile

Beitrag von brahma » 06.03.2009 15:01:05

Ich möchte eine Zeile aus einer Datei auslesen und ausgeben. Welche Zeile soll jeweils per Random entschieden werden. Nur dummerweile klappt das mit dem auslesen nicht....

Code: Alles auswählen

#!/bin/sh

# IRC-Daten
#PORT=$1;SERVER=$2;TARGET=$3;USER=$4;OBJ=$5;

# Anzahl der Zitate ermitteln
LINES=`sed $= -n zitate.txt`;

# Zufallszitat wählen (1- max Zeile $LINES)
LINE=$[($RANDOM % $LINES) + 1];

# Zitat auslesen
ZITAT=`sed -n '/$LINE/p' zitat.txt`;

# Zitat ausgeben
echo Zeilen: $LINES - Zufall: $LINE - Zitat: $ZITAT;
#dcop $PORT default say $SERVER "$TARGET" "$ZITAT";
Ausgegeben wird mir aber nur:
Zeilen: 64 - Zufall: 16 - Zitat: echo $LINES
Was mach ich falsch, bzw. wie krieg ich das hin?
/* NO COMMENT */

nepos
Beiträge: 5238
Registriert: 05.01.2005 10:08:12

Re: sed in Shell-Script?! Ausgabe einer einzelnen Zeile

Beitrag von nepos » 06.03.2009 15:18:51

Ändere mal diese Zeile

Code: Alles auswählen

ZITAT=`sed -n '/$LINE/p' zitat.txt`;
in

Code: Alles auswählen

ZITAT=`sed -n "/$LINE/p" zitat.txt`;
Die Single-Quotes verhindern, dass die Shell hier den Wert für $LINE einsetzt.
Eventuell muss es auch "'/$LINE/p'" sein. Da bin ich mir nicht sicher.

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Re: sed in Shell-Script?! Ausgabe einer einzelnen Zeile

Beitrag von Duff » 06.03.2009 15:22:48

So sollte es funktionieren:

Code: Alles auswählen

daniel@homer:~/scripts$ cat test.sed.bash 
#!/bin/sh

# IRC-Daten
#PORT=$1;SERVER=$2;TARGET=$3;USER=$4;OBJ=$5;

# Anzahl der Zitate ermitteln
LINES=`sed $= -n zitate.txt`;

# Zufallszitat wählen (1- max Zeile $LINES)
LINE=$[($RANDOM % $LINES) + 1];

# Zitat auslesen
ZITAT=$(sed -n "$LINE p" zitate.txt)

# Zitat ausgeben
echo Zeilen: $LINES - Zufall: $LINE - Zitat: $ZITAT;
#dcop $PORT default say $SERVER "$TARGET" "$ZITAT";

daniel@homer:~/scripts$ ./test.sed.bash 
Zeilen: 17 - Zufall: 16 - Zitat: echo Zeilen: $LINES - Zufall: $LINE - Zitat: $ZITAT;
daniel@homer:~/scripts$ ./test.sed.bash 
Zeilen: 17 - Zufall: 13 - Zitat: ZITAT=`sed -n '/$LINE/p' zitat.txt`;
daniel@homer:~/scripts$ ./test.sed.bash 
Zeilen: 17 - Zufall: 11 - Zitat:
Oh, yeah!

Benutzeravatar
brahma
Beiträge: 653
Registriert: 28.08.2003 11:05:46
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Münsterland

Re: sed in Shell-Script?! Ausgabe einer einzelnen Zeile

Beitrag von brahma » 06.03.2009 15:31:19

Hm, da ändert sich was, aber noch nicht das gewünschte Ergebnis :(

Code: Alles auswählen

ZITAT=`sed -n "/$LINE/p" zitat.txt`;
führt zu
Zeilen: 64 - Zufall: 16 - Zitat:

Code: Alles auswählen

ZITAT=`sed -n '"/$LINE/p"' zitat.txt`;
führt zu
Zeilen: 64 - Zufall: 31 - Zitat: unknown command: `''
sed -e Ausdruck #1, Zeichen 1:

Code: Alles auswählen

ZITAT=`sed -n "'/$LINE/p'" zitat.txt`;
führt zu
Zeilen: 64 - Zufall: 31 - Zitat: unknown command: `"'
sed -e Ausdruck #1, Zeichen 1:
EDIT: Deins führt auch zu der Ausgabe
Zeilen: 64 - Zufall: 16 - Zitat:
Duff :(

EDIT2: Danke Duff, geht doch! In der sed-Zeile ist der Dateiname falsch zitate.txt muss das sein :D
/* NO COMMENT */

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Re: sed in Shell-Script?! Ausgabe einer einzelnen Zeile

Beitrag von Duff » 06.03.2009 16:04:27

Kein Problem. Hatte ich in meinem Beispiel auch abändern müssen ;-)
Oh, yeah!

Benutzeravatar
tzzaetaynzz
Beiträge: 70
Registriert: 10.05.2006 11:35:22

Re: sed in Shell-Script?! Ausgabe einer einzelnen Zeile

Beitrag von tzzaetaynzz » 06.03.2009 23:00:03

Die Anzahl der LINES in der zitat.txt bekommt man auch (kürzer) so:

Code: Alles auswählen

cat zitat.txt | wc -l
gruss //tzzaettaynzz

---

„Have you tried turning it off and on again?“

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Re: sed in Shell-Script?! Ausgabe einer einzelnen Zeile

Beitrag von Duff » 06.03.2009 23:09:31

tzzaetaynzz hat geschrieben:Die Anzahl der LINES in der zitat.txt bekommt man auch (kürzer) so:

Code: Alles auswählen

cat zitat.txt | wc -l
Oder aber direkt mit wc -l zitat.txt.

Mal eine kleine Datei mit time und unterschiedlichen Möglichkeiten gemessen.

Code: Alles auswählen

daniel@homer:/etc/dhcp3$ time awk 'END {print NR}' dhcpd.conf
172

real	0m0.001s
user	0m0.000s
sys	0m0.000s
daniel@homer:/etc/dhcp3$ time sed $= -n dhcpd.conf
172

real	0m0.001s
user	0m0.000s
sys	0m0.000s
daniel@homer:/etc/dhcp3$ time wc -l dhcpd.conf
172 dhcpd.conf

real	0m0.001s
user	0m0.000s
sys	0m0.000s
daniel@homer:/etc/dhcp3$ time cat dhcpd.conf|wc -l
172

real	0m0.002s
user	0m0.004s
sys	0m0.000s
Oh, yeah!

Benutzeravatar
tzzaetaynzz
Beiträge: 70
Registriert: 10.05.2006 11:35:22

Re: sed in Shell-Script?! Ausgabe einer einzelnen Zeile

Beitrag von tzzaetaynzz » 08.03.2009 20:04:10

Bei der direkten Variante wc -l ist der Dateiname noch zu sehen! ;)

Code: Alles auswählen

arno@emma:~# cat /etc/passwd | wc -l
45

Code: Alles auswählen

arno@emma:~# wc -l /etc/passwd 
45 /etc/passwd
gruss //tzzaettaynzz

---

„Have you tried turning it off and on again?“

Benutzeravatar
GoKi
Beiträge: 2068
Registriert: 04.07.2003 23:08:56
Lizenz eigener Beiträge: MIT Lizenz

Re: sed in Shell-Script?! Ausgabe einer einzelnen Zeile

Beitrag von GoKi » 09.03.2009 00:11:24

tzzaetaynzz hat geschrieben:Bei der direkten Variante wc -l ist der Dateiname noch zu sehen! ;)
Wobei man das auch ohne cat hinbekommt und man sich somit einen Prozess sparen kann.

Code: Alles auswählen

wc -l < /etc/passwd
MfG GoKi
:wq

Benutzeravatar
tzzaetaynzz
Beiträge: 70
Registriert: 10.05.2006 11:35:22

Re: sed in Shell-Script?! Ausgabe einer einzelnen Zeile

Beitrag von tzzaetaynzz » 15.03.2009 09:50:40

stimmt. :)
gruss //tzzaettaynzz

---

„Have you tried turning it off and on again?“

Antworten