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

问题描述 投票:0回答:9

linux中有没有像

cat
这样的命令可以从文件中返回指定数量的字符?

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

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

我想要返回前 5 个字符的东西,即“hello”。

谢谢

linux command-line
9个回答
231
投票

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



52
投票

例如,

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



12
投票

姓名

head - 输出文件的第一部分

剧情简介

头部

[选项]... [文件]... 描述

将每个文件的前 10 行打印到标准输出。如果有多个文件,请在每个文件之前添加一个给出文件名的标头。没有文件,或者当 FILE为-,读取标准输入。

长选项的强制参数对于短选项也是强制的。

-c
, --字节=[-]N 打印每个文件的前 N 个字节;以“-”开头,打印每个文件除最后 N 个字节之外的所有字节


4
投票

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



3
投票

头-c X

打印文件的前 X 个字节(如果是 UTF-16 文件则不一定是字符)。 tail 也会做同样的事情,除了最后 X 个字节。

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


3
投票
此脚本给出了特定行和位置的确切字符数,例如: 

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

给出第 5 行中的字符以及第 5 行的第 5 到 8 个字符,

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

    


3
投票

但是我花了几个小时寻找类似的东西,然后发现:

cut -c

正是这样做的,还有一个额外的好处,您还可以指定偏移量。

cut -c 1-5

将返回 Hellocut -c 7-11 将返回 world。不需要任何其他命令


2
投票
按母语人士数量列出的语言列表

按母语/次要使用情况列出的前 30 种语言列表时,这一点非常重要指出一种简单的可变字节字符友好(不是基于字节)技术,使用 cut -c

tr
/
sed
与字符类。
比较以下内容,由于关于字节与字符问题的两个常见的以拉丁语为中心的错误/假设(一个是

head

cut
,另一个是
[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 上的 
cut

tr
对我来说仍然在 UTF-8 中破坏了希腊语):
$ printf 'Πού μπορώ να μάθω σανσκριτικά;\n' | \
$     cut -c 1 | \
$     tr '[:upper:]' '[:lower:]'
π

另一个更新的答案已经提出了“cut”,但只是因为它可以用于指定任意偏移量的附带问题,而不是因为直接相关的字符与字节问题。

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

0
投票
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

© www.soinside.com 2019 - 2023. All rights reserved.