Очистка вывода xev

Очистка вывода xev

ОС: Openbox сессия Lubuntu 14.04

Допустим, я запускаю программу xevи нажимаю Superклавишу. Я получаю большой объем выходных данных (>100 строк), а соответствующая информация находится далеко внизу выходных данных, как видно, когда я

  • бегатьxev | grep -in super
  • нажиматьsuper
  • а затем закройте xevвсплывающее окно.
$ xev | grep -in super  
122:    state 0x0, keycode 133 (keysym 0xffeb, Super_L), same_screen YES,
129:    state 0x40, keycode 133 (keysym 0xffeb, Super_L), same_screen YES,
$ 

Я наткнулся на однострочный текст в вики Arch (wiki.archlinux.org/index.php/Extra_Keyboard_Keys#In_Xorg), который значительно очищает вывод (за некоторыми исключениями, указанными в ссылке):

xev | awk -F'[ )]+' '/^KeyPress/ { a[NR+2] } NR in a { printf "%-3s %s\n", $5, $8 }'

Вывод сокращается до всего лишь:

133 Super_L

Я хочу узнать, как код Arch wiki творит свою магию. Все, что я могу предположить, это то, что он каким-то образом анализирует вывод, начиная с KeyPressно после этого я ничего не понимаю:

KeyPress event, serial 48, synthetic NO, window 0x2800001,
root 0x7e, subw 0x0, time 13500391, (362,697), root:(363,760),
    state 0x0, keycode 133 (keysym 0xffeb, Super_L), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 

Может ли кто-нибудь любезно объяснить, что делает этот код?

решение1

awk -F'[ )]+' '/^KeyPress/ { a[NR+2] } NR in a { printf "%-3s %s\n", $5, $8 }'
  • -F'[ )]+'говорит awkо необходимости разбить строку на любое количество пробелов или скобок. Таким образом, поля в state 0x0, keycode 133 (keysym 0xffeb, Super_L), same_screen YES,будут:

              # empty field
    state
    0x0,
    keycode
    133
    (keysym 
    0xffeb,
    Super_L
    ,
    same_screen
    YES,
    
  • /^KeyPress/ { a[NR+2] }создает пустую запись в строке номер + 2 в массиве aдля строк, начинающихся с KeyPress.
  • NR in aпроверяет, есть ли запись в массиве для текущего номера строки a. Это было бы верно, если бы строка, начинающаяся с , KeyPressбыла на две строки раньше.
  • Затем он печатает пятое и восьмое поля, которые являются 133и , Super_Lкак видно из первого пункта.

xevвывод на самом деле выглядит так:

$ xev
...
KeyPress event, serial 36, synthetic NO, window 0x2a00001,
    root 0x29c, subw 0x0, time 217441518, (91,162), root:(91,697),
    state 0x10, keycode 134 (keysym 0xffec, Super_R), same_screen YES,

Таким образом, для каждого нажатия клавиши вторая строка содержит код клавиши и ее название.

Связанный контент