Filtra o comando do terminal para o arquivo de texto

4

Problema: tenho o comando dmesg | grep ttyUSB com a seguinte saída:

[    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

precisa redirecionar essa saída para um arquivo de texto, estou usando o seguinte comando para isso:

dmesg | grep ttyUSB > test.txt

Tudo funciona bem, mas só preciso listar as portas disponíveis. Desejo que a saída do arquivo de texto seja assim:

ttyUSB0 
ttyUSB1 
ttyUSB2 
ttyUSB3

Como posso fazer isso?

    
por Renato Tavares 24.04.2014 / 11:11

2 respostas

7

Use este comando:

dmesg | egrep -o "ttyUSB[0-9]+" | sort -u > test.txt

Ele corresponderá e retornará os padrões ttyUSB.

De 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.
    
por Sylvain Pineau 24.04.2014 / 11:18
3

Eu diria que o problema é um pouco mais difícil do que ser anunciado. Apenas analisar dmesg para instâncias de ttyUSB* não permitirá que você saiba se está disponível no momento. Pode ter acabado de ser desconectado.

A seguir, isso é feito observando o status atual . Ele faz isso procurando to ... e from ... instâncias e usa apenas aquelas em que era to ttyUSB* no final da linha.

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

Para explicar rapidamente:

  • tac inverte a entrada, então estamos lidando com a primeira mais recente
  • $NF ~ /ttyUSB[0-9]+/ é uma regex que verifica se o último campo é um ttyUSB*
  • !a[$NF]++ verifica se não vimos este campo antes
  • $(NF-1) == "to" filtra no penúltimo campo para garantir que estamos lidando com to ... linhas.

Para testar isso, simplesmente peguei sua saída e removi o segundo anexo. No meu exemplo ttyUSB2 foi conectado, desconectado e nunca reconectado. Não deveria estar disponível.

$ 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

E, claro, você pode passar por sort , se quiser. Você não deveria precisar de uniq (ou sort -u ), já que o awk já deveria ter manipulado dupes.

    
por Oli 24.04.2014 / 11:38