文本處理命令(一)——grep學習總結

grep (global search regular expression(RE) and print out the line,全面搜索正則表達式并把行打印出來)是一種強大的文本搜索工具,它能使用正則表達式搜索文本,并把匹配的行打印出來。除了grep,還有egrep和fgrep,egrep可以看作是grep的增強版本,支持更多re元字符,fgrep是fixed grep或fast grep,它們把所有的字母都看作單詞,也就是說,正則表達式中的元字符表示回其自身的字面意義,不再特殊。Linux使用GNU版本的grep,可以通過-G、-E、-F命令行選項來使用egrep和fgrep的功能。
查看grep工具的使用可以通過

grep --help
匹配模式選擇:
 -E, --extended-regexp     擴展正則表達式egrep
 -F, --fixed-strings       一個換行符分隔的字符串的集合fgrep
 -G, --basic-regexp        基本正則
 -P, --perl-regexp         調用的perl正則
 -e, --regexp=PATTERN      后面根正則模式,默認無
 -f, --file=FILE           從文件中獲得匹配模式
 -i, --ignore-case         不區分大小寫
 -w, --word-regexp         匹配整個單詞
 -x, --line-regexp         匹配整行
 -z, --null-data           一個 0 字節的數據行,但不是空行

雜項:
 -s, --no-messages         不顯示錯誤信息
 -v, --invert-match        顯示不匹配的行
 -V, --version             顯示版本號
 --help                    顯示幫助信息
 --mmap                use memory-mapped input if possible

輸入控制:
 -m, --max-count=NUM       匹配的最大數
 -b, --byte-offset         打印匹配行前面打印該行所在的塊號碼。
 -n, --line-number         顯示的加上匹配所在的行號
 --line-buffered           刷新輸出每一行
 -H, --with-filename       當搜索多個文件時,顯示匹配文件名前綴
 -h, --no-filename         當搜索多個文件時,不顯示匹配文件名前綴
 --label=LABEL            print LABEL as filename for standard input
 -o, --only-matching       只顯示一行中匹配PATTERN 的部分
 -q, --quiet, --silent      不顯示任何東西
 --binary-files=TYPE   假定二進制文件的TYPE 類型;
                                      TYPE 可以是`binary', `text', 或`without-match'
 -a, --text                匹配二進制的東西
 -I                        不匹配二進制的東西
 -d, --directories=ACTION  目錄操作,讀取,遞歸,跳過
 -D, --devices=ACTION      設置對設備,FIFO,管道的操作,讀取,跳過
 -R, -r, --recursive       遞歸調用
 --include=PATTERN     只查找匹配FILE_PATTERN 的文件
 --exclude=PATTERN     跳過匹配FILE_PATTERN 的文件和目錄
 --exclude-from=FILE   跳過所有除FILE 以外的文件
 -L, --files-without-match 匹配多個文件時,顯示不匹配的文件名
 -l, --files-with-matches  匹配多個文件時,顯示匹配的文件名
 -c, --count               顯示匹配了多少次
 -Z, --null                在FILE 文件最后打印空字符

文件控制:
 -B, --before-context=NUM  打印匹配本身以及前面的幾個行由NUM控制
 -A, --after-context=NUM   打印匹配本身以及隨后的幾個行由NUM控制
 -C, --context=NUM         打印匹配本身以及隨后,前面的幾個行由NUM控制
 -NUM                      根-C的用法一樣的
 --color[=WHEN],
 --colour[=WHEN]       使用標志高亮匹配字串;
 
 -U, --binary               使用標志高亮匹配字串;
 -u, --unix-byte-offsets   當CR 字符不存在,報告字節偏移(MSDOS 模式)

常用選項及使用總結
給出測試文件test.txt

root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/bin/false,aaa,bbbb,cccc,aaaaaa
DADddd:x:2:2:daemon:/sbin:/bin/false
mail:x:8:12:mail:/var/spool/mail:/bin/false
ftp:x:14:11:ftp:/home/ftp:/bin/false
&nobody:$:99:99:nobody:/:/bin/false
zhangy:x:1000:100:,,,:/home/zhangy:/bin/bash
http:x:33:33::/srv/http:/bin/false
dbus:x:81:81:System message bus:/:/bin/false
hal:x:82:82:HAL daemon:/:/bin/false
mysql:x:89:89::/var/lib/mysql:/bin/false
aaa:x:1001:1001::/home/aaa:/bin/bash
ba:x:1002:1002::/home/zhangy:/bin/bash
test:x:1003:1003::/home/test:/bin/bash
@zhangying:*:1004:1004::/home/test:/bin/bash
policykit:x:102:1005:Po
查找所有包含root的行
cat test.txt | grep root 或 grep root test.txt
輸出:
root:x:0:0:root:/root:/bin/bash
匹配以root開頭或者以zhang開頭的行,注意反斜杠
#grep方式需要使用'\'進行轉義,-e表示后面是正則表達式,默認沒有該選項
cat test.txt | grep -e '^\(root\|zhang\)'
#egrep方式-E選項直接跟正則表達式,也可以使用-F或-G選項
cat test.txt | grep -E '^(root|zhang)'
輸出:
root:x:0:0:root:/root:/bin/bash  
zhangy:x:1000:100:,,,:/home/zhangy:/bin/bash
在匹配的行前面加上該行在文件中,或者輸出中所在的行號
cat test.txt | grep -n 'zhangy'
輸出:
7:zhangy:x:1000:100:,,,:/home/zhangy:/bin/bash  
13:ba:x:1002:1002::/home/zhangy:/bin/bash  
15:@zhangying:*:1004:1004::/home/test:/bin/bash
不匹配以root或zhang開頭的行,并顯示行號
cat test.txt | grep -nvE '^(root|zhang)'
輸出:
2:bin:x:1:1:bin:/bin:/bin/false,aaa,bbbb,cccc,aaaaaa
3:DADddd:x:2:2:daemon:/sbin:/bin/false
4:mail:x:8:12:mail:/var/spool/mail:/bin/false
5:ftp:x:14:11:ftp:/home/ftp:/bin/false
6:&nobody:$:99:99:nobody:/:/bin/false
8:http:x:33:33::/srv/http:/bin/false
9:dbus:x:81:81:System message bus:/:/bin/false
10:hal:x:82:82:HAL daemon:/:/bin/false
11:mysql:x:89:89::/var/lib/mysql:/bin/false
12:aaa:x:1001:1001::/home/aaa:/bin/bash
13:ba:x:1002:1002::/home/zhangy:/bin/bash
14:test:x:1003:1003::/home/test:/bin/bash
15:@zhangying:*:1004:1004::/home/test:/bin/bash
16:policykit:x:102:1005:Po
顯示匹配的個數,不顯示內容
#-c選項返回匹配的個數
cat test.txt | grep -c root
輸出:
3
最多只匹配i次,如果把-m i去掉的話,會有顯示所有
cat test.txt | grep -m 1 zhang
輸出:
zhangy:x:1000:100:,,,:/home/zhangy:/bin/bash
匹配時,在匹配的行前面加上文件名(通常用于多文件匹配)
cat test.txt | grep -H root
輸出:
test.txt:root:x:0:0:root:/root:/bin/bash
顯示匹配文件的文件名(通常用于多文件匹配)
cat test.txt | grep -l root
輸出:
test.txt
忽略大小寫進行匹配
cat test.txt | grep -i Root    #沒有-i將匹配不到內容
輸出:
root:x:0:0:root:/root:/bin/bash
匹配整個單詞
cat test.txt | grep -w 'root'
輸出:
root:x:0:0:root:/root:/bin/bash
#如果換成 cat test.txt | grep -w 'roo' 將匹配不到內容
匹配整行 -x 選項
cat test.txt | grep -x root
輸出:
吳匹配內容
#修改命令
echo "root" | grep -x root
輸出:
root
將匹配項分別顯示(用于一行中存在多個匹配項的情況)
#不加-o選項
cat test.txt | grep root
輸出:
root:x:0:0:root:/root:/bin/bash    #行內匹配項顯示在一行
#含-o選項
cat test.txt | grep -o root
輸出:
root
root
root
#一行內的匹配項分別顯示,且只顯示匹配的部分
顯示匹配行及前后i行
#顯示匹配行及其后三行
cat test.txt | grep -A 3 root
輸出:
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/bin/false,aaa,bbbb,cccc,aaaaaa
DADddd:x:2:2:daemon:/sbin:/bin/false
mail:x:8:12:mail:/var/spool/mail:/bin/false
#如果存在下面情況
cat test.txt | grep -n zhangy
輸出:
7:zhangy:x:1000:100:,,,:/home/zhangy:/bin/bash
13:ba:x:1002:1002::/home/zhangy:/bin/bash
15:@zhangying:*:1004:1004::/home/test:/bin/bash
#假設對zhangy進行匹配,顯示匹配行及后3行,將如何輸出
cat test.txt | grep -nA3 zhangy
輸出:
7:zhangy:x:1000:100:,,,:/home/zhangy:/bin/bash
8-http:x:33:33::/srv/http:/bin/false
9-dbus:x:81:81:System message bus:/:/bin/false
10-hal:x:82:82:HAL daemon:/:/bin/false
--
13:ba:x:1002:1002::/home/zhangy:/bin/bash
14-test:x:1003:1003::/home/test:/bin/bash
15:@zhangying:*:1004:1004::/home/test:/bin/bash
16-policykit:x:102:1005:Po
#重復的行將合并輸出

grep各個選項可以根據需要進行組合使用,但有時候需要注意順序,比如上面操作grep -nA3 zhangy 如果寫成grep -A3n zhangy 將會報錯,因為無法識別3n具體是多少行。或者多個選項可以通過空格+'-'進行分隔,例如grep -A3 -n zhangy 就不會報錯了。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,002評論 6 542
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,400評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,136評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,714評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,452評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,818評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,812評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,997評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,552評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,292評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,510評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,035評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,721評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,121評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,429評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,235評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,480評論 2 379

推薦閱讀更多精彩內容

  • 概念 正則表達式,又稱正規表示式、正規表示法、正規表達式、規則表達式、常規表示法(英語:Regular Expre...
    dxldeng閱讀 2,517評論 0 2
  • linux資料總章2.1 1.0寫的不好抱歉 但是2.0已經改了很多 但是錯誤還是無法避免 以后資料會慢慢更新 大...
    數據革命閱讀 12,200評論 2 33
  • 項目上線之后,或者在測試環境,經常會有bug讓我們去排查和修改,這個時候,我們需要在linux系統中使用一些命令幫...
    時之令閱讀 2,844評論 0 2
  • 一 文件查看cat -E: 顯示行結束符$創建一個文件——nano f1,在文本編輯中在b和d之間補一個tab鍵[...
    楠人幫閱讀 311評論 0 1
  • 1.作用 Linux系統中grep命令是一種強大的文本搜索工具,它能使用正則表達式搜索文本,并把匹 配的行打印出來...
    流川楓丶閱讀 1,389評論 0 9