Команда терминала фильтра в текстовый файл

Проблема: у меня есть команда 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

Как я могу это сделать?

1
задан 24 April 2014 в 16:47

1 ответ

Я бы сказал, что проблема немного сложнее, чем рекламироваться. Просто синтаксический анализ dmesg для экземпляров ttyUSB* не даст вам знать, доступен ли он в настоящее время. Возможно, он был отключен.

Ниже приведено описание текущего состояния. Он делает это, ища экземпляры to ... и from ... и использует только те, где он был to ttyUSB* в конце строки.

dmesg | tac | awk '$NF~/ttyUSB[0-9]+/ && !a[$NF]++ && $(NF-1)=="to" {print $NF}'

Чтобы быстро объяснить: [!d3 ] tac меняет вход так, что мы имеем дело с последним первым $NF ~ /ttyUSB[0-9]+/ - это регулярное выражение, которое проверяет последнее поле: ttyUSB* !a[$NF]++ проверяет, что мы не видели это поле до [ f12] на предпоследнем поле, чтобы убедиться, что мы имеем дело с линиями 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, должны были обработать обманы уже.

3
ответ дан 24 May 2018 в 08:53
  • 1
    Я впечатлен этим, фактически создал решение на Python, чтобы проверить, подключены ли порты или нет. Спасибо вам за ответы. – Renato Tavares 24 April 2014 в 19:30
  • 2
    @RenatoTavares, если это ваша цель, я рекомендую вам использовать udev-вызовы, подобные этому stackoverflow.com/a/12939648/792066 – Braiam 24 April 2014 в 20:49

Другие вопросы по тегам:

Похожие вопросы: