Linux 命令(如 cat)读取指定数量的字符

Linux 中是否有类似 cat的命令可以从文件中返回指定数量的字符?

例如,我有一个文本文件,如:

Hello world
this is the second line
this is the third line

我想要一个返回前5个字符的东西,也就是“ hello”。

谢谢

151969 次浏览

总目 :

姓名

Head-输出文件的第一部分

大纲

头部[ 选项] ... [ 文件] ..。

描述

将每个文件的前10行打印到标准输出。使用多个 FILE 时,在每个文件前面都有一个标题,指定文件名。没有文件,或者什么时候 文件是-,读取标准输入。

对于卖空期权而言,强制性的多头期权论据也是强制性的。
- c 字节 = < i > [-] N 打印每个文件的前 N 个字节; 以“-”开头,打印每个文件的除最后 N 个字节以外的所有字节

头或尾也可以做到这一点:

^ c X

打印文件的前 X 字节(如果是 UTF-16文件,则不一定是字符)。Tail 将执行同样的操作,除了最后的 X 字节。

这(和切割)是便携式的。

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字节,请使用 tail 读取 head的前200字节并获取最后100字节:

head -c 200 file | tail -c 100

你也可以把线取出来,然后像这样剪下来:

Grep‘ text’filename | cut-c 1-5

可以使用 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
head -Line_number file_name | tail -1 |cut -c Num_of_chars

这个脚本给出了来自特定行和位置的确切字符数,例如:

head -5 tst.txt | tail -1 |cut -c 5-8

给出第5行中的字符和第5行中的字符5到8,

注意 : tail -1用于选择头部显示的最后一行。

我知道答案是回答6年前的一个问题。

但我花了几个小时寻找类似的东西,然后发现: Cut-c 正是这样做的,另外还可以指定偏移量。

Cut-c 1-5 将返回 你好C711将返回 世界。不需要任何其他命令

尽管这个问题在几年前就被回答或接受了,但目前公认的答案只适用于 ISO-8859-1这样的每个字符一字节的编码,或者可变字节字符集(如 UTF-8中的拉丁字符)的单字节子集。即使使用多字节拼接,也只能对固定多字节编码(如 UTF-16)起作用。考虑到现在 UTF-8正在成为一个通用标准,当看到 这个以母语人口排序的语言列表本文列出了按本地/次要用法分列的前30种语言时,指出一个简单的变字节字符友好(而不是基于字节)技术很重要,使用 cut -ctr/sed和字符类。

比较下面两个因为两个常见的以拉丁文为中心的错误/关于字节与字符问题的假设而双重失败的例子(一个是 headcut,另一个是 [a-z][A-Z][: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 上工作得很好,但是在 GNU/Linux 上的 cuttr在 UTF-8中对我来说仍然是希腊语的错误) :

$ printf 'Πού μπορώ να μάθω σανσκριτικά;\n' | \
$     cut -c 1 | \
$     tr '[:upper:]' '[:lower:]'
π

另一个最近的答案已经提出了“削减”,但只是因为它可以用来指定任意偏移量,而不是因为直接相关的字符与字节问题。

如果您的 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 的)

下面是一个使用这里提到的 dd方法完成的简单脚本:

Extract _ chars. sh

#!/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