linux-文字處理-grep
grep
官方文件:https://man7.org/linux/man-pages/man1/grep.1.html
如果安裝了完整版的man手冊,使用info man
檢視詳細的手冊
示例使用的文字
cat greptxt.txt
whole word
word
abcword
abc abc word abc
wordabc asd
abc abc abcword
word*abc asd
word*
123
-e
指定多個匹配模式
匹配行中帶有123或者word的行,
grep*
表示當前資料夾下檔名以grep開頭的檔案
支援“basic” (BRE),“extended” (ERE) 和“perl” (PCRE)多個版本的正則表示式,如中括號[]
問號?
、星號*
、點.
、加號+
、大括號{}
等
引號
當所匹配的字元包含空格可以使用引號,單引號或雙引號都可以
grep -e "whole word" grep*
greptxt.txt:whole word
-f
執行正則匹配檔案
-i
忽略大小寫:ignore case
cat greptxt2.txt
abc 1234
aBC 123
Abc
grep -i abc greptxt2.txt
abc 1234
aBC 123
Abc
grep abc greptxt2.txt
abc 1234
grep預設不略大小寫,對應的命令是
--no-ignore-case
,-i
則忽略大小寫
-v
反向匹配:invert match
grep -v word greptxt.txt
123
匹配找不到指定單詞的行
-w
單詞正則表示式:word regexp
grep -w word greptxt.txt
whole word
word
abc abc word abc
word*abc asd
word*
匹配完整的單詞,單詞理解為:行首、行尾或行中,前後都不是單詞字元(即字元、數字、下劃線),所以示例中
*號
也可以選出來
-c
計算匹配的總數
grep -c word greptxt.txt 8 # 計算多個檔案匹配的總數 grep -c word grep* greptxt.txt:8 greptxt2.txt:0
返回匹配的總數,而不直接資料行內容
-l或-L
grep -L word grep*
greptxt2.txt
grep -l word grep*
greptxt.txt
-l
:返回匹配到指定字元的檔名稱
-L
:返回沒有匹配到指定字元的檔名稱
-m
指定匹配的最大數量:max count
grep -m 2 word greptxt.txt
whole word
word
這裡greptxt.txt原來能匹配到8行,指定max count為2後匹配到2行就退出
-o
只返回匹配的部分:only matching
grep -o w.*d greptxt.txt
whole word
word
word
word
wordabc asd
word
word*abc asd
word
這裡使用
.*
表示匹配任意字串,返回符合w.*d
的字串
-b
檔案偏移量:byte offset
grep -b w.*d greptxt.txt
0:whole word
12:word
18:abcword
27:abc abc word abc
45:wordabc asd
58:abc abc abcword
75:word*abc asd
89:word*
grep -o -b w.*d greptxt.txt
0:whole word
12:word
21:word
35:word
45:wordabc asd
69:word
75:word*abc asd
89:word
匹配到行時,先返回匹配到的所在行在檔案中的偏移量
如果指定
-o
, 則資料匹配到的字元的偏移量
-H
輸出檔名:with filename
grep -H abc greptxt.txt
greptxt.txt:abcword
greptxt.txt:abc abc word abc
greptxt.txt:wordabc asd
greptxt.txt:abc abc abcword
greptxt.txt:word*abc asd
如果有多個檔案,
-H
預設啟用
-n
輸出行號:line number
grep -n -e 'word' greptxt.txt
1:whole word
2:word
3:abcword
4:abc abc word abc
5:wordabc asd
6:abc abc abcword
7:word*abc asd
8:word*
輸出匹配到的行內容時,先輸入行號
-s
預設情況下,當遇到不可讀或者不存在的檔案時,會輸出相應的提示,如果加了-s
則不會列印相應的資訊
-r
遞迴遍歷所有目錄以及子目錄下的檔案
grep -n -e 'word' ../*
grep: ../antSword-master: Is a directory
grep: ../conf.d: Is a directory
grep: ../grep: Is a directory
Binary file ../nox_setup_v7.0.1.0_full_intl.exe matches
../頁面路徑資料.sql:17:(5, '忘記密碼-修改', '/login/change-password'),
../頁面路徑資料.sql:18:(6, '忘記密碼-發郵件', '/login/forgot-password'),
grep -n -s -e 'word' ../*
Binary file ../nox_setup_v7.0.1.0_full_intl.exe matches
../頁面路徑資料.sql:17:(5, '忘記密碼-修改', '/login/change-password'),
../頁面路徑資料.sql:18:(6, '忘記密碼-發郵件', '/login/forgot-password'),
grep -n -r -e 'word' ../*
# 資料太多不展示
../*
匹配上級目錄下所有檔案,預設情況不訪問資料夾
-R
遞迴遍歷所有目錄,包括符合連結symbolic links