2012-02-09 15 views

Odpowiedz

67

Jak o tail, z przełącznikiem -c. Na przykład, aby uzyskać ostatnie 4 znaków „hello”:

echo "hello" | tail -c 5 
ello 

Zauważ, że użyłem 5 (4 + 1), ponieważ jest znak dodane przez echo. Jak sugeruje Brad Koch poniżej, użyj echo -n, aby zapobiec dodawaniu znaku nowej linii.

+0

doskonałe dzięki dużo – bing281

+1

Proste i eleganckie rozwiązanie. Gdzie indziej w Internecie, kiedy szukam, otrzymuję bardziej złożone rozwiązanie. Ale ten, myślę, że jest najprostszy i niesamowity. Dzięki. –

+3

'echo -n' zapobiegnie dodawaniu bajtów nowego wiersza. –

3

Zwykle używam

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

Podczas gdy to działa, wydaje się, że wiele procesów zaangażowanych w ten wysiłek. –

+0

@ JonathanLeffler: Ale bardzo szybko. Często uważam 'rev | cut | rev' za najszybszy ze wszystkich możliwych rozwiązań. – choroba

6

Korzystanie sed:

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

wyjściowa:

4dc9 
+1

Możesz to poprawić za pomocą: 'sed -n '$ s /.* \ (.... \) $/\ 1/p''; to wypisuje tylko ostatnią linię wyjściową, a 4 kropki są prostsze niż 6 znaków używanych do opisania go z notacją '. \ {4 \}. –

16

Naprawdę chcesz ostatnie cztery znaki? Wygląda na to, że chcesz ostatnie "słowo" na linii:

awk '{ print $NF }' 

Będzie to działać, jeśli identyfikator ma 3 znaki, lub 5, jak również.

+1

Bardzo dziękuję, to dobra pomoc. – bing281

+0

@ bing281: Nie ma za co. – Johnsyweb

+1

@downvoter: Biorąc pod uwagę bingo powiedział, że to pomogło, czy mógłbyś wyjaśnić sprawę? – Johnsyweb

0

Jeszcze jeden sposób podejścia do tego jest użycie <<< notacji:

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

Spróbuj to powiedzieć, jeśli ciąg jest przechowywany w zmiennej 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 
+0

Działa bardzo dobrze. Dziękuję Ci. – deppfx

2

Jeżeli wniosek jest prawdziwy kopiować ostatnią spacjami ciąg niezależnie od jego długości, to najlepszym rozwiązaniem wydaje się być za pomocą ... | awk '{print $NF}' podane przez @Johnsyweb. Ale jeśli to jest rzeczywiście o kopiowanie stałą liczbę znaków od końca łańcucha, to nie jest rozwiązanie bash specyficzne bez konieczności powoływania jakichkolwiek dalszych podproces przez orurowanie:

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

Należy pamiętać, że przestrzeń między dwukropek i znak minus jest niezbędna, ponieważ bez niej pełny ciąg zostanie dostarczone:

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

Przepraszam, właśnie zauważyłem, że to rozwiązanie jest w istocie identyczne z sugestią Mingjiang Shi, tylko ommiting o nawiasach wokół offsetu. –

+1

Możesz usunąć tę odpowiedź, jeśli chcesz. – user4098326

2

Spróbuj użyć grep:

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

będzie wydrukuj ostatnie 4 znaki każdej linii.

Jednak jeśli chcesz mieć 4 ostatnie znaki z całej zawartości, użyj zamiast tego tail -c4.

0

zamiast używać nazwanych zmiennych, rozwijać praktykę za pomocą parametrów pozycyjnych, tak:

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. 
Powiązane problemy