从管道中获取字符串的前[x]个字符


Answers:


82

一种方法是使用cut

 command | cut -c1-8

这将为您提供每行输出的前8个字符。由于cut它是POSIX的一部分,因此很可能会出现在大多数Unices上。


3
注意cut -c选择字符;cut -bhead -c选择字节。这在某些语言环境中有所不同(实际上,在使用UTF-8时)。
吉尔斯(Gilles)“所以,别再邪恶了”,2010年

在这种情况下,您也不必指定起始索引。说cut -c-8会选择字符1到8
Sparhawk

@Steven,cut在Windows上的等效项是?
Pacerier,2015年

command | dd bs=8 count=1 2>/dev/null。并不是说它更短或更高级。只是另一种选择。
dubiousjim

@Gilles,但请注意,对于当前版本的GNU cut,其cut -c工作方式类似于cut -b(也就是说,它不适用于多字节字符)。
斯特凡Chazelas

24

这些是仅获取前8个字符的其他方法。

command | head -c8

command | awk '{print substr($0,1,8);exit}' 

command | sed 's/^\(........\).*/\1/;q'

如果你有重击

var=$(command)
echo ${var:0:8}

2
我想下面的sed配方是有点更容易阅读:command | sed 's/\(.\{8\}\).*/\1/'或者如果你的sed的支持的话:command | sed -r 's/(.{8}).*/\1/'; 否则,+ 1
Steven D

好东西,但请注意,它head -c计数字节,而不是字符。同样,在主要的Awk实现中,只有GNU awk可以正确处理多字节字符-FreeBSD Awk和Mawk不能。
mklement0

2

如果您具有足够高级的外壳程序(例如,以下命令将在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>

1
如果您只想输出8个字符,而无需在shell中进行处理,则只需使用cut
dubiousjim 2012年

好知道read -n <num>; 小警告:Bash 3.x(在OS上仍为当前版本)错误地解释<num>字节数,因此以多字节字符失败;这已在Bash 4.x中修复。
mklement0

这是一个很好的有用的答案。比其他人普遍得多。
not2qubit

2

使用参数扩展的另一种班轮解决方案

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}而不是对整数进行硬编码。
Cometsong,

1

这是便携式的:

a="$(command)"             # Get the output of the command.
b="????"                   # as many ? as characters are needed.
echo ${a%"${a#${b}}"}      # select that many chars from $a

在这里建立一个可变长度的字符串有其自身的问题


0

在Maven存储库中手动生成校验和文件时遇到此问题。不幸的是,cut -c总是在输出末尾打印换行符。为了抑制我使用xxd

command | xxd -l$BYTES | xxd -r

$BYTES除非command的输出较短,否则它将输出精确的字节,然后输出该字节。


取消cut尾随换行符的另一种方法是将其插入:| tr -d '\n'
Cometsong
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.