Пример:
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)]
Как извлечь колонку из вывода, скажем, вторую? И, например, сохраните его в переменной?
Возможно ли это сделать?
Зная, что элементы разделены вкладкой, мы можем использовать только оболочку с переменной $IFS и структурой while read ; do . . .done.
$ xinput | while IFS=$'\t' read ONE TWO THRE ; do
> echo $TWO
> done
id=2
id=4
id=11
id=3
id=5
id=6
id=7
id=8
id=9
id=10
id=12
Чтобы хранить элементы в переменной, мы можем использовать массивы, а
$ xinput | { while IFS=$'\t' read ONE TWO THRE ; do
> array+=( "$TWO" )
> done ;
> echo ${array[@]}
> }
id=2 id=4 id=11 id=3 id=5 id=6 id=7 id=8 id=9 id=10 id=12
Обратите внимание на использование структуры command | { command1 ; command2 ; command3 }. Вы быстро узнаете, что запуски труб и подоболочек в подселах не влияют на основную оболочку, поэтому вам нужно каким-то образом сохранить эти переменные.
Что касается выделения строки, это справедливо easy with grep:
$ xinput | grep 'Virtual core keyboard'
⎣ Virtual core keyboard id=3 [master keyboard (2)] # extract line with specific string
↳ Toshiba input device id=12 [slave keyboard (3)]
$ xinput | sed -n '3p' # extract 3rd line
⎜ ↳ SynPS/2 Synaptics TouchPad id=11 [slave pointer (2)]
, чтобы извлечь столбец, который вы могли бы попробовать awk
% xinput --list --short | awk '{print $3}'
core
Virtual
SynPS/2
core
core
Button
Bus
...
, чтобы назначить этот вывод переменной a. обратите внимание, что значение этой переменной будет содержать строку, содержащую символы новой строки после каждого слова, а не самую легкую для работы. Вероятно, лучше назначить массив.
% a=$(xinput --list --short | awk '{print $3}')
vel@ubuntu:/media/michael/3ae9487f-1652-400e-8136-fe63519941ed% echo $a
core
Virtual
SynPS/2
core
core
Button
Bus
Button
USB2.0
WMI
Translated