So speichern Sie übereinstimmende Wörter aus der Ausgabe von dmesg in einer Liste

576
user423369

Ich verbinde USB-serielle Geräte über verschiedene Anschlüsse mit meinem Gerät, und serielle USB-Geräte werden manchmal als 'ttyUSB0', manchmal 'ttyUSB1' oder 'ttyUSB2' angezeigt.

Wie schreibe ich ein Skript, um alle ttyUSB-Namen aus diesem Befehl zu extrahieren:

deviceNodes = "$(sudo dmesg tail | egrep -i 'ttyUSB')" echo "$"  for i in "$" do udevadm info -a -n /dev/ttyUSB1 | grep '' | head -n1 done 

und speichern Sie es in einer Variablen und überlaufen Sie die Elemente in der Liste?

Hier ist der Ausgang des Befehls dmesg:

[37606.832517] usb 2-1.1: FTDI USB Serial Device converter now attached to ttyUSB0 [37664.565271] ftdi_sio ttyUSB0: FTDI USB Serial Device converter now disconnected from ttyUSB0 [37695.844687] usb 2-1.1: FTDI USB Serial Device converter now attached to ttyUSB0 [38017.111961] ftdi_sio ttyUSB0: FTDI USB Serial Device converter now disconnected from ttyUSB0 [38490.802048] usb 2-1.1: FTDI USB Serial Device converter now attached to ttyUSB0 [38776.225985] ftdi_sio ttyUSB0: FTDI USB Serial Device converter now disconnected from ttyUSB0 [38778.317840] usb 2-1.1: FTDI USB Serial Device converter now attached to ttyUSB0 [38874.027395] ftdi_sio ttyUSB0: FTDI USB Serial Device converter now disconnected from ttyUSB0 [38876.631579] usb 2-1.1: FTDI USB Serial Device converter now attached to ttyUSB0 [39040.443963] ftdi_sio ttyUSB0: FTDI USB Serial Device converter now disconnected from ttyUSB0 [39796.942837] usb 2-1.2: FTDI USB Serial Device converter now attached to ttyUSB0 [39802.674018] usb 2-1.1: FTDI USB Serial Device converter now attached to ttyUSB1 [40372.029798] ftdi_sio ttyUSB1: FTDI USB Serial Device converter now disconnected from ttyUSB1 [40372.156024] ftdi_sio ttyUSB0: FTDI USB Serial Device converter now disconnected from ttyUSB0 [41642.886671] usb 2-1.1: FTDI USB Serial Device converter now attached to ttyUSB0 
0
Bitte fügen Sie die Ausgabe von `sudo dmesg tail | Egrep -i 'ttyUSB'` zu Ihrer Frage. Cyrus vor 9 Jahren 0

2 Antworten auf die Frage

0
dtbnguyen

Geht es nicht einfach darum, das Folgende zu ändern,

deviceNodes = "$(sudo dmesg tail | egrep -i 'ttyUSB')" 

zu diesem

deviceNodes="$(cat temp | egrep -i 'ttyUSB' | sed 's/^.*tty/tty/' )" 

'i' wird natürlich die Variable sein, die Sie durchlaufen müssen.

Test war der folgende.

echo "[37664.565271] ftdi_sio ttyUSB0: FTDI USB Serial Device converter now disconnected from ttyUSB0" | sed 's/^.*tty/tty/' ttyUSB0 
0
tripleee
> deviceNodes = "$(sudo dmesg tail | egrep -i 'ttyUSB')" 

Das ist ein Syntaxfehler. In einer Variablenzuweisung darf kein Leerzeichen um das Gleichheitszeichen stehen. Siehe auch http://mywiki.wooledge.org/BashPitfalls#foo_.3D_bar

Wenn Sie außerdem nur die tatsächlichen Übereinstimmungen durchlaufen möchten, müssen Sie den Ausdruck so ändern, dass nur diese extrahiert werden. Versuche dies.

dmesg | grep -Eo 'ttyUSB[0-9]+' | sort -u | while read devnode; do udevadm info -a -n /dev/"$devnode" | grep '' | head -n1 done 

(Läuft auf meinem System dmesgohne sudoOrdnung und hat kein tailArgument.)