grep指令
grep
指令用于查找檔案裡符合條件的字元串,如果發現某檔案的内容符合所指定的模式,
grep
指令會把含有模式的那一行顯示出來。若不指定任何檔案名稱,或是所給予的檔案名為
-
,則
grep
指令會從标準輸入裝置讀取資料。
文法
grep [OPTION]... PATTERN [FILE]...
參數
-
: 在比對行之後列印尾部上下文的-A NUM, --after-context=NUM
行,在相鄰的比對組之間放置包含NUM
的行。--
-
: 像處理文本一樣處理二進制檔案,這相當于-a, --text
選項。--binary files=text
-
: 在比對行之前列印前導上下文的-B NUM, --before-context=NUM
NUM
--
-
: 列印輸出上下文的-C NUM, --context=NUM
NUM
--
-
: 列印輸入檔案中每行輸出之前的位元組偏移量。-b, --byte-offset
-
: 如果檔案的前幾個位元組訓示該檔案包含二進制資料,則假定該檔案為類型類型。預設情況下,--binary-files=TYPE
是TYPE
,binary
通常輸出一行消息,說明二進制檔案比對,或者不輸出消息(如果不比對)。如果grep
不比對,TYPE
假設二進制檔案不比對,這相當于grep
選項。如果-I
TYPE
text
會像處理文本一樣處理二進制檔案,這相當于grep
選項。此外-a
可能會輸出二進制垃圾,如果輸出是終端,并且終端驅動程式将其中的一些解釋為指令,則會産生嚴重的副作用。grep--binary files=text
-
: 在比對字元串周圍加上标記--colour[=WHEN], --color[=WHEN]
環境變量,find in GREP_COLOR
可以是WHEN
、never
always
。auto
-
: 禁止正常輸出,而是為每個輸入檔案列印比對行的計數,使用-c, --count
選項,計算不比對的行數。-v,--invert match
-
: 如果輸入檔案是裝置、-D ACTION, --devices=ACTION
或套接字,使用FIFO
來處理它。預設情況下,ACTION
ACTION
,這意味着裝置的讀取就像它們是普通檔案一樣,如果read
為ACTION
,則裝置将自動跳過。skip
-
: 如果輸入檔案是目錄,使用-d ACTION, --directories=ACTION
ACTION
ACTION
,這意味着目錄的讀取就像它們是普通檔案一樣,如果read
ACTION
,則目錄将被自動跳過,如果skip
是遞歸的,ACTION
将遞歸地讀取每個目錄下的所有檔案,這相當于grep
-r
-
: 将模式解釋為擴充的正規表達式。-E, --extended-regexp
-
: 使用-e PATTERN, --regexp=PATTERN
作為模式,用于保護以PATTERN
開頭的模式。-
-
: 将-F, --fixed-strings
解釋為固定字元串的清單,用換行符分隔,這些字元串可以比對。PATTERN
-
-P, --perl-regexp
解釋為PATTERN
正規表達式。Perl
-
: 從-f FILE, --file=FILE
擷取模式,每行一個,空檔案包含零個模式,是以不比對。FILE
-
-G, --basic-regexp
解釋為基本正規表達式,這是預設值。PATTERN
-
: 列印每個比對項的檔案名。-H, --with-filename
-
: 當搜尋多個檔案時,禁止在輸出中使用檔案名字首。-h, --no-filename
-
: 顯示幫助檔案。--help
-
: 處理二進制檔案,就像它不包含比對資料一樣,這相當于-I
--binary-files=without-match
-
: 忽略-i, --ignore-case
和輸入檔案中的大小寫差別。PATTERN
-
: 禁止正常輸出,而是列印通常不會從中列印輸出的每個輸入檔案的名稱,掃描将在第一個比對時停止。-L, --files-without-match
-
: 禁止正常輸出,而是列印通常從中列印輸出的每個輸入檔案的名稱,掃描将在第一個比對時停止。-l, --files-with-matches
-
: 在比對行數之後停止讀取檔案。如果輸入是來自正常檔案的标準輸入,并且輸出-m NUM, --max-count=NUM
個比對行,NUM
確定标準輸入在退出之前定位到最後一個比對行之後,而不管是否存在後續上下文行。這使調用程序能夠繼續(恢複)搜尋,當grep
在NUM個比對行之後停止時,它輸出任何後面的上下文行。當grep
或-c
選項也被使用時,--count
不會輸出大于grep
的計數。當NUM
-v
--invert match
會在輸出grep
個不比對的行之後停止。NUM
-
: 如果可能,使用--mmap
系統調用來讀取輸入,而不是預設的讀取系統調用。在某些情況下,mmap
可以産生更好的性能。但是,如果在--mmap
操作時輸入檔案收縮,或者發生grep
錯誤,那麼I/O
可能會導緻未定義的行為(包括核心轉儲)。--mmap
-
: 在輸出的每一行前面加上輸入檔案中的行号。-n, --line-number
-
: 隻顯示比對行中與模式比對的部分。-o, --only-matching
-
: 将實際來自标準輸入的輸入顯示為來自檔案--label=LABEL
的輸入。這對于LABEL
之類的工具尤其有用,例如zgrep
gzip -cd foo.gz | grep -H --label = foo
-
: 使用行緩沖,這可能會導緻性能損失。--line-buffered
-
: 保持安靜,不向标準輸出寫入任何内容。如果找到任何比對項,即使檢測到錯誤,也立即退出,狀态為零。-q, --quiet, --silent
-
: 遞歸地讀取每個目錄下的所有檔案,這相當于-R, -r, --recursive
-d recurse
-
: 禁止顯示有關不存在或不可讀檔案的錯誤消息。-s, --no-messages
-
: 将檔案視為二進制檔案。預設情況下,在-U, --binary
和MS-DOS
下,MS Windows
通過檢視從檔案中讀取的第一個grep
的内容來猜測檔案類型。如果32KB
确定檔案是文本檔案,它将從原始檔案内容中删除grep
字元(以使帶有CR
^
的正規表達式正常工作)。指定$
會推翻這種猜測,導緻讀取所有檔案并逐字傳遞給比對機制,如果檔案是一個文本檔案,每行末尾都有-U
對,這将導緻某些正規表達式失敗。此選項對CR/LF
MS-DOS
以外的平台無效。MS Windows
-
: 報告-u, --unix-byte-offsets
樣式的位元組偏移量,此開關使Unix
報告位元組偏移,就好像該檔案是grep
樣式的文本檔案一樣,即去除了Unix
字元。這将産生與在CR
機器上運作Unix
相同的結果,除非也使用grep
選項,否則該選項無效。它對除-b
MS-DOS
以外的平台沒有影響。MS-Windows
-
: 輸出版本資訊。-V, --version
-
: 反轉比對的意義,以選擇不比對的行。-v, --invert-match
-
: 隻選擇與表單中包含的單詞比對的行。測試是比對的子串必須在行的開頭,或者前面有非單詞組成字元,同樣,它必須位于行的末尾,或者後跟非單詞組成字元。單詞組成字元是字母、數字和下劃線。-w, --word-regexp
-
: 僅選擇與整行完全比對的那些比對項。-x, --line-regexp
-
: 輸出零位元組(-Z, --null
字元),而不是通常在檔案名後的字元。例如ASCII NULL
在每個檔案名之後輸出一個零位元組,而不是通常的換行符。即使存在包含不尋常字元(例如換行符)的檔案名,此選項也可以使輸出明确。此選項可與grep -lZ
find -print0
perl -0
sort -z
等指令一起使用,以處理任意檔案名,即使是包含換行符的檔案名。xargs -0
示例
hello.c
檔案内容如下:
#include <stdio.h>
#include <stdlib.h>
int main() {
printf("Hello World\n");
printf("Hello World\n");
printf("Hello World\n");
return 0;
}
比對帶有
Hello
grep Hello hello.c
# printf("Hello World\n");
# printf("Hello World\n");
# printf("Hello World\n");
Hello
行的數量。
grep -c Hello hello.c
# 3
反轉比對的意義,選擇不比對
Hello
grep -v Hello hello.c
# #include <stdio.h>
# #include <stdlib.h>
#
# int main() {
# return 0;
# }
i
的行并忽略大小寫。
grep -i I hello.c
# #include <stdio.h>
# #include <stdlib.h>
# int main() {
# printf("Hello World\n");
# printf("Hello World\n");
# printf("Hello World\n");
僅輸出與檔案整行比對的行。
grep -x " return 0;" hello.c
# return 0;
Hello
的行并輸出行号。
grep -n Hello hello.c
# 5: printf("Hello World\n");
# 6: printf("Hello World\n");
# 7: printf("Hello World\n");
遞歸比對目前目錄下所有檔案中能夠比對
h*
的檔案,輸出行号并忽略大小寫,注意實際在終端中比對成功的位置會使用紅色字型标注。
grep -rni "h*" ./
# ./hello.c:1:#include <stdio.h>
# ./hello.c:2:#include <stdlib.h>
# ./hello.c:3:
# ./hello.c:4:int main() {
# ./hello.c:5: printf("Hello World\n");
# ./hello.c:6: printf("Hello World\n");
# ./hello.c:7: printf("Hello World\n");
# ./hello.c:8: return 0;
# ./hello.c:9:}
每日一題
https://github.com/WindrunnerMax/EveryDay
參考
https://www.runoob.com/linux/linux-comm-grep.html
https://www.tutorialspoint.com/unix_commands/grep.htm
https://www.geeksforgeeks.org/fold-command-in-linux-with-examples/