Answers:
一种方法是使用cut
:
command | cut -c1-8
这将为您提供每行输出的前8个字符。由于cut
它是POSIX的一部分,因此很可能会出现在大多数Unices上。
cut -c
选择字符;cut -b
或head -c
选择字节。这在某些语言环境中有所不同(实际上,在使用UTF-8时)。
cut -c-8
会选择字符1到8
cut
在Windows上的等效项是?
command | dd bs=8 count=1 2>/dev/null
。并不是说它更短或更高级。只是另一种选择。
cut
,其cut -c
工作方式类似于cut -b
(也就是说,它不适用于多字节字符)。
这些是仅获取前8个字符的其他方法。
command | head -c8
command | awk '{print substr($0,1,8);exit}'
command | sed 's/^\(........\).*/\1/;q'
如果你有重击
var=$(command)
echo ${var:0:8}
command | sed 's/\(.\{8\}\).*/\1/'
或者如果你的sed的支持的话:command | sed -r 's/(.{8}).*/\1/'
; 否则,+ 1
head -c
计数字节,而不是字符。同样,在主要的Awk实现中,只有GNU awk可以正确处理多字节字符-FreeBSD Awk和Mawk不能。
如果您具有足够高级的外壳程序(例如,以下命令将在Bash中运行,不确定是否使用破折号),则可以执行以下操作:
read -n8 -d$'\0' -r <(command)
执行后read ... <(command)
,您的字符将位于shell变量中REPLY
。输入help read
以了解其他选项。
说明:-n8
参数to read
表示我们最多需要8个字符。The -d$'\0'
say读取直到为空,而不是换行符。这样,即使较早的字符之一是换行符,读取也将继续8个字符(但如果它是null,则不是)。的替代方法-n8 -d$'\0'
是使用-N8
,它可以读取8个字符或直到stdin到达EOF。没有分隔符。这可能更适合您的需求,但是我不知道有多少壳具有荣誉-N
而不是荣誉-n
和荣誉-d
。继续进行说明:-r
说忽略- \
转义\\
符,因此,例如,我们将其视为两个字符,而不是一个字符\
。
最后,我们这样做read ... <(command)
不是command | read ...
因为在第二种形式中,读取是在子外壳中执行的,然后该子外壳立即退出,从而丢失了您刚刚读取的信息。
另一个选择是在子Shell中进行所有处理。例如:
$ echo abcdefghijklm | { read -n8 -d$'\0' -r; printf "REPLY=<%s>\n" "$REPLY"; }
REPLY=<abcdefgh>
cut
。
read -n <num>
; 小警告:Bash 3.x(在OS上仍为当前版本)错误地解释<num>
为字节数,因此以多字节字符失败;这已在Bash 4.x中修复。
使用参数扩展的另一种班轮解决方案
echo ${word:0:x}
EG: word="Hello world"
echo ${word:0:3} or echo ${word::3}
o/p: Hel
EG.2: word="Hello world"
echo ${word:1:3}
o/p: ell
x=8; echo ${word:0:$x}
而不是对整数进行硬编码。
在Maven存储库中手动生成校验和文件时遇到此问题。不幸的是,cut -c
总是在输出末尾打印换行符。为了抑制我使用xxd
:
command | xxd -l$BYTES | xxd -r
$BYTES
除非command
的输出较短,否则它将输出精确的字节,然后输出该字节。
cut
尾随换行符的另一种方法是将其插入:| tr -d '\n'