Answers:
head
也可以:
head -c 100 file # returns the first 100 bytes in the file
..将提取前100个字节并将其返回。
head
为此使用的好处是tail
匹配的语法:
tail -c 100 file # returns the last 100 bytes in the file
您可以将它们组合以获得字节范围。例如,要从文件中获取后 100个字节,请head
使用读取前200个字节,然后使用tail来获取后100个字节:
head -c 200 file | tail -c 100
head
,然后使用tail
获取后10 个字节,例如:head -c 20 file | tail -c 10
您可以使用dd提取任意字节块。
例如,
dd skip=1234 count=5 bs=1
将字节1235到1239从其输入复制到其输出,并丢弃其余字节。
要仅从标准输入中获取前五个字节,请执行以下操作:
dd count=5 bs=1
请注意,如果要指定输入文件名,则dd具有老式参数解析功能,因此您可以执行以下操作:
dd count=5 bs=1 if=filename
还请注意,dd详细地宣布了它所做的事情,因此,扔掉它,做一下:
dd count=5 bs=1 2>&-
要么
dd count=5 bs=1 2>/dev/null
dd bs=1
强制dd一次读取和写入单个字符,这比head
计数大时要慢得多。但是,对于count = 5来说并不明显。
dd
看来可以解决问题。
head -c
实施有效的dd bs=5 count=1
方法
我知道答案是对6年前提出的问题的答复...
但是我在找了几个小时后发现了类似的东西,然后才发现: cut -c确实做到了这一点,另外还可以指定一个偏移量。
cut -c 1-5将返回Hello,而cut -c 7-11将返回world。无需任何其他命令
即使几年前已经回答/接受了此答案,但目前接受的答案仅对每字符一个字节的编码(例如iso-8859-1)或可变字节字符集的单字节子集(例如拉丁字符)是正确的在UTF-8中)。即使使用多字节拼接,也仅适用于固定多字节编码,例如UTF-16。鉴于现在UTF-8是很好的道路上是一个通用的标准,并且在看的时候的语言这个名单母语的人数和前30种语言的本地/二次使用的这个名单,它指出一个很重要简单的可变字节字符友好(不是基于字节的)技术,使用cut -c
和tr
/ sed
和字符类。
比较以下由于两个常见的以拉丁文为中心的关于字节与字符的问题(一个是head
vs. cut
,另一个是[a-z][A-Z]
vs. [:upper:][:lower:]
)而导致的以拉丁文为中心的错误/假定而导致双重失败的情况:
$ printf 'Πού μπορώ να μάθω σανσκριτικά;\n' | \
$ head -c 1 | \
$ sed -e 's/[A-Z]/[a-z]/g'
[[unreadable binary mess, or nothing if the terminal filtered it]]
对此(注意:这在FreeBSD上工作正常,但是对我而言cut
,tr
在GNU / Linux上和&仍然仍然以UTF-8破坏了希腊语):
$ printf 'Πού μπορώ να μάθω σανσκριτικά;\n' | \
$ cut -c 1 | \
$ tr '[:upper:]' '[:lower:]'
π
另一个较新的答案已经提出“切割”,但这只是因为附带的问题,即它可以用于指定任意偏移量,而不是因为直接相关的字符vs.字节问题。
如果您cut
不能正确-c
使用可变字节编码,则可以尝试使用“第一个X
字符”(替换X
为您的数字):
sed -E -e '1 s/^(.{X}).*$/\1/' -e q
-但仅限于第一行head -n 1 | grep -E -o '^.{X}'
-仅限于第一行,尽管链接了两个命令dd
-已经在其他答案中提出了建议,但确实很麻烦sed
带有滑动窗口缓冲区的复杂脚本,可以处理散布在多行上的字符,但这可能比仅使用类似方法更麻烦/脆弱dd
如果您tr
不能正确使用可变字节编码处理字符类,则可以尝试:
sed -E -e 's/[[:upper:]]/\L&/g
(特定于GNU)printf 'Πού ' | cut -c 1
仅返回乱码...的行为类似于“头”
这是一个简单的脚本,使用dd
此处提到的方法进行了总结:
#!/usr/bin/env bash
function show_help()
{
IT="
extracts characters X to Y from stdin or FILE
usage: X Y {FILE}
e.g.
2 10 /tmp/it => extract chars 2-10 from /tmp/it
EOF
"
echo "$IT"
exit
}
if [ "$1" == "help" ]
then
show_help
fi
if [ -z "$1" ]
then
show_help
fi
FROM=$1
TO=$2
COUNT=`expr $TO - $FROM + 1`
if [ -z "$3" ]
then
dd skip=$FROM count=$COUNT bs=1 2>/dev/null
else
dd skip=$FROM count=$COUNT bs=1 if=$3 2>/dev/null
fi
mkfifo /tmp/test.fifo; echo "hello world">/tmp/test.fifo & head -c 5 /tmp/test.fifo
还消耗" world\n"
永远丢失的东西。