从 cat 命令中获取前 X 个字符?

jkj*_*000 72 cut cat

我有一个文本文件要输出到我的 shell 脚本中的一个变量。但是,我只需要前 50 个字符。

我试过使用,cat ${filename} cut -c1-50但我得到的远远超过前 50 个字符?这可能是由于cut寻找行(不是 100% 确定),而此文本文件可能是一个长字符串——这确实取决于。

是否有一个实用程序可以让我通过管道从cat命令中获取前 X 个字符?

Dis*_*ame 94

head -c 50 file
Run Code Online (Sandbox Code Playgroud)

这将返回前 50 个字节。

请注意,该命令并不总是在所有操作系统上实现相同。在 Linux 和 macOS 上,它的行为是这样的。在 Solaris (11) 上,您需要使用 /usr/gnu/bin/ 中的 gnu 版本

  • 请注意,此答案假定文件仅包含 ASCII 字符,因为 OP 要求输入前 X 个字符,而不是字节。 (7认同)
  • @mirabilos 它可能不可移植,但我的版本(`GNU coreutils 5.97`)可以。 (3认同)

ter*_*don 36

cut如果您使用管道将数据传递给它,您的命令将起作用:

cat ${file} | cut -c1-50 
Run Code Online (Sandbox Code Playgroud)

或者,避免无用地使用 cat 并使其更安全:

cut -c1-50 < "$file"
Run Code Online (Sandbox Code Playgroud)

请注意,上面的命令将打印每个输入 line的前 50 个字符(或字节,取决于您的cut实现)。如果像您所说的那样,您的文件是一大行,它应该按照您的预期执行。


don*_*l24 9

dd status=none bs=1 count=50 if=${filename}
Run Code Online (Sandbox Code Playgroud)

这将返回前 50 个字节。

  • @mirabilos dd 在使用 Ubuntu 14.04、coreutils 8.21 时确实有 `status=none`,但如果使用早期版本,则使用 `2&gt;/dev/null` 是正确的。 (2认同)
  • 不,Unix 系统通常不使用 GNU 实用程序。GNU 甚至是“GNU 不是 Unix”的首字母缩写词。请坚持使用可移植的解决方案,或者,如果您*必须* 提供仅限 GNU 的解决方案,请说明,如果可能,请显示等效的便携式解决方案。 (2认同)

Cal*_*imo 5

到目前为止,大多数答案都假定 1 个字节 = 1 个字符,如果您使用的是非 ASCII 语言环境,则情况可能并非如此。

一个稍微更健壮的方法来做到这一点:

testString=$(head -c 200 < "${filename}") &&
  printf '%s\n' "${testString:0:50}"
Run Code Online (Sandbox Code Playgroud)

请注意,这假设:

  1. 您正在使用ksh93, bash(或最近的zshor mksh(尽管唯一支持的多字节字符集mksh是 UTF-8 并且仅在 之后set -o utf8-mode))和head支持的版本-c(现在大多数都这样做,但不是严格标准)。
  2. 当前语言环境设置为与文件相同的编码(键入locale charmapfile -- "$filename"检查);如果没有,请使用 ie 进行设置。LC_ALL=en_US.UTF-8)
  3. head假设最坏的情况是 UTF-8,其中所有字符最多编码为 4 个字节,我使用了文件的前 200 个字节。这应该涵盖我能想到的大多数情况。