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.
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.
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.
En utilisant sed
:
lspci -s 0a.00.1 | sed 's/^.*\(.\{4\}\)$/\1/'
Sortie:
4dc9
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
J'utilise habituellement
echo 0a.00.1 usb controller some text device 4dc9 | rev | cut -b1-4 | rev
4dc9
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
$
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.
Une autre façon d'aborder ceci est d'utiliser <<<
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 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.