Как извлечь конкретный столбец или строку из вывода команды?

Пример:

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)]

Как извлечь колонку из вывода, скажем, вторую? И, например, сохраните его в переменной?

Возможно ли это сделать?

1
задан 6 May 2016 в 14:03

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)]
2
ответ дан 23 May 2018 в 11:23
  • 1
    @Kos, который делает более простое объявление и исправил мой ответ, однако, по какой-то причине я не могу забыть поставить $ впереди, следовательно, используя printf – Sergiy Kolodyazhnyy 6 May 2016 в 17:05

, чтобы извлечь столбец, который вы могли бы попробовать 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
1
ответ дан 23 May 2018 в 11:23
  • 1
    Я думаю, что OP означает второй выходной столбец, поле ID. Вы можете получить это с помощью awk -F"\t" {print $2}. – terdon♦ 6 May 2016 в 14:01
  • 2
    @terdon cool, да, это была только моя первая итерация, но да, вы добавили вывод в массив, который лучше для OP тоже – the_velour_fog 6 May 2016 в 14:07

Другие вопросы по тегам:

Похожие вопросы: