Извлечь столбец в Bash, даже если количество столбцов, прежде чем он может измениться - PullRequest
0 голосов
/ 30 августа 2018

я пытаюсь сделать этот скрипт для переключения областей на планшетах wacom, я использую xsetwacom для настройки планшетов,

так выглядит скрипт, который я пытаюсь сделать (он работает, но только с первым планшетом)

#!/bin/bash
variable =`xsetwacom --list | awk '/stylus/ {print $7}'`
xsetwacom --set $variable area 123 123 123 123

так выглядит вывод xsetwacom --list

Wacom Intuos S Pad pad                id: 21   type: PAD
Wacom Intuos S Pen stylus             id: 22   type: STYLUS
Wacom Intuos S Pen eraser             id: 23   type: ERASER

и с другим подключенным планшетом

Wacom Bamboo 2FG 4x5 Pad pad          id: 21   type: PAD
Wacom Bamboo 2FG 4x5 Ped stylus       id: 22   type: STYLUS
Wacom Bamboo 2FG 4x5 Pen eraser       id: 23   type: ERASER
Wacom Bamboo 2FG 4x5 Finger touch     id: 24   type: TOUCH

Поэтому, когда я кладу другой планшет, значение «$ variable», которое я получаю, изменяется, потому что есть больше слов, как я могу это исправить, значение, которое я ищу, - это номер стилуса, спасибо!

Ответы [ 4 ]

0 голосов
/ 30 августа 2018

Просто посчитайте поля с конца, а не с фронта:

awk '/stylus/{print $(NF-2)}'

например:.

$ cat file
Wacom Intuos S Pad pad                id: 21   type: PAD
Wacom Intuos S Pen stylus             id: 22   type: STYLUS
Wacom Intuos S Pen eraser             id: 23   type: ERASER
Wacom Bamboo 2FG 4x5 Pad pad          id: 21   type: PAD
Wacom Bamboo 2FG 4x5 Ped stylus       id: 22   type: STYLUS
Wacom Bamboo 2FG 4x5 Pen eraser       id: 23   type: ERASER
Wacom Bamboo 2FG 4x5 Finger touch     id: 24   type: TOUCH

$ awk '/stylus/{print $(NF-2)}' file
22
22
0 голосов
/ 30 августа 2018

Bash имеет встроенную поддержку регулярных выражений, которую можно использовать следующим образом:

id_re='id:[[:space:]]*([[:digit:]]+)'  # assign regex to variable

while IFS= read -r line; do
  [[ $line = *stylus* ]] || continue   # skip lines without "stylus"
  [[ $line =~ $id_re ]] || continue    # match against regex, or skip the line otherwise
  stylus_id=${BASH_REMATCH[1]}         # take the match group from the regex
  xsetwacom --set "$stylus_id" area 123 123 123 123 </dev/null
done < <(xsetwacom --list)

В https://ideone.com/amv9O1 вы можете видеть это выполнение (с вводом, поступающим от stdin, а не xsetwacom --list, конечно) и настройку stylus_id для обеих ваших линий.

0 голосов
/ 30 августа 2018

как то так?

$ ... | awk '/stylus/{for(i=1;i<NF;i++) if($i=="id:") {print $(i+1); exit}}' 

найти токен рядом с id:

0 голосов
/ 30 августа 2018

Если вы хотите получить идентификаторы, вы можете получить их как третье поле с конца ($(NF - 2)):

xsetwacom --list | awk '/stylus/ {print $(NF - 2)}'

Или вы можете изменить разделитель полей на 2+ пробела и просто напечатать второе поле:

xsetwacom --list | awk --field-separator="[ ]{2,}" '/stylus/{print $2}'

Это зависит от того, как xsetwacom изменит вывод для более длинных имен.

Из любопытства, вот версия "чистого awk":

yes | awk '
{ if (!( "xsetwacom --list" | getline )) { exit; } }
$NF == "STYLUS" { system("xsetwacom --set " $(NF-2) " area 123 123 123 123") }
'
...