Linux文字處理之搜尋命令 grep詳解

2021-10-25 05:39:49 字數 3164 閱讀 4342

目錄

grep介紹

一、祖傳搭配

二、語法引數

1.語法

第一部分  [-abcef..]

第二部分   abc引數

第三部分 範本樣式

第四部分 文字

2.常用引數

3.常見搭配

字串提取與 -p引數

\k 代表含義

三、總結

查詢檔案裡符合條件的字串

這裡先列舉出常用的搭配,用熟了後可以不過腦子直接寫出

grep -i "abc"                      # 忽略大小寫

grep -w "abc" # 完全匹配

grep -v "xx" # 不包含某項 即反選

grep -e "word1" -e "word2" # 多條件滿足任意

grep -po '"code":\k\d+' # 提取字串需要提取的字元前加\k

grep [-abcefghhillnqrsvvwxy]

[-abc《顯示行數》][-d《進行動作》]

[-e《範本樣式》][-f《範本檔案》][範本樣式]

[檔案或目錄...]

語法解析

我們按行區分,每行都有代表的意思,詳解如下:

就是常規引數,引數自解釋不用帶value

和linux文字輸出類的命令(如tail、head)一樣

a代表after-context      長引數可用  --after-context=《顯示行數》

b代表before-context   長引數可用  --before-context=《顯示行數》

b代表context簡寫-c=《顯示行數》長引數可用--context=《顯示行數》

-e 後接 範本樣式,就是匹配模式,加不加這個引數都可

-f   如果匹配模式比較複雜,可以寫到檔案裡。這個引數和 sed、awk含義相同

最後也就是我們的待匹配的文字了

這裡只介紹部分常用的

-i   --ignore-case忽略字元大小寫的差別

-o   --only-matching只顯示匹配pattern 部分

-v   --invert-match顯示不包含匹配文字的所有行

-e --extended-regexp將樣式為延伸的正規表示式來使用

-g --basic-regexp將樣式視為普通的表示法來使用

這裡給出常見的幾種需求

1、多條件滿足任意一項即可

echo "word2" | grep -e "word1|word2|word3" # 結果匹配

echo "word3" | grep -e "word1|word2|word3" # 結果匹配

echo "word2" | grep -e "word1" -e "word2" -e "word3" # 或者直接接多個條件 結果匹配

2、多條件同時滿足才匹配

echo "word1 word2 word3" |grep word1 |grep word2 |grep word3 # 匹配

echo "word1 word2 word4" |grep word1 |grep word2 |grep word3 # 不匹配

3、完全匹配

echo "abcfd" |grep "abc" # 普通模式 結果匹配

echo "abcfd" |grep -w "abc" # 全匹配 結果不匹配

echo "abcfd" |grep -w "abcf[a-z]" # 全匹配 最後乙個需要時小寫字元 結果匹配

4、只輸出匹配的部分

$ echo "abcfd" |grep -o "abc" # 普通模式 結果匹配

abc

-o可以只列印我們匹配的結果,但如果我們邏輯複雜一些,需要匹配到字元然後從中提取所需字元怎麼辦呢?

可就是只想提取我們匹配的中一部分

如果我們只需json格式 code對應的數字,如下:

$ echo '' | grep -po '"code":\k\d+'

100$ echo '' | grep -eo '"code":\d+' # 無輸出

$

第二個語句在centos 7、ubuntu環境下沒有任何輸出

但為什麼-p可以匹配?它代表什麼含義呢?正規表示式是支援\d匹配數字的寫法的啊?!

原來這和系統所使用的正規表示式引擎有關

當時在centos下面,grep -e主要是用來支援擴充套件正規表示式,比如|、&這些符號,用於grep多條件查詢,並非是使用標準正規表示式。在shell下面man grep看了下,加上-p(使用perl的正則引擎)即可過濾出目標資料

但是在mac os下面man grep是可以不適用-p引數的,為什麼?因為新的主流正則引擎已經預設加上了-p引數了

\k 是 (?<=pattern) 更高效的簡寫,在所需斷言的語句前加上可以

(?<=pattern) 是正則比較高階的寫法,這裡坐下簡單解釋:

首先()表示捕獲分組,()會把每個分組裡的匹配的值儲存起來,從左向右,以分組的左括號為標誌,第乙個出現的分組的組號為1,第二個為2,以此類推

(?<=pattern) 代表反向(look behind)肯定預查,就是捕獲以pattern開頭的內容***

例如,"(?<=95|98|nt|2000)windows"   能匹配"2000windows"中的"windows",但不能匹配"3.1windows"中的"windows"

也就是說"windows" 的匹配依賴於它前面的型號是否能匹配上,只有型號和"windows"字元都匹配了才能匹配

Linux文字處理命令

4 linux文字處理命令sort命令 sort命令的功能是對檔案中的各行進行排序。sort命令有許多非常實用的選項,這些選項最初是用來對資料庫格式的檔案內容進行各種排序操作的。實際上,sort命令可以被認為是乙個非常強大的資料管理工具,用來管理內容類似資料庫記錄的檔案。sort命令將逐行對檔案中的...

Linux文字處理命令

1.tac 它和cat是反的,倒著輸出,先輸出最後一行,接著是倒數第二行,最後輸出的是第一行 2.rev reverse 先輸出最後乙個字元,接著是倒數第二個字元,最後才是第乙個字元,下面這個命令可以把輸入全部倒過來 tac f.txt rev 3.head 只顯示文字的開頭幾行,比如 head 2...

linux文字處理命令

sed grep find xargs 1.替換檔案內容sed i s test01 test02 g grep rl test01 home forum 說明 在 home forum目錄下,grep出含有test01字串的檔案,然後把test01替換成test02 2.sed替換換行符參考 se...