2010-08-09 6 views
2

J'ai quelque chose comme ça:Script Shell - Comment obtenir des choses entre les deux séparateurs

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

Et je veux obtenir le numéro d'identification. J'ai essayé quelque chose comme awk -F 'id =' '[print $ 2} mais le texte après le numéro d'identification est toujours là! Comment je peux seulement obtenir le numéro d'identification!

Merci d'avance.

Répondre

1

une façon

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

avec le shell (bash)

#!/bin/bash 
xinput --list | while read -r line 
do 
    case "$line" in 
    *id=*) 
    line=${line##*id=} 
    echo ${line%% *} 
    esac 
done 
2

Cela peut ne pas être le plus court, mais devrait être facile à comprendre pour tout le monde avec un peu de connaissances awk:

awk '{ for (i = 1; i <= NF; i++) if ($i ~ /id=/) { print substr($i, 4); break; } }' 
+0

Je suggère: '{print substr ($ i, 4); pause} 'à la place de votre déclaration d'impression –

+0

@glenn jackman Merci, je l'ai ajouté. – schot

0

essayez quelque chose comme:

xinput --list | while read line; do 
    ID=`echo ${line} | cut -d= -f2 | cut -d\[ -f1 | xargs` 
    echo ${ID} 
done 
+0

merci ça marche bien! – turlutte

+0

vous êtes les bienvenus :) – ozk

2

Essayez:

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

ou

xinput --list | grep -Eo 'id=[0-9]+' | awk -F= '{print $2}' 
+0

belle solution. nécessite GNU grep pour -o –

0

Bash seulement:

while read line ; do 
    if [[ $line =~ id=([[:digit:]]) ]] ; then 
     echo "${BASH_REMATCH[1]}" 
    fi 
done < <(xinput --list) 
0

Je trouve ces choses les plus simples avec sed, en utilisant la substitution d'un groupe pour capturer les données vous voulez et assurer le reste de la ligne est apparié dans l'expression rationnelle.

sed 's/.*id=\([0-9]*\).*/\1/' 
+0

qui inclura les lignes qui n'ont pas d'ID =, utilisez -n pour supprimer la sortie initiale et ajoutez ap à la fin du remplacement pour afficher uniquement la chaîne de remplacement ... ou xinput - -liste seulement les lignes d'affichage avec une sortie d'id? – Petesh

+0

Je me basais sur le texte d'exemple fourni par l'affiche, mais vous avez raison en ce qui concerne -n ​​/ p - un autre modèle sed que j'utilise fréquemment. – camh

0

Essayez:

cat x | awk -Fid= '{print $2}' | awk '{print $1}' 
Questions connexes