it-swarm.com.de

BASH: Liefert die letzten 4 Zeichen der Ausgabe von Standard Out, Inline

Ich habe ein Skript, das läuft und verwendet 

lspci -s 0a.00.1 

Das kehrt zurück 

0a.00.1 usb controller some text device 4dc9

Ich möchte, dass die letzten 4 Zeichen so eingebettet werden 

lspci -s 0a.00.1 | some command to give me the last 4 characters. 
28
bing281

Wie wäre es mit tail mit dem -c-Schalter. Um beispielsweise die letzten 4 Zeichen von "Hallo" zu erhalten:

echo "hello" | tail -c 5
Ello

Beachten Sie, dass ich 5 (4 + 1) verwendet habe, da durch echo ein Newline-Zeichen hinzugefügt wird. Wie von Brad Koch vorgeschlagen, verwenden Sie echo -n, um zu verhindern, dass das Zeilenvorschubzeichen hinzugefügt wird.

74
Diego

Willst du wirklich die letzten vier Zeichen? Es sieht so aus, als wollten Sie das letzte "Wort" in der Zeile:

awk '{ print $NF }'

Dies funktioniert, wenn die ID 3 oder 5 Zeichen ist.

16
Johnsyweb

Versuchen Sie dies, wenn der String in der Variablen foo gespeichert ist. 

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

sed verwenden:

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

Ausgabe:

4dc9
6
Birei

Wenn es die reale Anforderung ist, die letzte durch Leerzeichen getrennte Zeichenfolge unabhängig von ihrer Länge zu kopieren, scheint die beste Lösung die Verwendung von ... | awk '{print $NF}' zu sein, wie von @Johnsyweb angegeben. Wenn es sich jedoch tatsächlich um das Kopieren einer festen Anzahl von Zeichen vom Ende eines Strings handelt, gibt es eine bash-spezifische Lösung, ohne dass ein weiterer Unterprozess durch Piping aufgerufen werden muss:

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

Bitte beachten Sie, dass das Leerzeichen zwischen Doppelpunkt und Minuszeichen wesentlich ist, da sonst die vollständige Zeichenfolge geliefert wird:

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

Ich benutze normalerweise

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

Versuchen Sie es mit grep:

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

Dadurch werden die letzten 4 Zeichen jeder Zeile gedruckt.

Wenn Sie jedoch die letzten 4 Zeichen der gesamten Ausgabe wünschen, verwenden Sie stattdessen tail -c4.

2
kenorb

Eine weitere Möglichkeit, dies zu erreichen, ist die Verwendung der <<<-Notation:

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

anstatt benannte Variablen zu verwenden, entwickeln Sie die Praxis, Positionsparameter wie folgt zu verwenden:

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