1. 程式人生 > >Linux基礎管理——文本處理(小命令組合解決大問題)

Linux基礎管理——文本處理(小命令組合解決大問題)

文本處理命令 grep 正則表達式 擴展正則表達式


前言:

在服務器中對日誌進行處理是十分常見的工作,所以運維對於各種文本工具來查看、分析、統計,是必備的基本工。那麽學習正則表達式、grep、egrep、和tr、sort、uniq等常見的文件處理命令就十分有必要了。


1、工具分類

文件內容:less和 cat

文件截取:head和tail

按列抽取:cut
按關鍵字抽取:grep


2、工具集錦


2.1、文件內容查看命令:cat, tac,rev;


(1)cat


語法:

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


選項:

-E: 顯示行結束符$;
-n: 對顯示出的每一行進行編號;
-A:顯示所有控制符;
-b: 非空行編號;
-s:壓縮連續的空行成一行;


(2)tac:行反向查看;


(3)rev:列反向查看;




2.2、分頁查看文件內容:more、less


(1)more: 分頁查看文件;


語法:

    more [OPTIONS...] FILE...


選項:

-d: 顯示翻頁及退出提示;



(2)less:一頁一頁地查看文件或STDIN輸出;

查看時有用的命令包括:
    /文本: 搜索文本;
    ?文本: 搜索文本;
    n/N:跳到同向下一個 或 同向上一個匹配

註:less命令是man命令使用的分頁器



2.3、顯示文本前或後行內容:head、tail、tailf


(1)head


語法:

    head [OPTION]... [FILE]...

選項:

-c #: 指定獲取前#字節
-n #: 指定獲取前#行
-#: 指定行數


(2)tail ?


語法:

    tail [OPTION]... [FILE]...

選項:

    -c #: 指定獲取後#字節    
    -n #: 指定獲取後#行
    -#:查看後幾行;
    -f: 跟蹤顯示文件fd新追加的內容,常用日誌監控;相當於 --follow=descriptor。
    -F: 跟蹤文件名,相當於—follow=name --retry

(3)tailf

類似tail –f,當文件不增長時並不訪問文件;




2.4、按列抽取文本cut

語法:

? cut [OPTION]... [FILE]...


選項:

    -d DELIMITER: 指明分隔符,默認tab    
    -f FILEDS:
    
       FILEDS
       #: 第#個字段;
       #,#[,#]:離散的多個字段,例如1,3,6;
       #-#:連續的多個字段, 例如1-6;
       混合使用:1-3,7;
       
    -c 按字符切割;
    --output-delimiter=STRING指定輸出分隔符;




示例:顯示文件或STDIN數據的指定列;

    cut -d: -f1 /etc/passwd    
    cat /etc/passwd | cut -d: -f7
    cut -c2-5 /usr/share/dict/words
    
    [root@Centos6x ~]#cut -d: -f1,3 /etc/passwd
    root:0
    bin:1
    daemon:2


2.5、合並文件paste


paste:合並兩個文件同行號的列到一行

語法:

    paste [OPTION]... [FILE]...


選項:

-d 分隔符:指定分隔符,默認用TAB
-s : 所有行合成一行顯示


示例:

    paste f1 f2    
    paste -s f1 f2
    
    [root@Centos6x ~]#paste f1 f2
        1
    a   2
    s   3
    a   4
    a   5
    s   6
    b
    c
    d


2.6、文本數據統計: wc


作用:

? 收集文本統計數據,包括計數單詞總數、行總數、字節總數和字符總數。
   可以對文件或STDIN中的數據統計。


示例:

    # wc story.txt    
    39   237    1901     story.txt
    行數 單詞數 字節數


常用選項:

? -l 只計數行數;
? -w 只計數單詞總數;
? -c 只計數字節總數;
? -m 只計數字符總數;
? -L 顯示文件中最長行的長度;



2.7、整理文本: sort

實現文本排序;把整理過的文本顯示在STDOUT,不改變原始文件。

語法:

    sort [options] file(s)


常用選項:

? -r 執行反方向(由上至下)整理;
? -n 執行按數字大小整理;
? -f 選項忽略( fold)字符串中的字符大小寫;
? -u 選項(獨特, unique)刪除輸出中的重復行;
? -t c 選項使用c做為字段界定符;
? -k X 選項按照使用c字符分隔的X列來整理;能夠使用多次;


2.8、唯一性處理:uniq


從輸入中刪除前後相接的重復的行。



語法:

? uniq [OPTION]... [FILE]...



選項:

-c: 顯示每行重復出現的次數;
-d: 僅顯示重復過的行;
-u: 僅顯示不曾重復的行;連續且完全相同方為重復;



uniq命令常和sort 命令一起配合使用:
    sort userlist.txt | uniq -c



2.9、比較文件: diff


比較兩個文件之間的區別:

    diff foo.conf foo2.conf    
    
    5c5
    < use_widgets = no
    ---
    > use_widgets = yes    / 註明第5行有區別(改變)/


?

? diff:命令的輸出被保存在一種叫做“補丁”的文件中;
? 使用 -u 選項來輸出“統一的( unified)” diff格式文件,最適用於補丁文件。

2.10、patch


patch:復制在其它文件中進行的改變(要謹慎使用)。


選項:

-b 選項來自動備份改變了的文件


示例:

$ diff -u foo.conf foo2.conf > foo.patch;
$ patch -b foo.conf foo.patch    /使用之前先備份foo.conf文件/;



3、文本三劍客——grep命令


Linux文本處理三劍客:grep、sed、awk;

   grep:文本過濾(模式: pattern)工具;grep, egrep, fgrep(不支持正則表達式搜索)。
? sed: stream editor,文本編輯工具。
? awk: Linux上的實現gawk,文本報告生成器。



grep: Global search REgular expression and Print out the line。

作用:文本搜索工具,根據用戶指定的“模式”對目標文本逐行進行匹配檢查;打印匹配到的行

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


語法:

grep [OPTIONS] PATTERN [FILE...]

示例:

grep root /etc/passwd
grep "$USER" /etc/passwd
grep '$USER' /etc/passwd
grep `whoami` /etc/passwd



命令選項:

    --color=auto: 對匹配到的文本著色顯示。
    -v: 顯示不被pattern匹配到的行。
    -i: 忽略字符大小寫。
    -n: 顯示匹配的行號。
    -c: 統計匹配的行數。
    -o: 僅顯示匹配到的字符串。
    -q: 靜默模式,不輸出任何信息。
    
    -A #: after, 後#行。
    -B #: before, 前#行。
    -C #: context, 前後各#行。
    
    -e:實現多個選項間的邏輯or關系。
        grep –e ‘cat ’ -e ‘dog’ file
    -w:匹配整個單詞。
    -E:使用ERE,支持擴展的正則表達式。。
    -F:相當於fgrep,不支持正則表達式。


4、正則表達式(REGEX)


REGEXP:由一類特殊字符及文本字符所編寫的模式,其中有些字符(元字符)不表示字符字面意義,而表示控制或通配的功能。
程序支持: grep,sed,awk,vim, less,nginx,varnish等


正則表達式分類:

    基本正則表達式: BRE;
    擴展正則表達式: ERE;


正則表達式引擎:

    采用不同算法,檢查處理正則表達式的軟件模塊;
    PCRE( Perl Compatible Regular Expressions)


元字符分類:字符匹配、匹配次數、位置錨定、分組;
正則表達式man幫助獲取:man 7 regex



4.1、基本正則表達式元字符


4.1.1、字符匹配


.  匹配任意單個字符
[] 匹配指定範圍內的任意單個字符
[^] 匹配指定範圍外的任意單個字符
[:alnum:] 字母和數字
[:alpha:] 代表任何英文大小寫字符,亦即 A-Z, a-z
[:lower:] 小寫字母 [:upper:] 大寫字母
[:blank:] 空白字符(空格和制表符)
[:space:] 水平和垂直的空白字符(比[:blank:]包含的範圍廣)
[:cntrl:] 不可打印的控制字符(退格、刪除、警鈴...)
[:digit:] 十進制數字 [:xdigit:]十六進制數字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 標點符號


4.1.2、匹配次數



匹配次數:用在要指定次數的字符後面,用於指定前面的字符要出現的次數。


* 匹配前面的字符任意次,包括0次。貪婪模式,盡可能長的匹配。
.* 任意長度的任意字符
\? 匹配其前面的字符0或1次
\+ 匹配其前面的字符至少1次
\{n\} 匹配前面的字符n次
\{m,n\} 匹配前面的字符至少m次,至多n次
\{,n\} 匹配前面的字符至多n次
\{n,\} 匹配前面的字符至少n次


4.1.3、位置錨定


位置錨定:定位出現的位置。


^ 行首錨定,用於模式的最左側
$ 行尾錨定,用於模式的最右側
^PATTERN$ 用於模式匹配整行
^$ 空行
^[[:space:]]*$ 空白行
\< 或 \b 詞首錨定,用於單詞模式的左側
\> 或 \b 詞尾錨定;用於單詞模式的右側
\<PATTERN\> 匹配整個單詞


4.1.4、分組及後向引用


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


分組括號中的模式匹配到的內容會被正則表達式引擎記錄於內部的變量中,這些變量的命名方式為: \1, \2, \3, ...。
\1 表示從左側起第一個左括號以及與之匹配右括號之間的模式所匹配到的字符;


? 示例:

    \(string1\+\(string2\)*\)
    \1 : string1\+\(string2\)*
    \2 : string2


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


或者: \|

示例: a\|b: a或b C\|cat: C或cat \(C\|c\)at:Cat或cat




5、egrep及擴展的正則表達式

egrep = grep -E

語法:

    egrep [OPTIONS] PATTERN [FILE...]


擴展正則表達式的元字符:

字符匹配:

    . 任意單個字符    
    [] 指定範圍的字符
    [^] 不在指定範圍的字符



次數匹配:

    *:匹配前面字符任意次    
    ?: 0或1次+: 1次或多次
    {m}:匹配m次
    {m,n}:至少m,至多n次


位置錨定:

    ^ :行首    
    $ :行尾
    \<, \b :語首
    \>, \b :語尾



分組及後向引用:

    ():    
    後向引用: \1, \2, ...


或者:|

    a|b: a或b    
    C|cat: C或cat
    (C|c)at:Cat或cat



Linux基礎管理——文本處理(小命令組合解決大問題)