Forum: PC-Programmierung Probleme mit awk in Linux


von Pascal H. (pase-h)


Lesenswert?

Hallo,
ich bastle mir zurzeit ein Internetradio mit meinen Beaglebone Black.
Als betriebssystem läuft Debian Wheezy (über Konsole - kein GUI).

Zurzeit wird mein Stream mittels VLC-Player wiedergegeben, und ich 
versuche den Titel mit awk herauszufiltern.
Der Output vom VLC-Player zu einen neuen Titel sieht z.B so aus:
1
[0x9e370] access_http access debug: New Title=ROCK ANTENNE - Rock Nonstop
Ich starte den VLC-Player also mit
1
vlc --intf dummy --aout alsa --alsa-audio-device=hw:1,0 -vvv http://mp3channels.webradio.antenne.de:80/rockantenne  2>&1 | awk -F= '/Title/ {print $2}'

Bis jetzt funktioniert auch alles ohne Probleme.
Der aktuell gespielte Song wird auch ohne Probleme angezeigt.

Startet jedoch der nächste Song, dann wird der Titel des neuen Songs 
nichtmehr angezeigt.
Egal wielange ich warte, und wieviele Songs gespielt werden, es kommt 
nichts...

Arbeite ich jedoch mit grep, und lasse mir die ganze Zeile ausgeben, 
dann funktioniert grep immerhin...
grep Start:
1
vlc --intf dummy --aout alsa --alsa-audio-device=hw:1,0 -vvv http://mp3channels.webradio.antenne.de:80/rockantenne  2>&1 | grep "http"
Output von Grep
1
[0x9e370] access_http access debug: New Title=Rick Springfield - Love somebody
2
[0x9e370] access_http access debug: New Title=ROCK ANTENNE - Rock Nonstop
3
[0x9e370] access_http access debug: New Title=Alanis Morissette - Guardian

Wie muss ich jetzt mein awk-Script jetzt umschreiben, dass auch alle 
weiteren Songs angezeigt werden?

Mit freundlichen grüßen
Pascal

von Andreas D. (rackandboneman)


Lesenswert?

-F= scheint ein Argument zu fehlen, evtl ist das beim pasten 
verlorengegangen? Aber grundsätzlich: Bei awk muss man sehr genau 
schauen wie man die Separatoren konfiguriert wenn man mit $1,$2 etc 
arbeitet. Whitespace ist nicht immer gleich whitespace 
(Leerzeichen,Nullzeichen,Tabs...).

von Pascal H. (pase-h)


Lesenswert?

Andy D. schrieb:
> -F= scheint ein Argument zu fehlen, evtl ist das beim pasten
> verlorengegangen?

Nöp, meineswissens gebe ich mit -F meinen Fieldseperator an (in den fall 
'=')

Ich habe mich halt versucht an ein beispiel vom mplayer zu halten, 
welches bei mir auch funktioniert hat (von hier: 
http://forum.ubuntuusers.de/topic/mplayer-und-grep-problem/ ):
1
awk -F\' '/StreamTitle/ {print $2}'

Leider musste ich mich aber vom mplayer entfernen, da der StreamTitle 
vollkommen unsynchron zur Musik war...

Ich habe mittlerweile auch ein paar andere Schreibweisen mit -F 
versucht:
1
-F'=' 
2
-F"="
3
-F="="
4
-F='='
5
-F\=
keine der Kombinationen hat funktioniert.
Ich bin mittlerweile eher ratlos, und weiß nichtmehr, was ich noch 
versuchen soll...

Mit freundlichen grüßen
Pascal

von Rolf M. (rmagnus)


Lesenswert?

Warum muß es denn eigentlich zwingend awk sein? Wenn es damit nicht 
klappt, nimm doch einfach cut.

von Norbert (Gast)


Lesenswert?

man awk:

The function fflush(expr) flushes the output file or pipe associated 
with expr. Fflush returns 0 if expr is an
open output stream else −1. Fflush without an argument flushes stdout. 
Fflush with an empty argument
("") flushes all open output.

von Pascal H. (pase-h)


Lesenswert?

Hallo,
nach mittlerweile ca. 30 Minuten wurden auf einmal alle Titel angezeigt, 
die in der zeit gespielt wurden (mit awk).
Versuche ich die awk methode mit "stdbuf -oL" oder "unbuffered" 
aufzurufen, ändert sich auch nichts.
Ein fflush() in awk ändert die sache auch nicht...

Wenn ich es mit cut versuche funktioniert noch weniger.
1
vlc --intf dummy --aout alsa --alsa-audio-device=hw:1,0 -vvv http://mp3channels.webradio.antenne.de:80/rockantenne  2>&1 | grep "New Title" | cut -d = -f 2
Dann bekomme ich noch weniger Output als mit awk. Dann wird nichtmal der 
aktuelle Name angezeigt...
"greppe" ich wiederhin nur, dann funktionierts ohne "Probleme" - es wird 
halt zu viel angezeigt...
1
vlc --intf dummy --aout alsa --alsa-audio-device=hw:1,0 -vvv http://mp3channels.webradio.antenne.de:80/rockantenne  2>&1 | grep "New Title"

Hat vielleicht noch jemand irgendwelche Tipps für mich?

Mfg
Pascal

: Bearbeitet durch User
von Tom (Gast)


Lesenswert?

Jetzt bin auch ich verwirrt:
1
vlc --intf dummy --aout alsa --alsa-audio-device=hw:1,0 -vvv http://mp3channels.webradio.antenne.de:80/rockantenne  2>&1  | grep 'New Title'
funktioniert wie erwartet.

Pipet man die Ausgabe von grep in irgendwas weiter:
1
vlc --intf dummy --aout alsa --alsa-audio-device=hw:1,0 -vvv http://mp3channels.webradio.antenne.de:80/rockantenne  2>&1  | grep 'New Title' | cat
kommt nichts.

WZF passiert da?

von Rolf M. (rmagnus)


Lesenswert?

Du mußt bei grep den Kommandozeilenparameter --line-buffered mit 
angeben. Sonst werden die Daten zwischengepeichert, bis das Programm 
sich regulär beendet oder bis der Puffer voll ist.

von Andreas D. (rackandboneman)


Lesenswert?

-F '='

genauso mit dem Leerzeichen.

von Tom (Gast)


Lesenswert?

Rolf Magnus schrieb:
> --line-buffered

Danke. Glücklicherweise konnte ich den Exorzistentermin noch stornieren 
und investiere jetzt die gesparte Dämonenaustreibungsgebühr in eine 
Narrenkappe, weil ich die manpage von grep nicht gründlich genug gelesen 
habe.

von Pascal H. (pase-h)


Angehängte Dateien:

Lesenswert?

Hallo,
mit:
Andy D. schrieb:
> -F '='
funktionierts auch leider nicht.
ich rufe den VLC-Player mittlerweile so auf:
1
cvlc --aout alsa --alsa-audio-device=hw:1,0 http://mp3channels.webradio.antenne.de:80/rockantenne -vvv 2>&1 | awk -F '=' '/Title/ {print $2}' > /Radio/Final/TempLog
Es wird jedoch immer nur der aktuell gespielte Titel angezeigt, und kein 
weiterer Titel.
Ein fflush() hilft leider auch nichts ->
1
... awk -F '=' '/Title/ {print $2; fflush()}' > /Radio/Final/TempLog
Ich habe auch schon folgendes getestet:
1
... 2>&1 | stdbuf -oL awk -F '=' ...
2
... 2>&1 | unbuffer awk -F '=' ...
mit grep & cut komme ich leider auch nicht weiter, da das
> --line-buffered
auch keinen unterschied macht.
Nur grep ->
1
[0x9e370] access_http access debug: New Title=ROCK ANTENNE - Rock Nonstop
Sobald ich jedoch den output von grep (egal ob mit --line-buffered oder 
unbuffer oder stdbuf -oL) weiter pipe, dann geht nichts mehr...

Letztendlich müsste der VLC-Player so funktionieren:
1
[vlc] | awk oder (grep&cut) > Datei
Also ich möchte den output vom VLC-Player filtern und in eine Datei 
umleiten. Jedoch scheitert es ja bereits beim filtern.

Im Anhang ist auch noch der ungefilterte Output vom VLC-Player wenn ich 
ihn starte und wieder schließe, nachdem der Song angefangen hat zu 
spielen.

Kennt vielleicht jemand von euch noch eine passende alternative zum VLC 
player und mplayer, um http streams in der Linux Console wiederzugeben?

Mit freundlichen grüßen
Pascal

von Norbert (Gast)


Lesenswert?

man awk:


awk -W interactive

von Tom (Gast)


Lesenswert?

vlc --intf dummy --aout alsa --alsa-audio-device=hw:1,0 -vvv 
http://mp3channels.webradio.antenne.de:80/rockantenne  2>&1  | grep 
--line-buffered 'New Title' | sed -e 's/.*New Title=//'

von Pascal H. (pase-h)


Lesenswert?

Danke für eure Hilfe!

Norbert schrieb:
> awk -W interactive

Hat letztendlich funktioniert!

Vielen dank nochmal!

Mfg
Pascal

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.