2012-02-09 20 views

Respuesta

67

¿Qué tal tail, con el interruptor -c. Por ejemplo, para obtener los 4 últimos caracteres de "hola":

echo "hello" | tail -c 5 
ello 

Tenga en cuenta que he usado 5 (4 + 1) porque un carácter de nueva línea se añade por echo. Como sugiere Brad Koch a continuación, use echo -n para evitar que se agregue el carácter de nueva línea.

+0

gracias perfectos mucho – bing281

+1

Una solución simple y elegante. En otra parte de internet, cuando busco, obtengo una solución más compleja. Pero esta, creo que es la más simple e impresionante. Gracias. –

+3

'echo -n' evitaría que se agregue ese byte de nueva línea. –

3

lo general el uso

echo 0a.00.1 usb controller some text device 4dc9 | rev | cut -b1-4 | rev 
4dc9 
+1

Mientras eso funciona, parece que hay muchos procesos involucrados en el esfuerzo. –

+0

@JonathanLeffler: Pero muy rápido. A menudo encuentro 'rev | cut | rev' la más rápida de todas las soluciones posibles. – choroba

6

Usando sed:

lspci -s 0a.00.1 | sed 's/^.*\(.\{4\}\)$/\1/' 

Salida:

4dc9 
+1

Puede mejorar eso con: 'sed -n '$ s /.* \ (.... \) $/\ 1/p''; esto solo imprime la última línea de salida, y 4 puntos son más simples que los 6 caracteres utilizados para describirlo con la notación '. \ {4 \}'. –

16

Está seguro de querer los últimos cuatro caracteres? Parece que desea que la última "palabra" en la línea:

awk '{ print $NF }' 

Esto funcionará si el ID es de 3 caracteres, o 5, también.

+1

Muchas gracias que es de gran ayuda. – bing281

+0

@ bing281: De nada. – Johnsyweb

+1

@downvoter: Dado que el bingo dijo que esto ayudó, ¿podría explicar el voto a la baja? – Johnsyweb

0

una forma más de acercarse a esto es utilizar la notación <<<:

tail -c 5 <<< '0a.00.1 usb controller some text device 4dc9' 
6

probar esto, decir si la cadena se almacena en la variable foo.

foo=`lspci -s 0a.00.1` # the foo value should be "0a.00.1 usb controller some text device 4dc9" 
echo ${foo:(-4)} # which should output 4dc9 
+0

Funcionó muy bien. Gracias. – deppfx

2

Si la solicitud es verdadera para copiar la última cadena separada por espacios, independientemente de su longitud, a continuación, la mejor solución parece estar usando ... | awk '{print $NF}' dada por @Johnsyweb. Pero si esto es de hecho sobre la copia de un número fijo de caracteres desde el final de una cadena, entonces hay una solución de fiesta específica, sin la necesidad de recurrir a cualquier subproceso aún más por la tubería:

$ test="1234567890"; echo "${test: -4}" 
7890 
$ 

Tenga en cuenta que el espacio entre el colon y el signo menos es esencial, ya que sin ella la cadena completa de insulina:

$ test="1234567890"; echo "${test:-4}" 
1234567890 
$ 
+0

Disculpas, acabo de notar que esta solución es, de hecho, idéntica a la sugerencia de Mingjiang Shi, solo que omite los corchetes alrededor del desplazamiento. –

+1

Puede eliminar esta respuesta si lo desea. – user4098326

2

Trate de usar grep:

lspci -s 0a.00.1 | grep -o ....$ 

Esta voluntad imprime los últimos 4 caracteres de cada línea.

Sin embargo, si desea tener los últimos 4 caracteres de la salida completa, use tail -c4 en su lugar.

0

en lugar de utilizar variables con nombre, desarrollar la práctica de utilizar los parámetros posicionales, como esto:

set -- $(lspci -s 0a.00.1); # then the bash string usage: 
echo ${1:(-4)}     # has the advantage of allowing N PP's to be set, eg: 

set -- $(ls *.txt) 
echo $4       # prints the 4th txt file.