linux文字處理三劍客之一 grep

2021-09-27 05:37:08 字數 4476 閱讀 4442

sed:stream edittor 文字編輯工具

awk:linux上的實現gawk,文字報告生成器

grep :global search reguar expression and print out the line

作用:文字搜尋工具,根據使用者指定的"模式"對目標文字逐行進行匹配檢查;列印匹配到的行

模式:有正規表示式字元及文字字元所編寫的過濾條件

grep [options] pattern[file...]

grep root /etc/passwd

grep "$user" /etc/passwd

grep '$user' /etc/passwd

grep '$uesr' /etc/passwd

grep `whoami` /etc/passwd

1.2 grep 命令選項
--color=auto:對匹配的文字著色顯示

-v:顯示不被pattern匹配到的行

-i:忽略字元大小寫

-n:顯示匹配的行號

-c:統計匹配到的字串

-o:僅顯示匹配到的字串

-q:靜默模式,不輸出任何資訊

-a n:after,後n行

-b n:before,前n行

-c n:context,前後各n行

-e:實現多個選項間的邏輯or關係

grep -e 'cat' -e 'dog' file

-w:匹配整個單詞 數字,字母,下劃線算字母

-e:使用ere

-f:相當於fgrep,不支援正規表示式

-f file:根據模式檔案處理

regexp:regular expressions 由一類特殊字元及文字字元所編寫的模式,

其中有一些字元(元字元)不表示字元字面意義,而表示控制或通配的功能

程式支援:grep sed awk vim less nginx,varnish等

分兩類:

基本正規表示式:bre

擴充套件正規表示式:ere

grep -e,egrep

正則表達引擎:

採用不同演算法,檢查處理正規表示式的軟體模組

pcre(perl compatible reguar expressions)

元字元分類:字元匹配、匹配次數、位置錨定、分組

man 7 regex

2.1 基本正規表示式元字元:字元匹配
字元匹配:

. 匹配任意單個字元

匹配指定範圍內的任意單個字元,示例:[0-9][a-z][a-za-z]

[^]匹配指定範圍外的任意單個字元

[:alnum:]字母和數字

[:alpha:]代表任意英文大小寫字元,亦即a-z,a-z

[:lower:]小寫字母

[:upper:]大寫字母

[:blank:]空白字元(空格和製表符)

[:space:]水平和垂直的空白字元(比[:blabk:]包含的範圍廣)

[:cntrl:]不可列印的控制字元(退格、刪除、警鈴...)

[:digit:]十進位制數字

[:xdigit:]十六進製制數字

[:graph:]可列印的非空白字元

[:print:]可列印字元

[:punct:]標點符號

2.2 正規表示式:匹配次數
匹配次數:用在要指定次數的字元後面,用於指定前面的字元要出現的次數

* 匹配前面的字元任意,包括0次

貪婪模式:盡可能長的匹配

.* 任意長度的任意字元

\? 匹配其前面的字元0或1次

\+ 匹配其前面的字元至少1次

\ 匹配前面的字元n次

\ 匹配前面的字元至少m次,至多n次

\ 匹配前面的字元至多n次

\ 匹配前面的字元至少n次

例:

. 表示任意的乙個字元

.* 表示任意長度 字元

[.*?] 表示 . * ? 中的某乙個

[^] 排除

[[:lower:]] 表示任意乙個小寫字母

a* 表示前面的字元出現任意次

[[:lower:]]* 表示出現一次或多次小寫字元

a\? 表示a出現0次或一次 (可有可無)

a\+ 表示a出現一次以上

a\ 表示a出現10次

a\表示a出現10到20次

a\表示a出現20次以下

a\表示a出現10次以上

a|bcd 表示a或bcd

(a|b)cd 表示acd或bcd

找出/etc/passwd中以bash和nologin結尾的行

egrep "(bash|nologin)$" /etc/passwd

2.3正規表示式:位置錨定
位置錨定:定位出現的位置

^行首錨定,用於模式的最左側

$行尾錨定,用於模式的最右側

^pattern$用於模式匹配整行

^$ 空行

^[[:space:]]*$空白行

\《或\b詞首錨定,用於單詞模式的左側

\>或\b詞尾錨定,用於單詞模式的右側

\匹配整個單詞

2.4 正規表示式:分組
分組:\(\)將乙個或多個字元**在一起,當做乙個整體,如:\(root\)+

分組括號中的模式匹配到內容的內容會被正規表示式引擎記錄與內部的變數中,這些變數的命名方式為:\1,\2,\3,...

\1 表示從左側起第乙個左括號以及與之匹配右括號之間的模式所匹配到的字元

示例: \(string1\+\(string2\)*\) 巢狀

\1:string1\+\(string2\)*

\2:string2

例:grep "\(hello\)\"

%s/r\(..\)t/\1/g

%s/\(r..t\)/\1er/g

2.5正規表示式:後向引用
後向引用:引用前面的分組括號中的模式所匹配字元,而非模式本身

或者:\|

示例:a\|b a或b

c\|cat c或cat

\(c|\c\)at cat或cat

grep -v "^$\|^#" /etc/file

3.1字元匹配:
.任意單個字元

指定範圍的字元

[^]不在指定範圍的字元

3.2次數匹配:
* 匹配前面字元任意次

? 0或1次

+ 1次或多次

匹配m次

至少m,至多n次

3.3位置錨定:
^  行首 

$ 行尾

\<,\b 語首

\>,\b 語尾

3.4分組:
()

後向引用:\1,\2,...

3.5 或者:
a|b      a或者b

c|cat c或者cat

(c|c)at cat或者cat

練習:

利用df和grep,取出磁碟各分割槽利用率,並從大到小排序

df |grep "^/dev/sd"|egrep -o '[[:digit:]]+%'|tr -d % |sort -nr

找出/etc/passwd使用者名稱和shell同名的行

egrep "^([^:]+):.*\<\1$" /etc/passwd

egrep -o "^(.*)(:.*)\<\1$" /etc/passwd

取出ifconfig eth0的ip

ifconfig ens33 | egrep -o "([0-9].)[0-9]"

取出ss.log日誌中排名前三的ip位址

grep "^estab" ss.log | tr -s ' ' :| cut -d: -f6|sort|uniq -c|sort -nr |head -3

將此字串:welcome to magedu linux 中的每個字元去重並排序,重複次數多的排到前⾯

echo wecome to magedu linux | grep -o "."|sort|uniq -c |sort -nr

使⽤egrep取出/etc/rc.d/init.d/functions路徑的⽬錄名

echo /etc/rc.d/init.d/functions|egrep -o "^[/].*/"

計算年齡總和:

cat age.txt

xiaoming=20

xiaohong=18

xiaoqiang=22

cut -d= -f2 age.txt |tr -s "\n" +|egrep -o ".*[0-9]+" |bc

60

Linux文字處理三劍客

grep 作用 文字搜尋工具,根據使用者指定的 模式對目標檔案逐步進行匹配檢查,列印匹配到的行 grep root etc passwd grep命令選項 grep user etc passwd v 顯示不被pattern 匹配的行 e 僅顯示匹配到的字串 grep user etc passwd...

linux文字處理三劍客

常用引數 v 顯示不能夠被匹配到的行 i 忽略大小寫字元 o 僅顯示匹配到的字串 q 靜默模式,不輸出任何資訊 a 後 行 b 前 行 c 前後各 行 e 使用ere,相當於egrep常用引數 n 只列印模式匹配的行 e 直接在命令列模式上進行sed動作編輯,此為預設選項 f 將sed的動作寫在乙個...

文字處理三劍客

文字處理三劍客 劍客一 grep 作用 行 過濾 用法 grep 正規表示式 檔案 路徑 grep e 擴充套件類正規表示式 檔案 路徑 劍客二 sed 用法 sed 選項 位址定位sed命令 檔案 路徑 sed 選項 正規表示式 sed命令 檔案 路徑 sed 選項 位址定位 正規表示式 sed命...