天天看點

grep指令

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

    確定标準輸入在退出之前定位到最後一個比對行之後,而不管是否存在後續上下文行。這使調用程序能夠繼續(恢複)搜尋,當

    grep

    在NUM個比對行之後停止時,它輸出任何後面的上下文行。當

    -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/