web-dev-qa-db-fra.com

Script shell: comment couper une partie d'une chaîne

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? 

12
deimus

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:

  1. cat so.txt imprimera le contenu du fichier à stdout
  2. awk '{ print $7 }' affichera la septième colonne, c’est-à-dire celle contenant id=n 
  3. 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
31
Manoj Govindan

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.

3
bluebrother

Une solution Perl:

Perl -nE 'say $1 if /id=(\d+)/' filename
2
sid_com
$ Ruby -ne 'puts $_.scan(/id=(\d+)/)' file
9
10
2
ghostdog74

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()).

1
Dennis Williamson

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

Extension des paramètres de shell

0
frayser