Ausgabe umleiten - aber immer nur eine Zeile

frannek

Registered User
Hallo Zusammen,

ich hab da eine kleine Frage. Damit ich für eine Webseite einen Peakmeter des line-In am Server realisieren kann dachte ich, dass ich das Peakmeter vom arecord nutzen könnte und die Ausgabe parse. Soweit ist das ja kein Problem (glaub ich). Nun meine Frage:
Kann ich die Ausgabe, die ich mittels > in eine txt schreibe auf eine Zeile begrenzen? Sprich mit jedem neuen Peak (wo er normal eine neue Zeile anhängen würde) immer die erste Zeile überschreiben?

Würde mich über einen kurzen Tipp freuen.

Gruß

Frannek
 
Das geht nicht. Es wird immer alles umgeleitet und landet dann auch so in der Datei. Du hast zwei Alternativen:

1. Du lebst damit, dass die neue Zeile immer angehangen wird und liest für die Anzeige auf deiner Webseite einfach immer nur die letzte Zeile der Datei aus und ignorierst alles davor.

2. Du pipest den Output durch ein kleines Script, das diesen Zeilenweise verarbeitet und dabei dann eben immer die Datei neu schreibt.

Die zweite Möglichkeit hab ich eben mal als Anlass genommen meine Perl-Skills abzustauben: ;)
Code:
#!/usr/bin/perl -w

use strict;
my $file = $ARGV[0] || die('Need file as parameter.');

while (my $line = <STDIN>) {
  my $fh;
  open($fh, ">$file");
  print $fh $line;
  close($fh);
}
 
Oh je.. vielen Dank erstmal für diesen Hinweis... es könnte ja alles ganz einfach sein... Jetzt kommt Perl ins spiel... Okaaay... erstmal versuche ich es zu verstehen:

Meine erste Idee war die Ausgabe umzuleiten:

arecord -vv -D plughw:0,0 /dev/null > pegel.txt

Dies funktioniert bekanntlicher Weise nicht, bzw nicht zufriedenstellend.
Demnach würde ich jetzt einfach
Code:
arecord -vv -D plughw:0,0 /dev/null | deinscript.pl
nutzen?
 
Da fehlt noch, wohin die Ausgabe geschrieben werden soll.
Code:
arecord -vv -D plughw:0,0 /dev/null | deinscript.pl [COLOR="Red"]ausgabedatei.txt[/COLOR]
In ausgabedatei.txt steht dann immer nur die letzte Zeile.
 
Okay, verstanden. Leider wird nichts ausgeschrieben :-(

Also setzt $ARGV[0] den 1. Anhang und $ARGV[1] würde einen evtl vorhandenen zweiten Dateinamen definieren? Habe ich das soweit richtig verstanden? (hat jetzt weniger mit der Sache als mit Interesse zu tun)
 
Last edited by a moderator:
Also setzt $ARGV[0] den 1. Anhang und $ARGV[1] würde einen evtl vorhandenen zweiten Dateinamen definieren?
Ja. @ARGV ist ein Array mit den Commandline Parameters.

Wenn es nicht geht, bekommst du irgendeine Fehlermeldung? Stimmen die Rechte auf dem Script? Evtl. im selben Verzeichnis und ./ vergessen (nicht vergessen: current dir ist nicht im Suchpfad enthalten).
 
Code:
sudo arecord -D plughw:1,0 -V stereo -c 2 -f cd /dev/null | ./test.pl ./test.txt

Super, diese Info kann mir durchaus mal weiter helfen. Ich muss endlich mal anfangen, Bücher zu lesen ;-)

Leider kommt keine Fehlermeldung. Dort, wo ohne der Pipe das Peakmeter sein würde, kommt nun nichts. Wird als dem Script übergeben. Die Rechte sind ebenfalls gesetzt. Ich habe die test.txt vorsichtshalber mal vorher erzeugt.. leider Nichts.

Ich habs jetzt mal mit ls ausprobiert. Dort wird das letzte ausgegeben und auch in txt gespeichert. Scheinbar wird es bei dem Peakmeter nicht so einfach gehen.. was mich jedoch wundert denn bei > test.txt wird ja auch jede Wertänderung geschrieben und demnach übergeben.

+############################ 84%|86%##############################+

Das wäre die ausgabe des VU Meters
 
Last edited by a moderator:
Ich bin mir grad nicht sicher, ob ich euch da richtig verstehe. Aber ich meine ihr machts euch ziemlich kompliziert mit dem Perl Script.
Wenn man es in Datei und in der Shell braucht, gibts solch netten Tools wie "tee". Beim Umlenken der Ausgabe sollte man vielleicht auch noch zwischen ">>" (anhängen) und ">" (Datei neuschreiben) unterscheiden.
 
Ich hatte den TE so verstanden, dass das Programm, von dessen Output er immer die letzte Zeile haben will, nicht terminiert sondern kontinuierlich läuft.
 
Das Tools gibt die gewünschte Zeile nicht nur einmal aus, sondern mehrfach. Allerdings sieht man es auf der Shell mit blosem Auge nicht, weil via Steuerzeichen zurück an Zeilenanfang springt und diese "überschreibt". Leitet man den Kram um, hat man aber alle Zeilen drin stehen. Man sieht sie nur nicht.
Deswegen packe ich da noch ein "strings" dazwischen.

Code:
# arecord -D null -V stereo -c 2 -f cd /dev/null 2>/dev/null | strings | tail -n1 > arecord.output
# arecord -D null -V stereo -c 2 -f cd /dev/null 2>/dev/null | strings | tail -n1 > arecord.output
# arecord -D null -V stereo -c 2 -f cd /dev/null 2>/dev/null | strings | tail -n1 > arecord.output
# cat arecord.output
                                  +00%|00%+
# arecord -D null -V stereo -c 2 -f cd /dev/null 2>/dev/null | strings | tail -n1 >> arecord.output
# arecord -D null -V stereo -c 2 -f cd /dev/null 2>/dev/null | strings | tail -n1 >> arecord.output
# arecord -D null -V stereo -c 2 -f cd /dev/null 2>/dev/null | strings | tail -n1 >> arecord.output
# cat arecord.output
                                  +00%|00%+
                                  +00%|00%+
                                  +00%|00%+
                                  +00%|00%+
 
Das klingt sehr gut... jetzt hab ich nur noch ein "permission denied"

-bash: /dev/null: Permission denied

Okay, ich hab 2>/dev/null heraus genommen. Dann geht es. Muss das ganze halt nur noch im loop laufen lassen, damit es eben auch updatet.. aber genau das wäre es, was ich haben möchte, jap :-)

Nachtrag:


Mist, hab gerade gesehen, dass ich als hw noch null hatte... jetzt wo ich das korrigiert habe, passiert garnichts..
sudo arecord -D plughw:1,0 -V stereo -c 2 -f cd /dev/null | strings | tail -n1 > arecord.output
 
Last edited by a moderator:
-bash: /dev/null: Permission denied

Okay, ich hab 2>/dev/null heraus genommen. Dann geht es.

Ganz dumme Idee. Dein ursprünglicher Einzeiler enthält einen Fehler, der dir als root ausgeführt das /dev/null Device kaputt macht und du nimmst die (bewusst gesetzte Ausgabeumleitung) einfach raus, um dich dann zu wundern das nichts mehr geht?

Dein arecord Befehl hat /dev/null durch eine reguläre Datei mit den Rechten "600" ersetzt. Deswegen funktioniert da nichts mehr.
Ich hab den Fehler leider übernommen und in meiner (extra dafür aufgesetzten) Test-VE zu spät bemerkt.

Ich hab von arecord nicht sonderlich viel Ahnung und bin nun auch nicht sonderlich motiviert, mich da einzuarbeiten. Hab nicht mal ein Linux mit Soundcard zur Hand (daher mit "null" getestet).
Da wirst du dir wohl was anderes überlegen müssen. ;)
 
Hi,

wie sieht denn so ein Output von arecord denn genau aus?

So aus dem Kopf heraus hätte ich gesagt dass ein
Code:
 | sed 's/\r/\n/' | while read line; do echo "$line" > $filename; done
reichen sollte.
 
Back
Top