Linux文本處理之grep
我們經常會遇到只需要一個文件裏的只言片語,比如從文件裏獲取一串字符或者樣式,可以用cat +文件一個一個找,這樣不僅效率低,而且海量的字符會讓你奔潰的。這個時候需要了解一下文本處理三劍客,分別是 grep 文本過濾工具 ;sed 文本編輯工具 ;awk 文本報告生成器。
1.grep
英文全拼:Global search REgular expression and Print out the line(全面搜索正則表達式並把行打印出來)。grep是每個Linux發行版都預裝的文件工具。
2.作用
強有力的文件模式搜索工具
3.語法
grep [options] pattern [file...]
grep命令選項:
--color=auto 關鍵字高亮顯示
[root@centos6 ~]# cat /etc/passwd |grep --color=auto 514 machao2:x:512:514::/root/app:/bin/bash machao5:x:514:516::/root/machao1:/bin/bash
-v 關鍵字 顯示不包含關關鍵字的行,取反
[root@localhost ~]# cat /etc/passwd |grep -v 1017 nologin:x:1013:1018::/home/nologin:/sbin/nologin weiyan:x:1017:1024::/home/weiyan:/bin/bash
-i 關鍵字 忽略關鍵字的大小寫
[root@localhost ~]# cat abc.txt aaAAbb BBccCC dd ee ff Aa Bb hello world [root@localhost ~]# cat abc.txt |grep 'a' aaAAbb Aa Bb [root@localhost ~]# cat abc.txt |grep 'A' aaAAbb Aa Bb [root@localhost ~]# cat abc.txt |grep -i 'a' aaAAbb Aa Bb
-n 顯示的結果每行前增加行號
[root@localhost ~]# cat abc.txt |grep -i -n 'a' 1:aaAAbb 4:Aa Bb
-c 僅顯示找出的結果的行數
[root@localhost ~]# cat abc.txt |grep '[[:alpha:]]' -n 1:aaAAbb 2:BBccCC 3:dd ee ff 4:Aa Bb 5:hello world [root@localhost ~]# cat abc.txt |grep '[[:alpha:]]' -n -c 5
-o 僅顯示匹配到的關鍵字,不顯示同行的其他內容
[root@localhost ~]# cat abc.txt |grep 'ee' dd ee ff [root@localhost ~]# cat abc.txt |grep -o 'ee' ee
-q 不輸出任何結果,靜默
[root@localhost ~]# cat abc.txt |grep -q 'ee' [root@localhost ~]# echo $? 0 (輸入指令無結果顯示,$?意思是變量保存最近的命令退出狀態,結果為0表示正確)
-A # 顯示關鍵字行及向下的n行
[root@localhost ~]# cat abc.txt |grep -A1 'ee' dd ee ff Aa Bb
-B # 顯示關鍵字行及向上的n行
[root@localhost ~]# cat abc.txt |grep -B1 'ee' BBccCC dd ee ff
-C # 顯示關鍵字行及向上n行和向下的n行
[root@localhost ~]# cat abc.txt |grep -C1 'ee' BBccCC dd ee ff Aa Bb
-e 關鍵字1 -e 關鍵字2 …… 多個關鍵字之間是或的關系
[root@localhost ~]# cat abc.txt |grep -e aa -e ff -e BB aaAAbb BBccCC dd ee ff
-w 關鍵字 匹配整個單詞
[root@localhost ~]# cat abc.txt aaAAbb BBccCC dd ee ff Aa Bb aa AA BB hello world [root@localhost ~]# cat abc.txt |grep aa aaAAbb aa AA BB [root@localhost ~]# cat abc.txt |grep -w aa aa AA BB
-E 等於egrep 使用擴展正則表達式
-F 等於fgrep 不使用正則表達式
這僅僅是grep命令的開始,你可能已經註意到,它對於實現各種各樣的需求簡直是太有用了。除了這種我們運行的這種只有一行的命令,grep還可以寫成c自動的shell腳本去執行。
4.正則表達式
(1)由一類特殊字符及文本字符所編寫的模式,其中有些字符(元字符)不表示字符字面意義 ,而表示控制或通配的功能。程序支持:grep,sed,awk,vim, less,nginx,varnish等等
(2)分為兩類:基本正則表達式(Basic Regular Expression 又叫Basic RegEx 簡稱BREs)
擴展正則表達式(Extended Regular Expression 又叫Extended RegEx 簡稱EREs)
Perl正則表達式 (Perl Regular Expression 又叫Perl RegEx 簡稱PREs)
(3)組成:一般字符:沒有特殊意義的字符
特殊字符(meta字符):元字符,有在正則表達式中有特殊意義
(4)元字符及其在正則表達式上下文中的行為
\ 將下一個字符標記為一個特殊字符、或一個原義字符、或一個後向引用、或一個八進制轉義符 ^ 匹配輸入字符串的開始位置。如果設置了 RegExp 對象的Multiline 屬性,^ 也匹配 '\n' 或 '\r' 之後的位置 * 匹配前面的子表達式零次或多次 + 匹配前面的子表達式一次或多次。+ 等價於 {1,} ? 匹配前面的子表達式零次或一次。? 等價於 {0,1} {n} n 是一個非負整數,匹配確定的n 次 {n,} n 是一個非負整數,至少匹配n 次 {n,m} m 和 n 均為非負整數,其中n <= m。最少匹配 n 次且最多匹配 m 次。在逗號和兩個數之間不能有空格 ? 當該字符緊跟在任何一個其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 後面時,匹配模式是非貪婪的。 非貪婪模式盡可能少的匹配所搜索的字符串,而默認的貪婪模式則盡可能多的匹配所搜索的字符串 . 匹配除 “\n” 之外的任何單個字符 $ 匹配前面的正則表達式,在字符串或者行結尾處。BRE中僅在正則表達式的結尾處有特殊的含義,ERE中在任何位置都有特殊含義 [] 匹配方括號內的任一字符,其中可用連字符(-)指的連續字符的範圍;^符號苦出現在方括號的第一個位置,則表示匹配不在列表中的任一字符 \< 或 \b 詞首錨定,用於單詞模式的左側 \> 或 \b 詞尾錨定;用於單詞模式的右側 \<PATTERN\> 匹配整個單詞
(5) 字符集
[::alnum] : 數字字符 [:digit:] : 數字字符 [:punct:] : 標點符號字符 [:alpha:] : 字母字符 [:graph:] : 非空格字符 [:space:] : 空格字符 [:blank:] : 空格與定位字符 [:lower:] : 小寫字母字符 [:upper:] : 大寫字母字符 [:cntrl:] : 控制字符 [:print:] : 可顯示的字符 [:xdigit:] : 16進制數字
(6)常用正則表達式
^$ 空行 ^[[:space:]]*$ 空白行 /<(.*)>.*<\/\1>|<(.*) \/>/ 匹配HTML標記的正則表達式 /(\d+)\.(\d+)\.(\d+)\.(\d+)/g // 匹配IP地址的正則表達式 "\<(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>" 匹配IP地址的正則表達式 \w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)* 匹配Email地址的正則表達式 http://(/[\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)? 匹配網址URL的正則表達式
Linux文本處理之grep