Stories

Detail Return Return

grep命令真的是一夜間就寫好了?grep為什麼叫grep? - Stories Detail

大家好,今天聊一個程序員都繞不開的命令:grep

只用過 findstr 或 Select-String 的 Windows 寶子們可以下車嘍,拜拜~

説起 grep,大多數程序員腦海裏浮現的應該是終端上的一行命令,或單獨使用,或接入管道(|),或多次“自身接龍”(... | grep ... | grep ...),然後一堆結果就“唰”地跳出來。既可用於日誌分析,又能用來搜索代碼,grep 已經成了 Unix 世界裏最具代表性的工具之一。

Unix 的管道

但你知道嗎?關於 grep 的起源,有個“一夜而就”的傳説。

故事要追溯到 1970 年代初,Unix 還是萌芽期的時代。

那時, Unix 上的標準文本編輯器是 Unix 的締造者之一 Ken Thompson 寫的 ed。雖然 ed 是最早一批支持正則表達式的行編輯器之一,但它有個致命問題:只有把整個文件讀進內存後才能操作。因此,在當年那點可憐的內存面前,幾十 KB 的文本就已經讓 ed 吃不消,更別説去分析成百上千頁的文稿了。

屏幕式編輯器(如 vi、nano)出現之前,用户只能使用行編輯器(line editor)。在 1960–70 年代,操作計算機的工具是電傳打字機 —— 一種帶鍵盤的低速打印機 —— 沒有顯示屏,也無法在文本中自由移動光標。於是,行編輯器的操作就以“行”為單位,每條命令作用於一行或多行文本。

電傳打字機

Ken 的同事 Lee McMahon 是個語言學家,他當時在研究一件大事:通過文本分析,判斷美國《聯邦黨人文集》(_The Federalist Papers_)的確切作者。這些文集共有 85 篇,署名是“_Publius_”,究竟哪篇是誰寫的,一直是學界爭論的焦點。

McMahon 想用計算機分析這些文檔中的模式,看看能不能找出一些語言學上的規律。問題是:這 85 篇文檔加起來超過了 1 MB —— 以今天的標準來看幾乎微不足道 —— 但當時的計算機內存根本放不下。

於是他找到 Ken Thompson,提了個需求:

“嗨,我只想在這些文章裏找出那些包含某個詞的行,別的啥都不要。能不能搞個工具?”

Ken 點點頭,“行,我回頭搞一個”。

一夜過去。

沒想到第二天,Ken 就已經把寫好的程序交給 McMahon 了。這個小工具能在一個或多個文件裏,順序掃描所有內容,把匹配正則表達式的行找出來。這個小工具的名字正是 grep

於是就有了 grep 是 Ken 一夜之間寫出來的傳説。

其實,Ken 並不是“熬了一夜爆肝”從零開始寫 grep 的。他早就寫過個叫 s 的私人工具,用來做與 grep 類似的事情。McMahon 來提需求時,Ken 只是花些時間,把代碼修修補補一番,以便跑得更穩健,然後就交了出去。

他只是用這些積木迅速重新拼湊出另一個程序

所以“grep 是一夜之間寫出來的”這個傳説,嚴格來説有點誇張。更真實的情況是:Ken 手頭已經有了現成的代碼積木,他只是用這些積木迅速重新拼湊出另一個程序,並換了個更有趣的名字。

那 grep 這個名字又是怎麼來的呢?為什麼不直接用 search、find 這種明顯表示“查找、搜索”的詞呢?

還是要回到 ed 編輯器裏去找答案。原來在 ed 編輯器裏有個命令:

g/<re>/p

意思是:全局搜索(globally)匹配正則表達式(<re>)的行,並把這些行都打印(print)出來。

Ken 把這串命令縮成一個詞:grep。而 grep 也由此成了 Unix 世界中從文本中搜索關鍵詞最自然的表達。


McMahon 拿到工具後,順利地開展了文本分析。而 grep 本身,則被收錄進了 Unix 第四版,逐漸成為“Unix 哲學”的象徵:

寫一個小而精的工具,做好一件事

🔚

user avatar u_16776161 Avatar openfuyao Avatar u_15591470 Avatar u_15316473 Avatar u_16231477 Avatar u_15214399 Avatar lab4ai Avatar zhuifengdekukafei Avatar null_null_null Avatar
Favorites 9 users favorite the story!
Favorites

Add a new Comments

Some HTML is okay.