Shell Script - Как получить вещи между двумя разделителями - PullRequest
2 голосов
/ 09 августа 2010

У меня есть что-то подобное:

xinput --list
⎡ Virtual core pointer                      id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ Microsoft Basic Optical Mouse             id=8    [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)]
    ↳ Power Button                              id=7    [slave  keyboard (3)]
    ↳ CHICONY HP Basic USB Keyboard             id=9    [slave  keyboard (3)]

И я хочу получить идентификационный номер. Я пробовал что-то вроде awk -F 'id =' '[print $ 2}, но текст после идентификатора все еще здесь! Как я могу получить только идентификационный номер!

Заранее спасибо.

Ответы [ 7 ]

2 голосов
/ 09 августа 2010

Попробуйте:

xinput --list | grep -Eo 'id=[0-9]+' | grep -Eo '[0-9]+'

или

xinput --list | grep -Eo 'id=[0-9]+' | awk -F= '{print $2}'
2 голосов
/ 09 августа 2010

Это может быть не самое короткое, но должно быть легко понять для любого, кто имеет немного знаний awk:

awk '{ for (i = 1; i <= NF; i++) if ($i ~ /id=/) { print substr($i, 4); break; } }'
1 голос
/ 09 августа 2010

в одну сторону

xinput --list | awk -F"id=" 'NF{split($2,a," ");print a[1]}' file

с оболочкой (удар)

#!/bin/bash
xinput --list | while read -r line
do
  case "$line" in
   *id=* )
     line=${line##*id=}
     echo ${line%% *}
  esac
done
0 голосов
/ 10 августа 2010

Попробуйте:

cat x | awk -Fid= '{print $2}' | awk  '{print $1}'
0 голосов
/ 10 августа 2010

Я считаю, что это проще всего с помощью sed, использующего подстановку группы для сбора нужных вам данных и обеспечения соответствия остальной части строки регулярному выражению.

sed 's/.*id=\([0-9]*\).*/\1/'
0 голосов
/ 10 августа 2010

Bash only:

while read line ; do
    if [[ $line =~ id=([[:digit:]]) ]] ; then
        echo "${BASH_REMATCH[1]}"
    fi
done < <( xinput --list )
0 голосов
/ 09 августа 2010

попробуйте что-то вроде этого:

xinput --list | while read line; do
    ID=`echo ${line} | cut -d= -f2 | cut -d\[ -f1 | xargs`
    echo ${ID}
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...