Linux 从标准输出中获取输出的最后4个字符

Linux 从标准输出中获取输出的最后4个字符,linux,bash,shell,character,Linux,Bash,Shell,Character,我有一个正在运行并使用的脚本 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. 带-c开关的tail怎么样。例如,要获取“hello”的最后4个字符: 请注意,我使用了5(4+1),因为换行符是由echo添加的。正如下面Brad Koch所建议的

我有一个正在运行并使用的脚本

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. 

-c
开关的
tail
怎么样。例如,要获取“hello”的最后4个字符:

请注意,我使用了5(4+1),因为换行符是由
echo
添加的。正如下面Brad Koch所建议的,使用
echo-n
来防止添加换行符。

我通常使用

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

使用
sed

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

4dc9

你真的想要最后四个字符吗?看起来你想要最后一个“单词”:

awk '{ print $NF }'

如果ID是3个字符,或者是5个字符,那么这将起作用。

实现这一点的另一种方法是使用
试试这个,比如字符串是否存储在变量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

如果真正的请求是复制最后一个空格分隔的字符串,而不考虑其长度,那么最好的解决方案似乎是使用
…|awk“{print$NF}”
由@Johnsyweb给出。但是,如果这确实是关于从字符串末尾复制固定数量的字符,那么有一个特定于bash的解决方案,无需通过管道调用任何进一步的子流程:

$ test="1234567890"; echo "${test: -4}"
7890
$
请注意,冒号和减号之间的空格是必需的,因为如果没有空格,将传递完整的字符串:

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

尝试使用
grep

lspci -s 0a.00.1 | grep -o ....$
这将打印每行的最后4个字符


但是,如果您希望获得整个输出的最后4个字符,请使用
tail-c4

而不是使用命名变量,开发使用位置参数的实践,如下所示:

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.  

您可以使用:
sed-n'$s/*\(....\)$/\1/p'
;这只打印输出的最后一行,4个点比用
\{4\}
符号来描述它的6个字符要简单。虽然这样做有效,但这似乎需要很多过程。@JonathanLeffler:但速度非常快。我经常发现
rev | cut | rev
是所有可能的解决方案中最快的。
echo-n
会阻止添加换行符字节。在我的bash中,“-c”和“5”之间不能有空格。它必须是“tail-c5”,而不是“tail-c5”。抱歉,我只是注意到这个解决方案实际上与石明江的建议相同,只在偏移量周围使用括号。如果你愿意,你可以删除这个答案。这只在源内容以变量或固定字符串形式出现时有效。在这种情况下,通过将变量或固定字符串直接写入tail的stdin,它确实避免了包含两个进程而不是一个进程的不必要管道。但是,OP希望从命令的输出中获取最后四个字符,使用您的构造必须是(..)必须是“tail-c5”
lspci -s 0a.00.1 | grep -o ....$
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.