如何在bash中awk打印子字符串并修剪相同子字符串的尾部和结尾空格

时间:2017-05-04 04:16:32

标签: linux bash shell awk

大家好,我正在尝试解析xinput stdout来找到合适的设备来禁用键盘。所以这是我的代码,但它看起来很草率,我想知道是否有更好的方法。

xinput -list --short | grep -E "keyboard.*slave" | awk 'NR==1{print substr($0,7,41)}' | awk '{$1=$1}1'

我不知道子串需要多长时间,所以我将41作为索引来包含潜在设备名称的最大长度。这导致需要修剪的末端有一个空白区域,所以我将它传递给另一个awk管道。我想知道最后2个awk调用是否可以压缩为1

2 个答案:

答案 0 :(得分:1)

您可以使用sub()代替空白区域,awk也可以do the pattern match代替您:

xinput -list --short | awk '
    /keyboard.*slave/ { 
        s = substr($0, 7, 41);
        sub(/ *$/, "", s);
        print s;
        exit;
   }'

这会在第一个匹配行之后停止,我认为你想要,因为原作只对awk读取的第一个记录起作用。

所以,

$ cat keyb
mouse mouse something
keyboard slave foo
keyboard slave bar
$ awk '/keyboard.*slave/ {  s = substr($0, 7, 41); sub(/ *$/, "", s); print s; exit; }'  < keyb
rd slave foo

答案 1 :(得分:1)

作为禁用键盘的替代方法,您可以直接使用xinput。

xinput的输出如下:

$ xinput list
Virtual core pointer                          id=2    [master pointer  (3)]
   ↳ Virtual core XTEST pointer               id=4    [slave  pointer  (2)]
   ↳ VirtualBox mouse integration             id=9    [slave  pointer  (2)]
   ↳ ImExPS/2 Generic Explorer Mouse          id=11   [slave  pointer  (2)]
Virtual core keyboard                         id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard             id=5    [slave  keyboard (3)]
    ↳ Power Button                            id=6    [slave  keyboard (3)]
    ↳ Sleep Button                            id=7    [slave  keyboard (3)]
    ↳ Video Bus                               id=8    [slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard            id=10   [slave  keyboard (3)]

键盘描述即AT Translated Set 2 keyboard始终相同。不同的是id = 10(系统可以在重新启动时分配不同的id。)

因此,您可以获得键盘的ID,如

$ xinput list --id-only "AT Translated Set 2 keyboard" 
10

然后您可以禁用键盘

$ kid=$(xinput list --id-only "AT Translated Set 2 keyboard")
$ xinput disable "$kid"   #use xinput enable to enable it.

甚至您可以直接使用设备描述xinput disable:

$ xinput disable "AT Translated Set 2 keyboard"

因此,由于设备描述始终相同,因此您无需任何文本处理即可识别和禁用键盘。