Grep

你如何使用’grep –fixed-strings'

  • July 2, 2022

的一部分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、點、星號和 a b,而不是正則表達式解釋,它會是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一起只會找到完全匹配的行,無論它們包含什麼特殊字元。

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