1. 程式人生 > >Linux文本處理之grep

Linux文本處理之grep

腳本 進行 mail egrep 一次 裏的 轉義 span 數字

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