Отфильтруйте терминальную команду к текстовому файлу

Проблема: Я имею 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

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

4
задан 24 April 2014 в 15:47

2 ответа

Просто используйте эту команду:

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.
0
ответ дан 24 April 2014 в 15:47

Я утверждал бы, что проблема немного более трудна, чем быть рекламируемым. Просто парсинг 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 уже должен был обработать простофиль.

3
ответ дан 24 April 2014 в 15:47

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

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