1

I am a JavaScript/Java programmer having difficulty with writing a bash script. Below Is the output I am to be dealing with:

karl@karl-laptop:~/.scripts/startup$ xinput list
⎡ Virtual core pointer                      id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ Logitech USB Receiver                     id=10   [slave  pointer  (2)]
⎜   ↳ Logitech USB Receiver                     id=11   [slave  pointer  (2)]
⎜   ↳ PS/2 Logitech Wheel Mouse                 id=15   [slave  pointer  (2)]
⎜   ↳ SteelSeries Sensei Raw Gaming Mouse       id=16   [slave  pointer  (2)]
⎜   ↳ SteelSeries Sensei Raw Gaming Mouse       id=17   [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)]
    ↳ Video Bus                                 id=7    [slave  keyboard (3)]
    ↳ Video Bus                                 id=8    [slave  keyboard (3)]
    ↳ Sleep Button                              id=9    [slave  keyboard (3)]
    ↳ USB2.0 UVC HD Webcam                      id=12   [slave  keyboard (3)]
    ↳ Asus WMI hotkeys                          id=13   [slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard              id=14   [slave  keyboard (3)]
    ↳ SteelSeries Sensei Raw Gaming Mouse       id=18   [slave  keyboard (3)]

I wish to acquire the id's of both the Virtual core pointer SteelSeries Sensei Raw Gaming Mouse. This means I wish to end up with the id's:

16
17

Preferably in their own variables as I will be editing the settings of both in different ways. I currently have the following script but it doesn't do anything:

#!/bin/bash

ids=$(xinput list | awk 'SteelSeries Sensei Raw Gaming Mouse')

echo $ids[0]
echo $ids[1]

unset $ids

I tried to use the following script in this question but it didn't work, it just echo'd all of the id's: How to make a program that finds id's of xinput devices and sets xinput some settings

I did modify it so that it collected all of the id's that matched SteelSeries Sensei Raw Gaming Mouse:

ids=$(xinput --list | awk -v search='SteelSeries Sensei Raw Gaming Mouse' \
    '$0 ~ search {match($0, /id=[0-9]+/);\
                  if (RSTART) \
                    print substr($0, RSTART+3, RLENGTH-3)\
                 }'\
     )

for i in $ids
do
    echo $i
done

echo $ids[0]
echo $ids[1]

Output:

16
17
18 // <-- wrong! should not be there
16 17 18[0] // <-- I only wanted the number '16' here
16 17 18[1] // <-- I only wanted the number '17' here

However it also collected the Virtual core keyboard which I do want (number 18 as you can see)

basickarl
  • 37,187
  • 64
  • 214
  • 335
  • `SteelSeries Sensei Raw Gaming Mouse` is not a valid regex pattern. Construct a correct pattern that matches the strings you want and try your script again. – Etan Reisner Dec 01 '15 at 21:03

1 Answers1

1

Here's a quick solution to extract the two IDs you are interested in:

xinput --list | awk '/SteelSeries Sensei .*pointer/ {print $8}' | sed 's/id=\(.*\)/\1/'
mrucci
  • 4,342
  • 3
  • 33
  • 35