J'ai la ficelle suivante
â â³ eGalax Inc. USB TouchController id=9 [slave pointer (2)]
â â³ eGalax Inc. USB TouchController id=10 [slave pointer (2)]
et voudrait obtenir la liste des identifiants? Comment cela peut-il être fait avec sed ou autre chose?
J'ai collé le contenu de votre exemple dans un fichier nommé so.txt
.
$ cat so.txt | awk '{ print $7 }' | cut -f2 -d"="
9
10
Explication:
cat so.txt
imprimera le contenu du fichier à stdout
. awk '{ print $7 }'
affichera la septième colonne, c’est-à-dire celle contenant id=n
cut -f2 -d"="
coupera la sortie de l'étape 2 en utilisant =
comme délimiteur et obtiendra la deuxième colonne (-f2
)Si vous préférez également obtenir id=
également:
$ cat so.txt | awk '{ print $7 }'
id=9
id=10
Utilisez une expression régulière pour saisir le numéro d'identification et remplacez la ligne entière par le numéro. Quelque chose comme ceci devrait le faire (correspond à tout jusqu'à "id =", puis correspond à un nombre quelconque de chiffres, puis au reste de la ligne):
sed -e 's/.*id=\([0-9]\+\).*/\1/g'
Faites cela pour chaque ligne et vous obtenez la liste des identifiants.
Une solution Perl:
Perl -nE 'say $1 if /id=(\d+)/' filename
$ Ruby -ne 'puts $_.scan(/id=(\d+)/)' file
9
10
Vous pouvez avoir awk
tout faire sans utiliser cut
:
awk '{print substr($7,index($7,"=")+1)}' inputfile
Vous pouvez utiliser split()
au lieu de substr(index())
.
En supposant que l’entrée de
{Anything}id={ID}{space}{Anything}
{Anything}id={ID}{space}{Anything}
-
#! /bin/sh
while read s; do
rhs=${s##*id=}
id=${rhs%% *}
echo $id # Do what you will with $id here
done <so.txt
Ou si c'est toujours le 7ème terrain
#! /bin/sh
while read f1 f2 f3 f4 f5 f6 f7 rest
do
echo ${f7##id=}
done <so.txt
Voir également