提取 bash 中的列,即使它之前的列数可以更改

Extract a column in bash even if the number of columns before it can change

我正在尝试制作此脚本以在 wacom 数位板上切换区域,我正在使用 xsetwacom 配置数位板,

这就是我试图制作的脚本的外观(它有效,但仅适用于第一台平板电脑)

#!/bin/bash
variable =`xsetwacom --list | awk '/stylus/ {print }'`
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”的值发生了变化,因为有更多的单词,我该如何解决这个问题,我正在寻找的值是手写笔的 ID 号,谢谢! .

假设你想获取id,你可以将它们作为倒数第三个字段获取($(NF - 2)):

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

或者您可以将字段分隔符更改为 2 个以上的空格,然后只打印第二个字段:

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

这取决于 xsetwacom 如何更改较长名称的输出。

出于好奇,这里是 "pure awk" 版本:

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

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 .

是这样的吗?

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

找到 id:

旁边的标记

只从末尾而不是从前面计算字段:

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