【Linux】一步一步学Linux——egrep命令(50)
00. 目錄
文章目錄
- 00. 目錄
- 01. 命令概述
- 02. 命令格式
- 03. 常用選項
- 04. 參考示例
- 05. 附錄
01. 命令概述
egrep命令用于在文件內查找指定的字符串。egrep執行效果與grep -E相似,使用的語法及參數可參照grep指令,與grep的不同點在于解讀字符串的方法。egrep是用extended regular expression語法來解讀的,而grep則用basic regular expression 語法解讀,extended regular expression比basic regular expression的表達更規范。
egrep支持擴展的正則表達式
02. 命令格式
egrep [選項]... PATTERN [FILE]... 在每個 FILE 或是標準輸入中查找 PATTERN。 PATTERN 是一個可擴展的正則表達式(縮寫為 ERE)。例如: egrep -i 'hello world' menu.h main.c注意: pattern如果是表達式或者超過兩個單詞的, 需要用引號引用. 可以是單引號也可雙引號, 區別是單引號無法引用變量而雙引號可以.
03. 常用選項
在每個 FILE 或是標準輸入中查找 PATTERN。 PATTERN 是一個可擴展的正則表達式(縮寫為 ERE)。 例如: egrep -i 'hello world' menu.h main.c正則表達式選擇與解釋:-e, --regexp=PATTERN 用 PATTERN 來進行匹配操作-f, --file=FILE 從 FILE 中取得 PATTERN-i, --ignore-case 忽略大小寫-w, --word-regexp 強制 PATTERN 僅完全匹配字詞-x, --line-regexp 強制 PATTERN 僅完全匹配一行-z, --null-data 一個 0 字節的數據行,但不是空行雜項:-s, --no-messages 不顯示錯誤信息-v, --invert-match 選中不匹配的行-V, --version 顯示版本信息并退出--help 顯示此幫助并退出--mmap 忽略向后兼容性輸入控制:-m, --max-count=NUM 匹配的最大數-b, --byte-offset 打印匹配行前面打印該行所在的塊號碼。-n, --line-number 顯示的加上匹配所在的行號--line-buffered 刷新輸出每一行-H, --with-filename 當搜索多個文件時,顯示匹配文件名前綴-h, --no-filename 當搜索多個文件時,不顯示匹配文件名前綴-o, --only-matching 只顯示一行中匹配PATTERN 的部分-q, --quiet, --silent 不顯示所有輸出--binary-files=TYPE 假定二進制文件的TYPE 類型;TYPE 可以是`binary', `text', 或`without-match'-a, --text 等同于 --binary-files=text-I 等同于 --binary-files=without-match-d, --directories=ACTION 操作目錄的方式;ACTION 可以是`read', `recurse',或`skip'-D, --devices=ACTION 操作設備、先入先出隊列、套接字的方式;ACTION 可以是`read'或`skip'-R, -r, --recursive 等同于 --directories=recurse--include=FILE_PATTERN 只查找匹配FILE_PATTERN 的文件--exclude=FILE_PATTERN 跳過匹配FILE_PATTERN 的文件和目錄--exclude-from=FILE 跳過所有除FILE 以外的文件--exclude-dir=PATTERN 跳過所有匹配PATTERN 的目錄。-L, --files-without-match 只打印不匹配FILEs 的文件名-l, --files-with-matches 只打印匹配FILES 的文件名-c, --count 只打印每個FILE 中的匹配行數目-T, --initial-tab 行首tabs 分隔(如有必要)-Z, --null 在FILE 文件最后打印空字符文件控制:-B, --before-context=NUM 打印以文本起始的NUM 行-A, --after-context=NUM 打印以文本結尾的NUM 行-C, --context=NUM 打印輸出文本NUM 行-NUM 等同于 --context=NUM--color[=WHEN],--colour[=WHEN] 使用標志高亮匹配字串;WHEN 可以是`always', `never'或`auto'-U, --binary 不要清除行尾的CR 字符(MSDOS 模式)-u, --unix-byte-offsets 當CR 字符不存在,報告字節偏移(MSDOS 模式)不帶 FILE 參數,或是 FILE 為 -,將讀取標準輸入。如果少于兩個 FILE 參數 就要默認使用 -h 參數。如果選中任意一行,那退出狀態為 0,否則為 1; 如果有錯誤產生,且未指定 -q 參數,那退出狀態為 2。正則表達式
| \ | 將下一個字符標記為一個特殊字符、或一個原義字符、或一個向后引用、或一個八進制轉義符。例如,“\n”匹配字符“n”。“\n”匹配一個換行符。序列“\”匹配“\”而“(”則匹配“(”。 |
| ^ | 匹配輸入字符串的開始位置。如果設置了RegExp對象的Multiline屬性,^也匹配“\n”或“\r”之后的位置。 |
| $ | 匹配輸入字符串的結束位置。如果設置了RegExp對象的Multiline屬性,$也匹配“\n”或“\r”之前的位置。 |
| * | 匹配前面的子表達式零次或多次。例如,zo*能匹配“z”以及“zoo”。*等價于{0,}。 |
| + | 匹配前面的子表達式一次或多次。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等價于{1,}。 |
| ? | 匹配前面的子表達式零次或一次。例如,“do(es)?”可以匹配“does”或“does”中的“do”。?等價于{0,1}。 |
| {n} | n是一個非負整數。匹配確定的n次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的兩個o。 |
| {n,} | n是一個非負整數。至少匹配n次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o。“o{1,}”等價于“o+”。“o{0,}”則等價于“o*”。 |
| {n,m} | m和n均為非負整數,其中n<=m。最少匹配n次且最多匹配m次。例如,“o{1,3}”將匹配“fooooood”中的前三個o。“o{0,1}”等價于“o?”。請注意在逗號和兩個數之間不能有空格。 |
| ? | 當該字符緊跟在任何一個其他限制符(*,+,?,{n},{n,},{n,m})后面時,匹配模式是非貪婪的。非貪婪模式盡可能少的匹配所搜索的字符串,而默認的貪婪模式則盡可能多的匹配所搜索的字符串。例如,對于字符串“oooo”,“o+?”將匹配單個“o”,而“o?”將匹配所有“o”。 |
| .點 | 匹配除“\n”之外的任何單個字符。要匹配包括“\n”在內的任何字符,請使用像“(.|\n)”的模式。 |
| (pattern) | 匹配pattern并獲取這一匹配。所獲取的匹配可以從產生的Matches集合得到,在VBScript中使用SubMatches集合,在JScript中則使用$0…$9屬性。要匹配圓括號字符,請使用“”。 |
| (?:pattern) | 匹配pattern但不獲取匹配結果,也就是說這是一個非獲取匹配,不進行存儲供以后使用。這在使用或字符“(|)”來組合一個模式的各個部分是很有用。例如“industr(?:y|ies)”就是一個比“industry|industries”更簡略的表達式。 |
| (?=pattern) | 正向肯定預查,在任何匹配pattern的字符串開始處匹配查找字符串。這是一個非獲取匹配,也就是說,該匹配不需要獲取供以后使用。例如,“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”,但不能匹配“Windows3.1”中的“Windows”。預查不消耗字符,也就是說,在一個匹配發生后,在最后一次匹配之后立即開始下一次匹配的搜索,而不是從包含預查的字符之后開始。 |
| (?!pattern) | 正向否定預查,在任何不匹配pattern的字符串開始處匹配查找字符串。這是一個非獲取匹配,也就是說,該匹配不需要獲取供以后使用。例如“Windows(?!95|98|NT|2000)”能匹配“Windows3.1”中的“Windows”,但不能匹配“Windows2000”中的“Windows”。預查不消耗字符,也就是說,在一個匹配發生后,在最后一次匹配之后立即開始下一次匹配的搜索,而不是從包含預查的字符之后開始。 |
| (?<=pattern) | 反向肯定預查,與正向肯定預查類似,只是方向相反。例如,“(?<=95|98|NT|2000)Windows”能匹配“2000Windows”中的“Windows”,但不能匹配“3.1Windows”中的“Windows”。 |
| (?<!pattern) | 反向否定預查,與正向否定預查類似,只是方向相反。例如“(?<!95|98|NT|2000)Windows”能匹配“3.1Windows”中的“Windows”,但不能匹配“2000Windows”中的“Windows”。 |
| x|y | 匹配x或y。例如,“z|food”能匹配“z”或“food”。“(z|f)ood”則匹配“zood”或“food”。 |
| [xyz] | 字符集合。匹配所包含的任意一個字符。例如,“[abc]”可以匹配“plain”中的“a”。 |
| [^xyz] | 負值字符集合。匹配未包含的任意字符。例如,“[^abc]”可以匹配“plain”中的“plin”。 |
| [a-z] | 字符范圍。匹配指定范圍內的任意字符。例如,“[a-z]”可以匹配“a”到“z”范圍內的任意小寫字母字符。 |
| [^a-z] | 負值字符范圍。匹配任何不在指定范圍內的任意字符。例如,“[^a-z]”可以匹配任何不在“a”到“z”范圍內的任意字符。 |
| \b | 匹配一個單詞邊界,也就是指單詞和空格間的位置。例如,“er\b”可以匹配“never”中的“er”,但不能匹配“verb”中的“er”。 |
| \B | 匹配非單詞邊界。“er\B”能匹配“verb”中的“er”,但不能匹配“never”中的“er”。 |
| \cx | 匹配由x指明的控制字符。例如,\cM匹配一個Control-M或回車符。x的值必須為A-Z或a-z之一。否則,將c視為一個原義的“c”字符。 |
| \d | 匹配一個數字字符。等價于[0-9]。 |
| \D | 匹配一個非數字字符。等價于[^0-9]。 |
| \f | 匹配一個換頁符。等價于\x0c和\cL。 |
| \n | 匹配一個換行符。等價于\x0a和\cJ。 |
| \r | 匹配一個回車符。等價于\x0d和\cM。 |
| \s | 匹配任何空白字符,包括空格、制表符、換頁符等等。等價于[ \f\n\r\t\v]。 |
| \S | 匹配任何非空白字符。等價于[^ \f\n\r\t\v]。 |
| \t | 匹配一個制表符。等價于\x09和\cI。 |
| \v | 匹配一個垂直制表符。等價于\x0b和\cK。 |
| \w | 匹配包括下劃線的任何單詞字符。等價于“[A-Za-z0-9_]”。 |
| \W | 匹配任何非單詞字符。等價于“[^A-Za-z0-9_]”。 |
| \xn | 匹配n,其中n為十六進制轉義值。十六進制轉義值必須為確定的兩個數字長。例如,“\x41”匹配“A”。“\x041”則等價于“\x04&1”。正則表達式中可以使用ASCII編碼。 |
| \num | 匹配num,其中num是一個正整數。對所獲取的匹配的引用。例如,“(.)\1”匹配兩個連續的相同字符。 |
| \n | 標識一個八進制轉義值或一個向后引用。如果\n之前至少n個獲取的子表達式,則n為向后引用。否則,如果n為八進制數字(0-7),則n為一個八進制轉義值。 |
| \nm | 標識一個八進制轉義值或一個向后引用。如果\nm之前至少有nm個獲得子表達式,則nm為向后引用。如果\nm之前至少有n個獲取,則n為一個后跟文字m的向后引用。如果前面的條件都不滿足,若n和m均為八進制數字(0-7),則\nm將匹配八進制轉義值nm。 |
| \nml | 如果n為八進制數字(0-3),且m和l均為八進制數字(0-7),則匹配八進制轉義值nml。 |
| \un | 匹配n,其中n是一個用四個十六進制數字表示的Unicode字符。例如,\u00A9匹配版權符號(?)。 |
04. 參考示例
4.1 grep使用正則表達式示例
grep '\<Tom\>' file 包含單詞Tom的行 grep 'Tom savage' file 包含Tom savage的行 grep '^Tommy' file 包含以Tommy開頭的行 grep '\.bak$' file 包含以.bak結束的行 grep '[Pp]yramid' file 包含pyramid 或Pyramid的單詞的行 grep '[A-Z]' file 包含至少一個大寫字母的行 grep '[0-9]' file 包含至少一個數字的行 grep '[A-Z]...[0-9]' file 包含五個字符,以大寫開頭, 和一個數字結尾的行. grep -w '[tT]est' file 包含單詞和test的行. grep -s 'ken sun' file 找到包含ken sun的行, 但不打印行, 而是用來檢查退出狀態. grep -v aaa file 打印不包含aaa的行. grep -i cathy file 打印所有包含cathy的行, 而不考慮大小些. grep -l 'dear cathy' * 打印包含dear cathy的文件的文件名清單. grep -n tom file 打印匹配的行并追加行號. grep "$LOGNAME" file 包含變量內容的行, 注意必須用雙引號, 單引號則無法引用變量. grep '$name' file 打印包含字符$name的行.4.2 擴展的正則表達式
擴展表達式: + 匹配一個或者多個先前的字符, 至少一個先前字符. ? 匹配0個或者多個先前字符. a|b|c 匹配a或b或c () 字符組, 如: love(able|ers) 匹配loveable或lovers. (..)(..)\1\2 模板匹配. \1代表前面第一個模板, \2代第二個括弧里面的模板. x{m,n} =x\{m,n\} x的字符數量在m到n個之間4.3 以一個或者多個a開頭的行
[deng@localhost test]$ egrep '^a+' file afkldjfkas adskfjasld或者
[deng@localhost test]$ grep '^aa*' file afkldjfkas adskfjasld [deng@localhost test]$4.4 包含deng或者root的行
[deng@localhost test]$ egrep '(deng|root)' /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin deng:x:1000:1000:deng:/home/deng:/bin/bash [deng@localhost test]$4.5 至少包含一個root的行
[deng@localhost test]$ egrep '(root)+' /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin [deng@localhost test]$4.6 包含x或者x后面跟著0個或者多個數字的行
[deng@localhost test]$ egrep 'x[0-9]?' /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin4.7 所有以bash結尾的行
[deng@localhost test]$ egrep 'bash$' /etc/passwd root:x:0:0:root:/root:/bin/bash deng:x:1000:1000:deng:/home/deng:/bin/bash oracle:x:1001:1002::/home/oracle:/bin/bash itcast:x:1002:1003::/home/itcast:/bin/bash [deng@localhost test]$4.8 至少包含一個大寫字母的行
[deng@localhost test]$ egrep '[A-Z]+' /etc/passwd ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin nobody:x:99:99:Nobody:/:/sbin/nologin4.9 至少一個數字的行
[deng@localhost test]$ egrep '[0-9]' /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin4.10 有五個字符, 第一個式大寫, 最后一個是數字的行
[deng@localhost test]$ egrep '[A-Z]...[0-9]' /etc/passwd [deng@localhost test]$4.11 包含單詞test或Test的行
[deng@localhost test]$ egrep '[tT]est' /etc/passwd4.12 包含root的行
[deng@localhost test]$ egrep "root" /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin [deng@localhost test]$4.13 不包含root的行
[deng@localhost test]$ egrep -v "root" /etc/passwd4.14 忽略大小寫
[deng@localhost test]$ egrep -i "Root" /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin [deng@localhost test]$4.15 包含root所有文件列表
[deng@localhost test]$ egrep -I "root" ./* ./file:root ./passwd:root:x:0:0:root:/root:/bin/bash ./passwd:operator:x:11:0:operator:/root:/sbin/nologin ./passwd1:root:x:0:0:root:/root:/bin/bash ./passwd1:operator:x:11:0:operator:/root:/sbin/nologin [deng@localhost test]$4.16 顯示包含root的行,前面添加行號
[deng@localhost test]$ egrep -n "root" /etc/passwd 1:root:x:0:0:root:/root:/bin/bash 10:operator:x:11:0:operator:/root:/sbin/nologin [deng@localhost test]$4.17 不顯示錯誤信息
[deng@localhost test]$ egrep -s "rooot" /etc/passwd [deng@localhost test]$4.18 查找所有出現數字或者字母的行
[deng@localhost test]$ egrep [[:alnum:]] /etc/passwd05. 附錄
參考:【Linux】一步一步學Linux系列教程匯總
總結
以上是生活随笔為你收集整理的【Linux】一步一步学Linux——egrep命令(50)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Linux】一步一步学Linux——g
- 下一篇: 【IT资讯】全新编程语言V发布