Usando o regex para obter o endereço MAC do mouse

4

Qual seria a maneira mais prática de pegar o endereço MAC do mouse na seguinte saída:

~ ➜ bt-device --list
Added devices:
Logitech K811 (00:1F:20:EB:06:E0)
Plattan ADV Wireless (5C:EB:68:1F:D1:62)
Bluetooth Mouse M336/M337/M535 (34:88:5D:3F:1B:88)

Existe algo mais curto que isso:

bt-device --list | grep Mouse | sed -e 's/^.*(\(.*\))$//'
34:88:5D:3F:1B:88

Estou procurando uma sintaxe como:

bt-device --list | grep Mouse | xyztool '(' ')'
    
por Anton Harald 16.05.2016 / 07:54

3 respostas

7

Use o awk para corresponder à linha e dividir em palavras separadas por ( ou ) . Pegue a segunda palavra $2 ou, de preferência, a penúltima $(NF-1) se você tiver parênteses no nome do dispositivo:

awk -F '[()]' '/Mouse/{print $(NF-1)}'
    
por 16.05.2016 / 08:04
2

Usando grep com PCRE ( -P ):

bt-device --list | grep -Po 'Mouse\s.*?\(\K[^)]+'
  • Mouse\s.*?\( corresponderá a Mouse na linha e, em seguida, até o primeiro ( , \K descartará a correspondência

  • [^)]+ nos dará a parte desejada, ou seja, caracteres até o próximo )

Exemplo:

$ cat file.txt
Added devices:
Logitech K811 (00:1F:20:EB:06:E0)
Plattan ADV Wireless (5C:EB:68:1F:D1:62)
Bluetooth Mouse M336/M337/M535 (34:88:5D:3F:1B:88)

$ grep -Po 'Mouse\s.*?\(\K[^)]+' file.txt
34:88:5D:3F:1B:88
    
por 16.05.2016 / 08:01
0

Mais algumas opções:

  1. Perl

    $ bt-device --list | perl -lne 'print $1 if /Mouse.*\((.*)\)/' file 
    34:88:5D:3F:1B:88
    

    Em muitas ferramentas que lidam com expressões regulares, parênteses ( () ) são usados para capturar o padrão correspondente de uma maneira que possa ser usada posteriormente. Em Perl, o primeiro padrão capturado é $1 , o segundo $2 etc. Aqui, estamos procurando uma linha que corresponda a Mouse e, em seguida, uma string entre parênteses. O conteúdo dos parênteses é salvo como $1 e é impresso se a correspondência for bem-sucedida.

  2. grep + cut + tr

    $ bt-device --list grep Mouse | cut -d'(' -f2 | tr -d ')'
    34:88:5D:3F:1B:88
    

    Aqui, usamos grep para encontrar a (s) linha (s) relevante (s), cut para imprimir o segundo campo ( definido ( 34:88:5D:3F:1B:88) ) e tr para excluir o ) à direita.

  3. Apenas por diversão, aqui está uma solução com join :

    $ join -1 1 -2 2 -o 2.4 <(echo "Mouse (") <(bt-device --list) 2>/dev/null | tr -d '()'
    34:88:5D:3F:1B:88
    
por 16.05.2016 / 13:09