Zeilen mit Bash zusammenfügen

Bei Linux am Dienstag hatten wir diesmal zwar keine größeren Vorträge zu Linuxprogrammen, aber dennoch etwas neues für die meisten Shellfanatiker: paste .

Zeilen mit Bash zusammenfügen

Nehmen wir mal diese Daten einer beliebigen Datei oder Shellausgabe:

Username:		User1
	0.00 MB
Username:		User#2
	0.07 MB
Username:		User3
	4630.98 MB
Username:		User#4
	209.16 MB
Username:		User5
	583.70 MB
Username:		User#6
	896.46 MB
Username:		User7
	809.58 MB
Username:		User#8
	902.74 MB
Username:		User9
	136.84 MB
Username:		User#10
	9156.09 MB
Username:		User11
	372.55 MB
Username:		User#12
	77.75 MB

Wir haben also in den ungerade Zeilen 1,3,5… usw. den Text „Username:<TAB>UserX<LF>“ stehen und in den geraden Zeilen „<TAB>2134 MB<LF>“. Diese Zeilen sollen zusammengefügt werden, daß Username und Anzahl der MB in einer Zeile mit 2(3) Spalten steht:

Username:		User1		0.00 MB
Username:		User#2		0.07 MB
Username:		User3		4630.98 MB
Username:		User#4		209.16 MB
Username:		User5		583.70 MB
Username:		User#6		896.46 MB
Username:		User7		809.58 MB
Username:		User#8		902.74 MB
Username:		User9		136.84 MB
Username:		User#10		9156.09 MB
Username:		User11		372.55 MB
Username:		User#12		77.75 MB

Wie bekommt man das hin?

Da geb es erst einmal einen kleinen Dämpfer, als wir versuchten die <LF> mit sed zu ersetzen, was nicht funktionierte und selbst wenn es funktioniert hätte, nicht die Lösung gewesen wäre, weil dann alles in einer Zeile gestanden hätte: sed -e „s/\n//g“ können wir also vom Plan streichen 🙂

Eine kreative Lösung kam dann von Matthias:

$ cat daten.txt | xargs echo | sed -e "s/MB /MB\n/g" | sed -e "s/ /\t/g"
Username:	User1	0.00	MB
Username:	User#2	0.07	MB
Username:	User3	4630.98	MB
Username:	User#4	209.16	MB
Username:	User5	583.70	MB
Username:	User#6	896.46	MB
Username:	User7	809.58	MB
Username:	User#8	902.74	MB
Username:	User9	136.84	MB
Username:	User#10	9156.09	MB
Username:	User11	372.55	MB
Username:	User#12	77.75	MB

Weil es einfacher war damit umzugehen, standen die Ausgangsdaten in einer Textdatei „daten.txt“.

„xargs echo“  gibt jede Zeile der Datei mit echo einzeln aus. Darauf hin wird sed so ausgeführt, daß der resultierende Textblock „…MB “ zu „…MB<LF>“ wird und alle Leerzeichen zu Tabulatoren <TAB>.

Das ist schon einmal eine Möglichkeit, aber es geht einfacher:

$ cat daten.txt | paste - -
Username:		User1		0.00 MB
Username:		User#2		0.07 MB
Username:		User3		4630.98 MB
Username:		User#4		209.16 MB
Username:		User5		583.70 MB
Username:		User#6		896.46 MB
Username:		User7		809.58 MB
Username:		User#8		902.74 MB
Username:		User9		136.84 MB
Username:		User#10		9156.09 MB
Username:		User11		372.55 MB
Username:		User#12		77.75 MB

Es gab keine Vorgabe, daß alle Leerzeichen verschwinden sollten. Wäre das eine Vorgabe gewesen, hätte man am Ende noch das | sed -e „s/ /\t/g“ dranhängen müssen.

$ cat daten.txt | paste - - |  sed -e "s/ /\t/g"
Username:		User1		0.00	MB
Username:		User#2		0.07	MB
Username:		User3		4630.98	MB
Username:		User#4		209.16	MB
Username:		User5		583.70	MB
Username:		User#6		896.46	MB
Username:		User7		809.58	MB
Username:		User#8		902.74	MB
Username:		User9		136.84	MB
Username:		User#10		9156.09	MB
Username:		User11		372.55	MB
Username:		User#12		77.75	MB

oder etwas schlanker:

$ cat daten.txt | paste - - |  sed -e "s/\t\t/ /g" -e "s/ /\t/g"
Username:	User1	0.00	MB
Username:	User#2	0.07	MB
Username:	User3	4630.98	MB
Username:	User#4	209.16	MB
Username:	User5	583.70	MB
Username:	User#6	896.46	MB
Username:	User7	809.58	MB
Username:	User#8	902.74	MB
Username:	User9	136.84	MB
Username:	User#10	9156.09	MB
Username:	User11	372.55	MB
Username:	User#12	77.75	MB

Merke: paste aus den CoreUtilities kann zwei oder mehr Zeilen einer Ausgabe zusammenfügen.

Linux am Dienstag: Programm für den 15.3.2022

Eine Woche ist rum, ich hoffe alle haben min. eine Partie „Remnands of the Precursor“ aka Remake von „Masters of Orion“ durch 🙂

Linux am Dienstag: Programm für den 15.3.2022

Diese Woche haben wir u.a. zwei Root Exploits für den Linuxkernel in Programm:

  • Kernel – Schwachstelle in LTS Kernel 5.4 entdeckt
  • Kernel – DirtyPipe bedroht Kernel 5.8 bis 5.16
  • Sicherheit – Samsungs Netzwerk geknackt – Sourcecode im Umlauf
  • Technik – CPU arbeitet intern mit Licht statt Elektronen
  • Telekom VOIP – Fritz!Box braucht spezielles Update zum Telefonieren

Wie jede Woche per Videokonferenz auf https://meet.cloud-foo.de/Linux .

Kleine Anmerkung: Die bisherigen Vorträge findet man jetzt unter https://linux-am-dienstag.de/archiv/ .

FFMPEG: 2D zu 3D in Echtzeit

Teil 2 der Linux am Dienstag Mini-Serie zum Thema „2D in 3D umwandeln“ befasst sich mit FFMPEG und den verschiedenen Möglichkeiten, die sich daraus ergeben, und da gibt es einiges 😀

FFMPEG: 2D zu 3D in Echtzeit

Wer den ersten Beitrag noch nicht gelesen hat, sollte sich den vorher durchlesen, da diverse Rahmenbedingungen wie Framerate und Algorithmus auch für FFMPEG gelten, die ich aber nicht nochmal erklären werde 😉

Bino: der 3D Videoplayer

Die grundlegende Filtertechnik

Wer mit FFMPEG arbeitet weiß um die Myriaden von Dateiargumenten in der der Konsole, daher mache ich es Euch einfach: -vf stereo3d=al:arcc 

Das ist der Stereo3D-Filter den wir allen FFMPEG Tools mitgeben können, damit wir rot-cyanblaue 3D Bilder bekommen. Das Format stereo3d=in:out könnt Ihr auch ändern, je nachdem was Ihr so machen wollt. Es gibt im Netz diverse Webseiten, die da helfen können:

https://trac.ffmpeg.org/wiki/Stereoscopic
http://underpop.online.fr/f/ffmpeg/help/stereo3d.htm.gz

Der erste Link sollte eigentlich reichen um das Prinzip zu erklären. Da wir die Angaben in allen FFMPEG-Werkzeugen benutzen können, muß man den Teil also nur einmal austüfteln.

Wenn man sich einen Film in 3D ansehen möchte, kann man dafür FFPLAY benutzen:

ffplay -vf stereo3d=al:arcc film.mp4

Da hier die soweit alles auf Anhieb funktioniert, eignet es sich hervorragend für einen NEMO/Nautilus Actionmenüeintrag, also zum Abspielen auf Klick im Dateimanager 😉

Im Bild: Nemo

Um so einen Menüeintrag zu bekommen, braucht Ihr zwei Dateien:

/home/<username>.local/share/nemo/actions/play3d.nemo_action

[Nemo Action]
Name=Play 3D Video
Comment=Spiele Videos in 3D ab.

Exec=<play3d.sh %F>

Icon-Name=soundconverter

Selection=Any
Separator=;

Extensions=m4a;mp4;avi;webm;ogg;ogv;oga;wav;mkv

und /home/<username>.local/share/nemo/actions/play3d.sh

#!/bin/bash

IN=$*

IFS=";" read -ra FILES <<< "$IN"
for i in "${FILES[@]}"; do
    ffplay -vf stereo3d=al:arcc "$i" > /dev/null
done

Aber das ist natürlich nur der Anfang 😉 Kommen wir zur Abteilung „zu kalt für den Gefrierschrank“:

Zum Coolsein gehört v4l2loopback

Wer das auf seinem Rechner noch nicht drauf hat, sollte sich das v4l2loopback-Device nachinstallieren und dann kurz rebooten, damit der Kernel das korrekt verarbeiten kann. Für Fedora geht das so: dnf -y install v4l2loopback;reboot .

Wenn der PC wieder da ist, laden wir das Modul als normaler Benutzer: modprobe v4l2loopback

Ggf. dürft Ihr das auf Eurer Installation nicht, dann benutzt sudo dafür. Der Teil der jetzt kommt ist stark individuell von Eurer WebCam abhängig und wie Euer Kernel Lust hatte, mit dem V4L2 Videokram umzugehen.

Wenn meine Versionen der Befehle bei Euch nicht direkt funktionieren, dann gibt es diverse Gründe:

die Kamera kann die Auflösung nicht => eine andere Auflösung benutzen
die Kamera kann das Bildformat ( „pixfmt“ ) nicht => einfach mal „rawvideo“ angeben, das sollten alle können.
ffmpeg kann das Videogerät nicht lesen (/dev/video0: Kein passendes Gerät gefunden) => video1 benutzen

Am besten die Fehlermeldungen sorgsam lesen, ist meistens recht einfach.

… und es werde ein 3D-Bild !

ffmpeg -f video4linux2 -input_format mjpeg -video_size 1920×1080 -r 30 -i /dev/video1 -vf stereo3d=al:arcc -framerate 30 -video_size 1920×1080 -pixel_format yuvj422p -c:v:0 rawvideo -s 1920×1080 -r 30 -f v4l2 /dev/video0

ja, richtig geraten, die WebCam liefert jetzt ein 3D Bild aus, aber nur wenn Ihr Euch auch bewegt 😀 Das Bild kann von Firefox oder Chromium ( nehmt den dafür, FF zickt noch rum ) z.b. im Rahmen einer Videokonferenz oder bei Matrixcalls verwendet werden. Ihr könnt es Euch natürlich auch per WebCam-Tool wie Camorama ansehen und mit lustigen Effekten versehen, es per OBS Streamen, was auch immer Ihr wollt \o/

Ein paar Erklärungen

-f video4linux2 -input_format mjpeg -video_size 1920×1080 -r 30 -i /dev/video1

Einlesen von einer WebCam mit dem Videocodec „mjpeg“ aka MotionJPEG mit 30 FPS und in FULLHD Auflösung. Wenn man hier kein mjpeg nimmt, bekommt man i.d.R. nur Ruckelvideo mit 5 FPS, egal was man anfordert. Falls Eure Cam das nicht kann, was wie aber wohl können wird, nehmt „rawvideo“ als Codec, das geht immer. Hinweis: 5 FPS reichen für 3D nicht!

-vf stereo3d=al:arcc

Den Teil kennt Ihr ja schon von oben.

-framerate 30 -video_size 1920×1080 -pixel_format yuvj422p -c:v:0 rawvideo -s 1920×1080 -r 30 -f v4l2 /dev/video0

Mit 30 FPS (-r) in FullHD(-video_size) als Rawvideo skaliert (-s) auf FullHD als Video4Linux2 (-f) WebCam an /dev/video0 schreiben. Ja, zweimal die Auflösung drin, einfach machen, es gibt unterschiedliche FFMPEG Versionen, so klappts am Ehesten und einer ist eh die Streaminfo für den, der die Kamera benutzen will 😉

Wie, das reicht Euch noch nicht?

Hmm… na gut, es will ja nicht jeder sein Bild in die Konferenz streamen 😀

Die FFMPEG Argumente habe ich oben in 3 Teile aufgeteilt, Teil 2 ist immer gleich, aber die Teile 1 und 3 könnt Ihr austauschen, z.B. mit …

-c:v libx264 -preset fast -pix_fmt yuv420p -s 1920×1080 -strict experimental -acodec aac -ab 128000 -ar 48000 -ac 2 -vbsf h264_mp4toannexb -f mpegts „udp://127.0.0.1:10000?pkt_size=1316“

Ja ja, wieso OBS nutzen zum Streamen, FFMPEG kann das auch solo 😀

Um da einen TON zu bekommen, muß im ersten Teil „-f pulse -i default“ eingefügt werden, nach dem Videoteil, aber vor Teil 2. Das greift das PulseAudio Default Sink ab und kodiert es in die Tonspur ein.

Ganzen Desktop streamen…

ffmpeg -f x11grab -framerate 30 -video_size 1920×1080 -i :1.0 -f v4l2 /dev/video2 <- variabel

Als MP4 Film speichern …

-c:v libx264 -preset superfast -pix_fmt yuv420p -s 1920×1080 -strict experimental -acodec aac -ab 128000 -ar 48000 -ac 2 -f mp4 filmname.mp4

Da geht einiges, aber das coolste ist wohl die 3D Videokonferenz und jetzt Viel Spaß \o/