你如何使用’grep –fixed-strings'
的一部分
grep --help
是:-E, --extended-regexp PATTERNS are extended regular expressions -F, --fixed-strings PATTERNS are strings
網上有很多例子,
-E
但我找不到-F
我對正則表達式不是很好,如果可能的話,盡量避免它,所以這
-F
看起來是一個更好的選擇。grep 的語法是什麼,看看它是否包含 3 個不同的字元串?
要獲取
test.txt
至少包含一個字元串hello
或的行goodbye
,您可以使用:grep -F -e hello -e goodbye test.txt
也就是說,要查找的模式作為
-e
選項的參數給出,並且-F
選項告訴將它們視為固定字元串。好吧,這與上述無關,但例如,像這樣的模式a.*b
會尋找a
、點、星號和 ab
,而不是正則表達式解釋,它會是a
以及b
介於兩者之間的任何東西。或者,您可以將查找的字元串放在一個文件中,每行一個,並使用
-f
選項提供文件名:$ grep -F -f patterns.txt test.txt you say hello when you arrive goodbye when you leave but rarely say hello and goodbye at the same time
(請注意,執行“所有給定字元串”測試會更加困難。即使使用正則表達式也相當尷尬。)
如您所述,
-F
選項 or--fixed-string
禁用正則表達式引擎並蒐索文字字元串。尋找有效的正則表達式的字元串很有用,但它們本身俱有不同的含義。例如:grep -Fe '[warn]' app.log
該
[warn]
模式是有效的基本正則表達式 (BRE
),因此如果沒有該-F
選項,將搜尋並擷取任何包含、、或grep
中至少一個的行。(注意括號在 shell 中也是特殊的,所以我們需要在命令行中引用它們。)w``a``r``n
舉個例子,假設我們想從如下的日誌文件中找到錯誤消息,其中包含如下行(因此,帶有
[err]
標記的行):[info] terrace lights on [err] garage door control not responding
Using將匹配兩行,因為“t err ace”
grep 'err'
這個詞有一個命中。也將匹配兩行,因為兩者都有一個“e”(和一個“r”)。但在這裡,將是一種將匹配限制為僅標籤的簡單方法。(或者,可以使用預設的正則表達式匹配並轉義括號:,或什至。但這更難看。)grep '[err]'``grep -F '[err]'``grep -e '\[err\]'``grep -e '[[]err[]]'``grep '[[]err]'
如果您有更多模式要搜尋,您可以
-e
多次使用該選項:grep -F -e '[warn]' -e '[debug]' -e '[err]' app.log
匹配任何模式(至少一個)的行將被匹配。
,選項在這種情況下也很有用,因為它意味著如果整行與模式匹配,它只會將一行視為匹配
-x
。--line-regex
例如,如果一行是,grep -x foo
則匹配,foo
但如果該行是,則不匹配foobar
。並且-Fx
一起只會找到完全匹配的行,無論它們包含什麼特殊字元。