这可能是一个愚蠢的问题,或者只是答案可能没有帮助——但我很好奇。看起来该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
还有许多选项可以产生不同的输出,例如-o
or -t
instrings
或-benstv
incat
另一个区别是strings
默认情况下查找至少 4 个字符长的字符串,如另一个答案中所述
GNU strings
:
对于给定的每个文件,GNU 字符串打印至少 4 个字符长(或通过以下选项给出的数字)的可打印字符序列,后跟一个不可打印字符。
苹果系统strings
:
字符串在二进制文件或标准输入中查找 ASCII 字符串。字符串对于识别随机对象文件和许多其他东西很有用。字符串是 4 个(默认)或更多打印字符的任何序列 [以任何其他字符或 EOF 结尾,但不包括任何其他字符或 EOF]。除非给出 - 标志,否则字符串将在目标文件的所有部分中查找,除了 (
__TEXT
,__text
) 部分。如果未指定文件,则读取标准输入