web-dev-qa-db-fra.com

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

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

lspci -s 0a.00.1 

Cela retourne 

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. 
28
bing281

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

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.

74
Diego

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 composé de 3 caractères, ou de 5 également.

16
Johnsyweb

Essayez ceci, disons 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
Mingjiang Shi

Utiliser sed:

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

Sortie:

4dc9
6
Birei

Si la véritable demande consiste à copier la dernière chaîne séparée par des espaces, quelle que soit sa longueur, la meilleure solution semble alors utiliser ... | awk '{print $NF}' donné 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 alors une solution spécifique à bash sans qu'il soit nécessaire d'appeler un sous-processus supplémentaire par piping:

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

Veuillez noter que l’espace entre les points et les caractères moins est essentiel, sans quoi la chaîne complète sera livrée:

$ test="1234567890"; echo "${test:-4}"
1234567890
$
3
Ralph Kirchner

J'utilise habituellement

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

Essayez d'utiliser grep:

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

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

Toutefois, si vous souhaitez avoir les 4 derniers caractères de la sortie complète, utilisez plutôt tail -c4.

2
kenorb

Une autre méthode consiste à utiliser la notation <<<:

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

au lieu d'utiliser des variables nommées, développez la pratique consistant à 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
Marty McGowan