Подтвердить что ты не робот

Получить последние 4 символа вывода из стандартного

У меня есть script, который работает и использует

lspci -s 0a.00.1 

Это возвращает

0a.00.1 usb controller some text device 4dc9

Я хочу, чтобы эти последние 4 символа были такими, что

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

Ответ 1

Как насчет tail, с помощью переключателя -c. Например, чтобы получить последние 4 символа "привет":

echo "hello" | tail -c 5
ello

Обратите внимание, что я использовал 5 (4 + 1), потому что символ новой строки добавляется echo. Как предложил Брэд Кох ниже, используйте echo -n, чтобы предотвратить добавление символа новой строки.

Ответ 2

Вам действительно нужны последние четыре персонажа? Похоже, вы хотите получить последнее слово на линии:

awk '{ print $NF }'

Это будет работать, если идентификатор - 3 символа или 5.

Ответ 3

Использование sed:

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

Вывод:

4dc9

Ответ 4

Попробуйте это, скажем, если строка хранится в переменной 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

Ответ 5

Я обычно использую

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

Ответ 6

Если реальный запрос состоит в том, чтобы скопировать последнюю строку, разделенную пространством, независимо от ее длины, то лучшим решением, по-видимому, будет использование ... | awk '{print $NF}', как указано @Johnsyweb. Но если это действительно касается копирования фиксированного числа символов из конца строки, то существует bash -специфическое решение без необходимости ссылаться на любой дополнительный подпроцесс по трубопроводам:

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

Обратите внимание, что пространство между символом двоеточия и минусом имеет важное значение, так как без него будет доставлена ​​полная строка:

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

Ответ 7

Попробуйте использовать grep:

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

Это будет печатать последние 4 символа каждой строки.

Однако, если вы хотите иметь последние 4 символа всего вывода, используйте tail -c4 вместо этого.

Ответ 8

Еще один способ приблизиться к этому - использовать обозначение <<<:

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

Ответ 9

вместо использования именованных переменных, разработайте практику использования позиционных параметров, например:

set -- $( lspci -s 0a.00.1 );   # then the bash string usage:
echo ${1:(-4)}                  # has the advantage of allowing N PP to be set, eg:

set -- $(ls *.txt)
echo $4                         # prints the 4th txt file.