Linux命令(类似cat),用于读取指定数量的字符

v440hwme  于 2023-10-16  发布在  Linux
关注(0)|答案(9)|浏览(115)

Linux中有没有像cat这样的命令,可以从文件中返回指定数量的字符?
例如,我有一个文本文件,如下所示:

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

我想要的东西,将返回前5个字符,这将是“你好”。
谢谢

nnvyjq4y

nnvyjq4y1#

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

您可以将这些合并组合起来以获得字节范围。例如,要从文件中获取 second 100字节,请使用head读取前200字节,然后使用tail获取最后100字节:

head -c 200 file | tail -c 100
kkih6yb8

kkih6yb82#

可以使用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
bxgwgixi

bxgwgixi3#

head

名称

head -输出文件的第一部分

概要

head[ OPTION ].[ FILE ].

说明

将每个FILE的前10行打印到标准输出。对于多个FILE,在每个FILE前面都有一个标题,给出文件名。如果没有FILE,或者FILE为-,则读取标准输入。
多头期权的强制参数也是空头期权的强制参数。

-c--bytes= [-]N打印每个文件的前N个字节;以'-'开头,打印每个文件的所有字节,但不包括最后N个字节

zpqajqem

zpqajqem4#

你也可以grep这行,然后像这样剪切它:

grep 'text' filename | cut -c 1-5
mrfwxfqh

mrfwxfqh5#

head或tail也可以这样做:
头部-c X
打印文件的前X个字节(如果是UTF-16文件,则不一定是字符)。tail将做同样的事情,除了最后的X字节。
这(和削减)是便携式的。

ev7lccsx

ev7lccsx6#

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用于选择表头显示的最后一行。

yrwegjxp

yrwegjxp7#

我知道答案是对6年前一个问题的回答...
但我找了几个小时类似的东西,然后发现:cut -c正是这样做的,还有一个额外的好处,你也可以指定一个偏移量。

cut -c 1-5将返回Hellocut -c 7-11将返回world。不需要其他命令

wmvff8tz

wmvff8tz8#

尽管这个问题在几年前就被回答/接受了,但目前接受的答案只对每个字符一个字节的编码(如iso-8859-1)或可变字节字符集的单字节子集(如UTF-8中的拉丁字符)是正确的。即使使用多字节拼接,也只适用于像UTF-16这样的固定多字节编码。考虑到UTF-8正在成为一个通用的标准,并且当我们按照母语使用者的数量和this list of top 30 languages by native/secondary usage来查看这个语言列表时,有必要指出一个简单的可变字节字符友好(而不是基于字节)的技术,使用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”,但只是因为它可以用来指定任意偏移量的附带问题,而不是因为直接相关的字符与。bytes的问题
如果你的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专用)
mznpcxlj

mznpcxlj9#

下面是一个简单的脚本,它使用这里提到的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

相关问题