文本處理之正則表達式和grep

Linux是基於文件的系統,可以認爲Linux的所有命令都是對文件的操作(有些操作的是變量),熟練掌握Linux的文本處理工具是所有學習linux所必需要掌握的,尤其是準備跨入Linux行業的同學更是如此,在工作中我們將會遇到非常多而且內容龐大的文本,批量處理和精確定位將成爲工作的日常操作。有時即使我們已經掌握了所有的文本處理工具,面對繁雜的文本也會感到無從着手,這是很正常的,Linux文本處理技巧是需要時間和練習去不斷積累的,所以不要感到疲倦,下面來梳理一下日常中常見到的命令吧。

一、Linux的基本文本處理命令:

1、 cat,連接文件並打印到標準輸出

cat [OPTION]... [FILE]...

-A 等同於:-vET

-b 非空的行顯示行號,被-n覆蓋

-e 等同於-vE

-E 在每行加上$

-n 顯示行號

-s 壓縮連續的空行爲一個空行(空行爲回車,如果回車前有空格不壓縮)

-t 等同於-vT

-T 顯示tab^I

-v 使用^M-符號,除了LFDTAB

 

cat相似的命令

tac:文本倒行顯示

rev:文本的每行倒序顯示

查看文本:lessmoreless is better then more

headtail命令:

head:默認顯示文本的前十行

-c 只顯示前幾個字節

-n 顯示前幾行

tail:顯示後十行

-c-n 選項和head一樣

-f :動態監視最後幾行

怎樣監視/var/log/secure 並且只有發生變化時打印變化?

[root@localhost ~]# tailf -n 0 /var/log/secure &
cut

-d:指定分隔符,默認爲tab

-c:按字符數來切割某字段

-f:選取字段

paste:將兩個文件同行號合併在一起

-d:指定分隔符,默認爲tab

-s:一個文件的所有行顯示爲一行

wc:統計文件的數據

-l:統計行數

-w:統計單詞數

-c:統計字節數

-m:統計字符數

sort:給文件的行排序

-b:忽略行首的空格,將第一個非空字符與其他行比較

-f:將小寫字母轉爲大字字母來比較,即忽略大小寫,全部按大寫字母比較

-g:按照常規的數字排序,數字數值大的排在後面

-n:按照字符串數值比較,和-g的區別

-r:逆序排列

-u:刪除輸出中的重複行

-t:指定分隔符

-k:選取比較的字段

uniq:報告或省略重複的行(連續相同纔是重複)、

-c:顯示重複行的數量

-d:將顯示重複的行

-u:顯示不重複的行

通常,用sort排序將重複的行放在一起然後用uniq去重統計

diff:一行一行比較文件的內容,vimdiff更直觀

-u:以統一的格式輸出比較的結果,以便於patch命令去恢復文件

patch:通過diff的差異文件來恢復原始文件,並將生成的文件命名爲基礎文件名(注意一定要加-b選項)

-b自動備份基礎文件爲file.orig

1、找出ifconfig命令結果中本機的所有IPv4地址:

[root@localhost ~]# ifconfig |grep "netmask"|cut -d 'n' -f2|grep "\b[[:digit:]]\{1,3\}.[[:digit:]]\{1,3\}.[[:digit:]]\{1,3\}.[[:digit:]]\{1,3\}\b" -o
10.1.70.102
127.0.0.1
192.168.122.1

2、查出分區空間使用率的最大百分比值

[root@localhost ~]# df |tr -s ' '|cut -d ' ' -f5|egrep -o "[0-9]{1,2}"|sort -nr|head -1
38

3、查出用戶UID最大值的用戶名、UID及shell類型

[root@localhost ~]# sort -nr -t: -k3 /etc/passwd|head -1|cut -d: -f1,3,7
nfsnobody:65534:/sbin/nologin

4、查出/tmp的權限,以數字方式顯示

[root@localhost ~]# stat /tmp/|grep "Access"|head -1|cut -c11-13
777

5、統計當前連接本機的每個遠程主機IP的連接數,並按從大到小排序

[root@localhost ~]# netstat -nt|tr -s ' '|cut -d ' ' -f5|egrep "\b([0-9]{1,3}.){3}[0-9]{1,3}\b" -o|sort|uniq -c
      2 10.1.250.91

二、linux三劍客之grep

grep:(Global search REgularexpression and Print out the line)文本搜索工具,根據用戶指定的“模式”對目標文本逐行進行匹配檢查;打印匹配到的行。

模式:由正則表達式字符及文本字符所編寫的過濾條件

Unix的grep家族包括grep、egrep和fgrep。egrep和fgrep的命令只跟grep有很小不同。egrep是grep的擴展,支持更多的re元字符, fgrep就是fixed grep或fast grep,它們把所有的字母都看作單詞,也就是說,正則表達式中的元字符表示回其自身的字面意義,不再特殊。linux使用GNU版本的grep。它功能更強,可以通過-G、-E、-F命令行選項來使用egrep和fgrep的功能。

grep有諸多選項,詳細的選項可以查看

http://www.lampweb.org/linux/3/27.html

下面列出較常用的選項

--color=auto: 對匹配到的文本着色顯示

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

-i: 忽略字符大小寫

-n:顯示匹配的行號

-c: 統計匹配的行數

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

-q: 靜默模式,不輸出任何信息,常用作腳本判斷

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

-w:整行匹配整個單詞,單詞可包括字母、數字和下劃線

-A:顯示匹配行及其前幾行

-B:顯示匹配行及其前幾行

-C:顯示匹配行及其上下幾行

-l:打印符合匹配模式的文件名

-H:在顯示匹配行前加文件名



三、正則表達式

REGEXP:由一類特殊字符及文本字符所編寫的模式,其中有些字符(元字符)不表示字符字面意義,而表示控制或通配的功能

正則表達式常用來匹配文本內容,shell通配符常用來匹配文件路徑

可以通過man 7 regex來查看幫助

正則表達式元字符分類:字符匹配、匹配次數、位置錨定、分組

正則表達式可以分爲兩類:

1、基本正則表達式BRE

字符匹配:

. :匹配任意單個字符

[]:匹配方括號中的任意單個字符

[^]:匹配非方括號中指定的字符

[[:digit:]]匹配單個數字,同[0-9],使用時雙方括號

[[:alpha:]]匹配任意單個大小寫字母

[[:lower:]]匹配單個小寫字母

[[:upper:]]匹配任意單個大寫字母

[[:alnum:]]匹配單個大小寫或數字

[[:punct:]]匹配任意單個標點符號

[[:space:]]匹配單個空格

匹配次數:

* :匹配前面的字符任意次(貪婪模式,在其後面加問號取消貪婪模式)

.* :任意字符任意長度

\?:匹配前面的字符0次或一次

\+:匹配前面的字符一次或多次

\{m,n\}匹配前面的字符m到n次、

    若m爲零,則最大匹配n次

    若n爲零,則最小匹配m次

位置錨定:

^ :匹配以某字符開頭

$ :匹配以某字符結尾

^$:匹配沒有空格的行,即只有回車行

^[[:space:]]*$:匹配包括空格的行

\<或\b:詞首錨定

\>或\b:詞尾錨定

分組:

\(\):將一個或多個字符捆綁在一起,當作一個整體進行處理

分組括號中的模式匹配到的內容會被正則表達式引擎記錄於內部的變量中,這些變量的命名方式爲: \1, \2, \3, ...

\1: 從左側起,第一個左括號以及與之匹配右括號之間的模式所匹配到的字符

後向引用:引用前面的分組括號中的模式所匹配字符(而非模式本身)


2、擴展正則表達式ERE

grep -E 或egrep支持正則表達式

次數匹配:

*:匹配前面字符任意次

?:0次或1次

+:1次或多次

{m}:匹配m次

{m,n}:至少m,至多n次

位置錨定:

^ :行首

$ :行尾

\<, \b :詞首

\>, \b :詞尾

分組:

()不能加轉義

“or”匹配:

a|b :匹配a或者b

C|cat: C或cat

(C|c)at:Cat或cat

                                                                                                                                                                                                          



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章