如何使用 Linux 的 grep 和 fgrep 命令
導讀 | 本文主要介紹使用 的 grep 和 fgrep 來贏得你最喜歡的基於單詞的猜測遊戲。下面是你如何使用 Linux 行來幫助你玩像 Wordle 這樣的猜測遊戲。 |
Linux 系統在 /usr/share/dict/words 檔案中儲存了一個單詞詞典。這是一個很長的純文字檔案。我的系統的單詞檔案裡有超過 479,800 個條目。該檔案既包含純文字,也包含專有名詞(名字、地點等等)。
為了開始我的第一次猜測,我只想得到一個長度正好是五個字母的純文字詞的列表。要做到這一點,我使用這個 grep 命令:
$ grep '^[a-z][a-z][a-z][a-z][a-z]$' /usr/share/dict/words > myguess
grep 命令使用正規表示式來進行搜尋。你可以用正規表示式做很多事情,但為了幫助我解決 Wordle 問題,我只需要基本的東西。^ 表示一行的開始,$ 表示一行的結束。在兩者之間,我指定了五個 [a-z] 的例項,表示從 a 到 z 的任何小寫字母。
我還可以使用 wc 命令來檢視我的可能單詞列表,“只有” 15,000 個單詞:
$ wc -l myguess 15034 myguess
從這個列表中,我隨機挑選了一個五個字母的單詞:acres。a 被設定為黃色,意味著該字母存在於神秘單詞的某處,但不在第一位置。其他字母是灰色的,所以我知道它們並不存在於今天的單詞中。
對於我的下一個猜測,我想得到一個包含 a 的所有單詞的列表,但不是在第一位置。我的列表也不應該包括字母 c、r、e 或 s。讓我們把這個問題分解成幾個步驟。
為了得到所有帶 a 的單詞的列表,我使用 fgrep(固定字串 grep)命令。fgrep 命令也像 grep 一樣搜尋文字,但不使用正規表示式:
$ fgrep a myguess > myguess2
這使我的下一個猜測的可能列表從 15,000 個字下降到 6,600 個字:
$ wc -l myguess myguess2 15034 myguess 6634 myguess2 21668 total
但是這個單詞列表中的第一個位置也有字母 a,這是我不想要的。遊戲已經表明字母 a 存在於其他位置。我可以用 grep 修改我的命令,以尋找在第一個位置包含其他字母的詞。這就把我可能的猜測縮小到了 5500 個單詞:
$ wc -l myguess myguess2 15034 myguess 6634 myguess2 21668 total
但我知道這個神秘的詞也不包括字母 c、r、e 或 s。我可以使用另一個 grep 命令,在搜尋中省略這些字母:
$ fgrep a myguess | grep '^[b-z]' | grep -v '[cres]' > myguess2 $ wc -l myguess myguess2 15034 myguess 1257 myguess2 16291 total
-v 選項意味著反轉搜尋,所以 grep 將只返回不符合正規表示式 [cres] 或單列字母 c、r、e 或 s 的行。有了這個額外的 grep 命令,我把下一個猜測的範圍大大縮小到只有 1200 個可能的單詞,這些單詞在某處有一個 a,但不在第一位置,並且不包含 c、r、e、或 s。
在檢視了這個列表後,我決定嘗試一下 balmy 這個詞。
我選擇 banal 作為我下一次猜測的可能的詞,而這恰好是正確的。
$ cat myguess3 babul bailo bakal bakli banal bauld baulk
這一次,字母 b 和 a 被高亮顯示為綠色,意味著我把這些字母放在了正確的位置。字母 l 是黃色的,所以這個字母存在於單詞的其他地方,但不是在那個位置。字母 m 和 y 是灰色的,所以我可以從我的下一個猜測中排除這些。
為了確定下一個可能的單詞列表,我可以使用另一組 grep 命令。我知道這個詞以 ba 開頭,所以我可以從這裡開始搜尋:
$ grep '^ba' myguess2 > myguess3 $ wc -l myguess3 77 myguess3
這隻有 77 個詞! 我可以進一步縮小範圍,尋找除第三位外還包含字母 l 的詞:
$ grep '^ba[^l]' myguess2 > myguess3 $ wc -l myguess3 61 myguess3
方括號 [^l] 內的 ^ 表示不是這個字母列表,即不是字母 l。這使我的可能單詞列表達到 61 個,並非所有的單詞都包含字母 l,我可以用另一個 grep 搜尋來消除這些單詞:
$ grep '^ba[^l]' myguess2 | fgrep l > myguess3 $ wc -l myguess3 10 myguess3
這些詞中有些可能包含字母 m 和 y,而這些字母並不在今天的神秘詞中。我可以再進行一次反轉 grep 搜尋,將它們從我的猜測列表中刪除:
$ grep '^ba[^l]' myguess2 | fgrep l | grep -v '[my]' > myguess3 $ wc -l myguess3 7 myguess3
我的可能的單詞列表現在非常短,只有七個單詞!
我選擇 banal 作為我下一次猜測的可能的詞,而這恰好是正確的。
Linux 的命令列提供了強大的工具來幫助你完成實際工作。grep 和 fgrep 命令在掃描單詞列表方面提供了極大的靈活性。對於一個基於單詞的猜測遊戲,grep 幫助識別了一個包含 15000 個可能的單詞的列表。在猜測並知道哪些字母出現在神秘的單詞中,哪些沒有,grep 和 fgrep 幫助將選項縮小到 1200 個單詞,然後只剩下 7 個單詞。這就是命令列的力量。
原文來自:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2877195/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Linux grep命令的使用Linux
- Linux grep命令有何作用?如何使用?Linux
- 如何使用grep命令的排除功能
- 【Linux命令】grep命令Linux
- Linux grep命令如何使用?語法格式是什麼?Linux
- Linux grep 命令Linux
- 【Linux】grep命令Linux
- grep命令使用
- Linux Grep命令使用的詳細介紹Linux
- Linux命令篇 - grep 命令Linux
- Linux系統中的管道命令、grep命令、sed命令和awk命令Linux
- Linux grep命令和正規表示式Linux
- linux命令之grepLinux
- linux每日命令(35):grep命令Linux
- Linux命令:grep命令AND、OR、NOT例項Linux
- 在Linux中,如何使用grep命令查詢檔案中的內容?Linux
- Linux系統中grep如何使用?Linux
- Linux基礎命令---grepLinux
- linux grep命令詳解Linux
- linux命令: ps,grep,killLinux
- Linux命令grep詳解Linux
- 14 個 Linux grep 命令的例子Linux
- Linux 中grep命令如何匹配中文字元Linux字元
- grep 命令系列:使用 grep 命令來搜尋多個單詞
- Linux grep命令詳細教程Linux
- 掌握Linux中的12個grep命令Linux
- grep命令的-o和-P選項
- 管道命令grep , egrep的使用例子 -v
- 5分鐘學會使用Linux的 grep、find、ls、wc 命令Linux
- 15個Linux Grep命令使用例項(實用、常用)Linux
- linux下的find 和 grepLinux
- grep命令
- Linux 常用基本命令 cat grepLinux
- 『學了就忘』Linux基礎命令 — 31、grep命令和萬用字元Linux字元
- Windows 系統下使用grep 命令Windows
- Linux 中 grep 命令的 12 個實踐例子Linux
- Linux 中grep命令中 -P選項的作用Linux
- Linux常用命令記錄-grepLinux