Cat

字元串命令是否等同於非二進製文件上的 cat ?

  • April 23, 2021

這可能是一個愚蠢的問題,或者只是答案可能沒有幫助——但我很好奇。看起來strings命令和cat命令在非二進製文件上是等效的。這是真的?strings或者在所有文件類型上使用有一些注意事項嗎?

預設情況下strings,查找至少包含四個可列印字元的字元串。試試echo abc | strings。我相信還有更細微的差異。因此,標題中問題的答案是“否”。

此外,這兩個命令有不同的用途和一系列不同的命令行選項,這使得它們非常不等效。

當然它們不是等價的。這是一個普通文本文件的例子

**$ 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但在 GNUstrings中可以通過--encoding選項正確輸出

除了strings查找可列印字元(0x20-0x7E),因此帶有控製字元(如垂直製表符(0x0B))的文件將具有不同的輸出

**$ echo -e "abcd\x0bcdef" | 字元串**
A B C D
定義
**$ echo -e "abcd\x0bcdef" | 貓**
A B C D
定義

還有許多選項可以產生不同的輸出,例如-oor -tinstrings-benstvincat

另一個區別是strings預設情況下查找長度至少為 4 個字元的字元串,如另一個答案中所述

GNU strings

對於給定的每個文件,GNU 字元串列印至少 4 個字元長(或下面的選項給出的數字)的可列印字元序列,然後是不可列印的字元。

macOS strings

Strings 在二進製文件或標準輸入中查找 ASCII 字元串。字元串對於辨識隨機對象文件和許多其他東西很有用。字元串是 4 個(預設)或更多列印字元的任意序列

$$ ending at, but not including, any other character or EOF $$. 除非給出 - 標誌,否則字元串會在目標文件的所有部分中查找,除了 ( __TEXT, __text) 部分。如果沒有指定文件,則讀取標準輸入

引用自:https://unix.stackexchange.com/questions/646325