提取 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
我正在尝试制作此脚本以在 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