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

有没有像Linux中的cat可以从文件返回指定数量的字符的命令?

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

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

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

谢谢

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 

你可以使用dd来提取任意的字节块。

例如,

 dd skip=1234 count=5 bs=1 

将从input到输出复制字节1235到1239,并丢弃其余部分。

要从标准input中获得前五个字节,请执行:

 dd count=5 bs=1 

请注意,如果你想指定input文件名,dd有老式的参数parsing,所以你会这样做:

 dd count=5 bs=1 if=filename 

还要注意的是,dd详细地宣布它做了什么,所以把它扔掉,做:

 dd count=5 bs=1 2>&- 

要么

 dd count=5 bs=1 2>/dev/null 

头 :

名称

头部 – 输出文件的第一部分

概要

[ 选项 ] … [ 文件 ] …

描述

将每个FILE的前10行打印到标准输出。 有多个文件,每个文件名前面都有一个标题。 如果没有FILE,或者FILE是 – 读取标准input。

长选项的强制性参数也是短期选项的强制性参数。
-c ,– bytes = [ – ] N打印每个文件的前N个字节; 用“ – ”开头,打印每个文件的最后N个字节

 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用于select头部显示的最后一行。

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

头-c X

打印文件的前X个字节(不一定是字符,如果它是UTF-16文件的话)。 除了最后的X字节之外,尾部也会这样做。

这(和削减)是便携式的。

你也可以把这条线弄出来然后像下面这样剪掉它:

grep'text'文件名| 切-c 1-5

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

但是我正在寻找类似的东西几个小时,然后发现: cut -c完全是这样,还有一个额外的好处,你也可以指定一个偏移量。

cut -c 1-5将返回你好切-c 7-11将返回世界 。 不需要任何其他命令

尽pipe多年前这已被回答/接受,但目前接受的答案仅适用于每字符一个字节的编码,如iso-8859-1,或者可变字节字符集的单字节子集(如拉丁字符在UTF-8内)。 即使使用多字节拼接,也只能用于固定多字节编码,如UTF-16。 鉴于现在UTF-8正在成为一种通用标准,并且在按照母语人群和本地/次要使用情况排列的前30种语言列表中查看这些语言列表时 ,重要的是要指出简单的可变字节友好字符(不是基于字节的)技术,使用cut -ctr / sed以及字符类。

比较由于两个常见的以拉丁语为中心的错误/关于字节和字符问题的假设(一个是headcut ,另一个是[az][AZ] vs. [:upper:][:lower:] ):

 $ printf 'Πού μπορώ να μάθω σανσκριτικά;\n' | \ $ head -c 1 | \ $ sed -e 's/[AZ]/[az]/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字符”(用你的编号replaceX ),你可以试试:

  • sed -E -e '1 s/^(.{X}).*$/\1/' -eqsed -E -e '1 s/^(.{X}).*$/\1/' -eq – 尽pipe限于第一行
  • head -n 1 | grep -E -o '^.{X}' 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: XY {FILE} eg 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