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.
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.
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.
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
Utiliser sed
:
lspci -s 0a.00.1 | sed 's/^.*\(.\{4\}\)$/\1/'
Sortie:
4dc9
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
$
J'utilise habituellement
echo 0a.00.1 usb controller some text device 4dc9 | rev | cut -b1-4 | rev
4dc9
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
.
Une autre méthode consiste à utiliser la notation <<<
:
tail -c 5 <<< '0a.00.1 usb controller some text device 4dc9'
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.