1. 程式人生 > 其它 >linux-文字處理-grep

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