提取在bash列,即使列的数量,才可以改变(Extract a column in bash eve

2019-11-05 04:06发布

我尝试让这个脚本来打开Wacom数位板领域,使用xsetwacom配置平板电脑的IM,

这是脚本我尝试如何使外观(它的工作原理,但只是第一片)

#!/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

所以,当我把另一个平板电脑中,“$变量”,我得到的值改变,因为那里有更多的话,我怎么能解决这个问题,值IM寻找的是手写笔的ID号,谢谢!

Answer 1:

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你可以看到这个运行(从标准输入,而不是输入来xsetwacom --list ,当然),并设置stylus_id为您的线路。



Answer 2:

假设你想要得到的ID,你可以让他们的第三个字段的端部( $(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") }
'


Answer 3:

仅计算领域从末端而不是从前面:

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


Answer 4:

这样的事情?

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

发现旁边的标记id:



文章来源: Extract a column in bash even if the number of columns before it can change