如何从命令的输出中提取特定的列或行?

Tel*_*Why 2 command-line output text-processing

例子:

abcd@abcd-abcde:~$ xinput --list --short

Virtual core pointer

? SynPS/2 Synaptics TouchPad                id=11   [slave  pointer  (2)]

? Logitech USB RECEIVER                     id=12   [slave  pointer  (2)]
Run Code Online (Sandbox Code Playgroud)

我将如何从输出中提取一列,比如第二列?并且,例如,将其存储在变量中?

是否有可能做到这一点?

ter*_*don 10

这正是awk为此而生的。使用xinput我系统上的输出:

$ xinput --list --short
? Virtual core pointer                      id=2    [master pointer  (3)]
?   ? Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
?   ? SIGMACHIP USB Keyboard                    id=12   [slave  pointer  (2)]
?   ? Logitech M325                             id=14   [slave  pointer  (2)]
?   ? AlpsPS/2 ALPS DualPoint Stick             id=17   [slave  pointer  (2)]
?   ? AlpsPS/2 ALPS DualPoint TouchPad          id=16   [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)]
    ? Power Button                              id=8    [slave  keyboard (3)]
    ? SIGMACHIP USB Keyboard                    id=11   [slave  keyboard (3)]
    ? Dell WMI hotkeys                          id=18   [slave  keyboard (3)]
    ? AT Translated Set 2 keyboard              id=13   [slave  keyboard (3)]
    ? Sleep Button                              id=9    [slave  keyboard (3)]
    ? UVC Camera (046d:0819)                    id=10   [slave  keyboard (3)]

$ xinput --list --short | awk -F"\t" '{print $2}'
id=2
id=4
id=12
id=14
id=17
id=16
id=3
id=5
id=6
id=7
id=8
id=11
id=18
id=13
id=9
id=10
Run Code Online (Sandbox Code Playgroud)

awk将自动将每个输入行拆分为由 给定的值的字段-F。默认情况下,它在空白处拆分,但这里我们需要一个选项卡。第一个字段是$1,第二个$2等等。

或者,您可以使用cut

$ xinput --list --short | cut -f2
id=2
id=4
id=12
id=14
id=17
id=16
id=3
id=5
id=6
id=7
id=8
id=11
id=18
id=13
id=9
id=10
Run Code Online (Sandbox Code Playgroud)

您可以像保存任何其他命令一样将输出保存在 shell 变量中:

$ ids=$(xinput --list --short | awk -F"\t" '{print $2}')
$ echo $ids
id=2 id=4 id=12 id=14 id=17 id=16 id=3 id=5 id=6 id=7 id=8 id=11 id=18 id=13 id=9 id=10
$ echo "$ids"
id=2
id=4
id=12
id=14
id=17
id=16
id=3
id=5
id=6
id=7
id=8
id=11
id=18
id=13
id=9
id=10
Run Code Online (Sandbox Code Playgroud)

您也可以将其保存为数组:

$ ids=( $(xinput --list --short | awk -F"\t" '{print $2}') )
$ echo ${ids[@]}
id=2 id=4 id=12 id=14 id=17 id=16 id=3 id=5 id=6 id=7 id=8 id=11 id=18 id=13 id=9 id=10
$ echo ${ids[2]}
id=12
Run Code Online (Sandbox Code Playgroud)