strings 命令相当于非二进制文件上的 cat 吗?

strings 命令相当于非二进制文件上的 cat 吗?

这可能是一个愚蠢的问题,或者只是答案可能没有帮助——但我很好奇。看起来该strings命令和该cat命令在非二进制文件上是等效的。这是真的?或者strings在所有文件类型上使用时是否有一些注意事项?

答案1

默认情况下strings查找至少包含四个可打印字符的字符串。尝试echo abc | strings。我确信还有更细微的差异。所以,标题问题的答案是“否”。

此外,这两个命令具有不同的用途和一系列不同的命令行选项,这使得它们非常不等效。

答案2

当然它们并不等同。这是一个普通文本文件的示例

$ cat file_with_newline_at_the_end
换行



另一条线


$ 字符串 file_with_newline_at_the_end
换行
另一条线
$ cat file_without_newline_at_the_end

正如您所看到的,strings只需忽略空白行,但 cat 默认情况下只是将整个字节流传递到终端。这也意味着cat什么都不知道,也不关心文件编码,但strings确实关心。默认情况下,strings仅查找 7 位 ASCII 字符,因此字节大于 0x7F 的字符串将产生不同的输出。 UTF-16 和 UTF-32 文件也无法使用,但可以使用该选项cat在 GNU 中正确输出strings--encoding

除了strings寻找可打印字符(0x20-0x7E) 因此带有垂直制表符 (0x0B) 等控制字符的文件将具有不同的输出

$ echo -e "abcd\x0bcdef" | $ echo -e "abcd\x0bcdef" |字符串
A B C D
cdf
$ echo -e "abcd\x0bcdef" | $ echo -e "abcd\x0bcdef" |猫
A B C D
    cdf

还有许多选项可以产生不同的输出,例如-oor -tinstrings-benstvincat

另一个区别是strings默认情况下查找至少 4 个字符长的字符串,如另一个答案中所述

GNU strings

对于给定的每个文件,GNU 字符串打印至少 4 个字符长(或通过以下选项给出的数字)的可打印字符序列,后跟一个不可打印字符。

苹果系统strings

字符串在二进制文件或标准输入中查找 ASCII 字符串。字符串对于识别随机对象文件和许多其他东西很有用。字符串是 4 个(默认)或更多打印字符的任何序列 [以任何其他字符或 EOF 结尾,但不包括任何其他字符或 EOF]。除非给出 - 标志,否则字符串将在目标文件的所有部分中查找,除了 ( __TEXT, __text) 部分。如果未指定文件,则读取标准输入

相关内容