Проблема: Я имею dmesg | grep ttyUSB
команда, которая имеет следующий вывод:
[ 7.648896] usb 1-2: GSM modem (1-port) converter now attached to ttyUSB0
[ 7.649091] usb 1-2: GSM modem (1-port) converter now attached to ttyUSB1
[ 7.649502] usb 1-2: GSM modem (1-port) converter now attached to ttyUSB2
[17406.327030] option1 ttyUSB0: GSM modem (1-port) converter now disconnected from ttyUSB0
[17406.329670] option1 ttyUSB1: GSM modem (1-port) converter now disconnected from ttyUSB1
[17406.334036] option1 ttyUSB2: GSM modem (1-port) converter now disconnected from ttyUSB2
[90128.405694] usb 1-4: GSM modem (1-port) converter now attached to ttyUSB0
[90128.405987] usb 1-4: GSM modem (1-port) converter now attached to ttyUSB1
[90128.406295] usb 1-4: GSM modem (1-port) converter now attached to ttyUSB2
[90132.905458] usb 1-2: GSM modem (1-port) converter now attached to ttyUSB3
[90132.905791] usb 1-2: GSM modem (1-port) converter now attached to ttyUSB4
[90132.906541] usb 1-2: GSM modem (1-port) converter now attached to ttyUSB5
[90148.661532] usb 1-1: GSM modem (1-port) converter now attached to ttyUSB6
[90148.661828] usb 1-1: GSM modem (1-port) converter now attached to ttyUSB7
[90148.662440] usb 1-1: GSM modem (1-port) converter now attached to ttyUSB8
должен перенаправить этот вывод к текстовому файлу, я использую следующую команду для этого:
dmesg | grep ttyUSB > test.txt
Все хорошо работает, но я должен только перечислить доступные порты. Я хочу, чтобы вывод текстового файла был похож на это:
ttyUSB0
ttyUSB1
ttyUSB2
ttyUSB3
Как я могу сделать это?
Просто используйте эту команду:
dmesg | egrep -o "ttyUSB[0-9]+" | sort -u > test.txt
Это будет соответствовать и возвращать ttyUSB шаблоны.
От man grep
:
-o, --only-matching
Print only the matched (non-empty) parts of a matching line,
with each such part on a separate output line.
Я утверждал бы, что проблема немного более трудна, чем быть рекламируемым. Просто парсинг dmesg
для экземпляров ttyUSB*
не сообщит, в настоящее время ли это доступно. Это, возможно, было просто разъединено.
Следующее разрабатывает это путем рассмотрения текущего статуса. Это делает это путем поиска to ...
и from ...
экземпляры и только используют тех, где это был a to ttyUSB*
в конце строки.
dmesg | tac | awk '$NF~/ttyUSB[0-9]+/ && !a[$NF]++ && $(NF-1)=="to" {print $NF}'
Быстро объяснить:
tac
инвертирует вход, таким образом, мы имеем дело с новым сначала$NF ~ /ttyUSB[0-9]+/
regex, который проверяет, что последнее поле является a ttyUSB*
!a[$NF]++
проверки, что мы не видели это поле прежде$(NF-1) == "to"
фильтры на предпоследнем поле для проверки мы имеем дело с to ...
строки.Для тестирования этого, я просто взял вывод и удалил второе присоединение. В моем примере ttyUSB2 был соединен, затем разъединен и никогда не подключался повторно. Это не должно быть доступно.
$ cat testdmesg
[ 7.648896] usb 1-2: GSM modem (1-port) converter now attached to ttyUSB0
[ 7.649091] usb 1-2: GSM modem (1-port) converter now attached to ttyUSB1
[ 7.649502] usb 1-2: GSM modem (1-port) converter now attached to ttyUSB2
[17406.327030] option1 ttyUSB0: GSM modem (1-port) converter now disconnected from ttyUSB0
[17406.329670] option1 ttyUSB1: GSM modem (1-port) converter now disconnected from ttyUSB1
[17406.334036] option1 ttyUSB2: GSM modem (1-port) converter now disconnected from ttyUSB2
[90128.405694] usb 1-4: GSM modem (1-port) converter now attached to ttyUSB0
[90128.405987] usb 1-4: GSM modem (1-port) converter now attached to ttyUSB1
[90132.905458] usb 1-2: GSM modem (1-port) converter now attached to ttyUSB3
[90132.905791] usb 1-2: GSM modem (1-port) converter now attached to ttyUSB4
[90132.906541] usb 1-2: GSM modem (1-port) converter now attached to ttyUSB5
[90148.661532] usb 1-1: GSM modem (1-port) converter now attached to ttyUSB6
[90148.661828] usb 1-1: GSM modem (1-port) converter now attached to ttyUSB7
[90148.662440] usb 1-1: GSM modem (1-port) converter now attached to ttyUSB8
$ tac testdmesg | awk '$NF~/ttyUSB[0-9]+/ && !a[$NF]++ && $(NF-1)=="to" {print $NF}'
ttyUSB8
ttyUSB7
ttyUSB6
ttyUSB5
ttyUSB4
ttyUSB3
ttyUSB1
ttyUSB0
И конечно можно передать это через sort
если Вы хотите. Вы не должны должны быть uniq
(или sort -u
) это, хотя, поскольку awk уже должен был обработать простофиль.