BASH: récupère les 4 derniers caractères de sortie de Standard Out, Inline

J'ai un script qui est en cours d'exécution et utilise

lspci -s 0a.00.1 

Cela renvoie

0a.00.1 usb controller some text device 4dc9

Je veux obtenir ces 4 derniers caractères en ligne tels que

lspci -s 0a.00.1 | some command to give me the last 4 characters. 
27
demandé sur Eric Wilson 2012-02-10 02:35:44

9 réponses

Que diriez-vous de tail, avec le commutateur -c. Par exemple, pour obtenir les 4 derniers caractères de "bonjour":

echo "hello" | tail -c 5
ello

Notez que j'ai utilisé 5 (4+1) car un caractère de nouvelle ligne est ajouté par echo. Comme suggéré par Brad Koch ci-dessous, utilisez echo -n pour empêcher l'ajout du caractère de nouvelle ligne.

70
répondu Diego 2013-06-17 17:45:42

Voulez-vous vraiment les quatre derniers personnages? On dirait que vous voulez le dernier " mot " sur la ligne:

awk '{ print $NF }'

Cela fonctionnera si L'ID est de 3 caractères, ou 5, aussi.

16
répondu Johnsyweb 2012-02-12 02:52:02

En utilisant sed:

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

Sortie:

4dc9
6
répondu Birei 2012-02-09 22:53:23

Essayez ceci, dites si la chaîne est stockée dans 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
6
répondu Mingjiang Shi 2015-03-10 01:54:01

J'utilise habituellement

echo 0a.00.1 usb controller some text device 4dc9 | rev | cut -b1-4 | rev
4dc9
3
répondu choroba 2012-02-09 22:51:28

Si la vraie demande est de copier la dernière chaîne séparée par des espaces quelle que soit sa longueur, alors la meilleure solution semble utiliser ... | awk '{print $NF}' comme indiqué par @Johnsyweb. Mais s'il s'agit bien de copier un nombre fixe de caractères à partir de la fin d'une chaîne, il existe une solution spécifique à bash sans qu'il soit nécessaire d'invoquer d'autres sous-processus par piping:

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

Veuillez noter que l'espace entre deux-points et le caractère moins est essentiel, car sans cela la chaîne complète sera livré:

$ test="1234567890"; echo "${test:-4}"
1234567890
$
3
répondu Ralph Kirchner 2015-04-26 22:55:50

Essayez d'utiliser grep:

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

Cela affichera les 4 derniers caractères de chaque ligne.

Cependant, si vous souhaitez avoir les 4 derniers caractères de la sortie entière, utilisez tail -c4 à la place.

2
répondu kenorb 2015-04-26 22:56:50

Une autre façon d'aborder ceci est d'utiliser <<< notation:

tail -c 5 <<< '0a.00.1 usb controller some text device 4dc9'
0
répondu cwallenpoole 2015-03-03 18:03:01

Au lieu d'utiliser des variables nommées, développez la pratique d'utiliser les paramètres de position, comme ceci:

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.  
0
répondu Marty McGowan 2015-04-26 23:26:42