2010-09-18 12 views
11

He siguiente cadenaShell script: Cómo cortar parte de una cadena

â â³ eGalax Inc. USB TouchController   id=9 [slave pointer (2)] 
â â³ eGalax Inc. USB TouchController   id=10 [slave pointer (2)] 

y me gustaría obtener la lista de identificación? ¿Cómo se puede hacer esto usando sed u otra cosa?

Respuesta

30

Pegué el contenido de su ejemplo en un archivo llamado so.txt.

$ cat so.txt | awk '{ print $7 }' | cut -f2 -d"=" 
9 
10 

Explicación:

  1. cat so.txt imprimirá el contenido del archivo a stdout.
  2. awk '{ print $7 }' imprimirá la séptima columna, es decir, la que contiene id=n
  3. cut -f2 -d"=" cortará la salida del paso # 2 usando = como delimitador y obtener la segunda columna (-f2)

Si desea más bien conseguir id= también, entonces:

$ cat so.txt | awk '{ print $7 }' 
id=9 
id=10 
+0

Thaks esto es exactamente lo que yo quería! – deimus

+0

puede aceptar esto como la respuesta a continuación. –

+1

uso inútil de gato y corte. awk puede hacer todo eso. – ghostdog74

3

utilizar una expresión regular para coger el número de identificación y reemplazar toda la línea con el número. Algo así debe hacerlo (coincide con todo hasta "id =", a continuación, coincide con cualquier número de dígitos, a continuación, que coincida con el resto de la línea):

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

hacer esto para cada línea y obtener la lista de IDS.

+0

este método da 9 y 1 pero debería ser 9 y 10 – deimus

+0

Correcto, cometí un error al pegar la línea sed. Lo actualicé para que funcione correctamente. – bluebrother

2

Un perl- solución:

perl -nE 'say $1 if /id=(\d+)/' filename 
1

Puede tener awk hacerlo todo sin usar cut:

awk '{print substr($7,index($7,"=")+1)}' inputfile 

Usted podría utilizar en lugar de split()substr(index()).

+0

+1. Me gusta esto. compacto. –

2
$ ruby -ne 'puts $_.scan(/id=(\d+)/)' file 
9 
10 
0

Suponiendo entrada del

{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 

O si siempre es el séptimo campo

#! /bin/sh 
while read f1 f2 f3 f4 f5 f6 f7 rest 
do 
echo ${f7##id=} 
done <so.txt 

Véase también

Shell Parameter Expansion