정규식을 사용하여 마우스 MAC 주소 얻기

정규식을 사용하여 마우스 MAC 주소 얻기

다음 출력에서 ​​마우스의 MAC 주소를 얻는 가장 편리한 방법은 무엇입니까?

~ ➜ 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)

이보다 더 짧은 것이 있나요?

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

다음과 같은 구문을 찾고 있습니다.

bt-device --list | grep Mouse | xyztool '(' ')'

답변1

awk를 사용하여 행을 일치시키고 (또는로 구분된 단어 로 분할합니다 ). 두 번째 단어를 선택하거나 $2장치 이름에 괄호가 있을 수 있는 경우 마지막에서 두 번째 단어를 선택하는 것이 좋습니다.$(NF-1)

awk -F '[()]' '/Mouse/{print $(NF-1)}'

답변2

grepPCRE()와 함께 사용 -P:

bt-device --list | grep -Po 'Mouse\s.*?\(\K[^)]+'
  • Mouse\s.*?\(해당 줄에서 일치 Mouse하고 첫 번째 줄까지 일치하는 항목이 삭제됩니다 (.\K

  • [^)]+필요한 부분, 즉 다음 문자를 제공합니다.)

예:

$ 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

답변3

몇 가지 옵션이 더 있습니다:

  1. 진주

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

    정규식을 사용하는 많은 도구에서는 ()나중에 사용할 수 있는 방식으로 일치하는 패턴을 캡처하기 위해 괄호( )를 사용합니다. Perl에서 캡처된 첫 번째 패턴은 이고 $1, 두 번째 패턴은 $2다음과 같습니다. 여기서는 일치하는 줄 Mouse과 괄호 안의 문자열을 찾습니다 . $1일치에 성공하면 괄호 안의 내용이 저장되고 인쇄됩니다.

  2. grep + 잘라내기 + tr

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

    여기서는 grep관련 행을 찾고 cut두 번째 (정의된 필드( 34:88:5D:3F:1B:88))를 인쇄하고 tr후행 을 제거하는 데 사용합니다 ).

  3. 재미삼아 해결책은 다음과 같습니다 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
    

관련 정보