天天看點

文本處理工具及正規表達式

一、抽取文本的工具:less,cat,head,tail,cut

二、分析文本的工具:wc,sort,diff,patch

二、grep及正規表達式

三、egrep擴充正規表達式

一、抽取文本的工具

1)檔案檢視指令:

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

-E: 顯示行結束符$

-n: 對顯示出的每一行進行編号

-A:顯示所有控制符

-b:非空行編号

-s:壓縮連續的空行成一行

tac

功能與cat相同,顯示内容為cat的逆序

2)分頁檢視工具

more:分頁檢視檔案

more [OPTIONS...] FILE...

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

less:一頁一頁地檢視檔案或STDIN輸出

檢視時有用的指令包括:

    /文本 搜尋 文本

    n/N 跳到下一個 or 上一個比對

less 指令是man指令使用的分頁器

3)顯示文本前或後行内容

head

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

    -c #: 指定擷取前#位元組

    -n #: 指定擷取前#行

    -#: 指定行數(同-n#)

tail

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

-c #: 指定擷取後#位元組

-n #: 指定擷取後#行

-#:指定行數

-f: 跟蹤顯示檔案新追加的内容,常用日志監控

4)按列抽取文本cut和合并檔案paste

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

-d DELIMITER: 指明分隔符,預設tab(-d和分隔符之間可以沒有空格)

-f FILEDS:

    #: 第#個字段

    #,#[,#]:離散的多個字段,例如1,3,6

    #-#:連續的多個字段, 例如1-6

    混合使用:1-3,7

-c 按字元切割 --output-delimiter=STRING指定輸出分隔符

cut -d: -f1 /etc/passwd

cat /etc/passwd | cut -d: -f7

cut -c2-5 /usr/share/dict/words

paste 合并兩個檔案同行号的列到一行

-d 分隔符:指定分隔符,預設用TAB

-s : 所有行合成一行顯示

paste f1 f2

paste  -s f1 f2

二、文本分析工具

1)文本資料統計

wc:計數行總數、單詞總數、字元總數(和位元組總數),可以對檔案或STDIN中的資料運作

    wc story.txt

    39   237   1901 story.txt

    行數 字數 字元數 

-l 隻計數行數

-w 隻計數單詞總數

-c 隻計數位元組總數

-m 隻計數字元總數

2)文本排序

sort:把整理過的文本顯示在STDOUT(預設按照字元大小排序) 不改變原始檔案

     sort [options] file(s)

-r 執行反方向(由上至下)整理

-n 執行按數值大小整理

-f 選項忽略(fold)字元串中的字元大小寫

-u 選項(獨特,unique)删除輸出中的重複行

-t  c 選項使用c做為字段界定符

-k  X 選項按照使用c字元分隔的X列來整理 能夠使用多次

3)除重

uniq:從輸入中删除重複的前後相接的行

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

-c: 顯示每行重複出現的次數

-d: 僅顯示重複過的行

-u: 僅顯示不曾重複的行:連續且完全相同方為重複

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

4)比較檔案

diff:逐行比較兩個檔案之間的差別,

    diff [OPTION]... [OLDFILE] [NEWFILE]  顯示oldfile與newfile相比的不同和措施

        diff foo.conf-broken foo.conf-works

        5c5 (注明第5行有差別)

        < use_widgets = no

        ---

        > use_widgets = yes

    -u 顯示變化行的上下文,預設3行(适用于更新檔檔案)

     diff  /PATH/TO/OLDFILE  /PATH/TO/NEWFILE  > /PATH/TO/PATCH_FILE

diff還可用于比較兩個不同目錄,顯示其中每個檔案的差别

patch:複制對檔案改變(向檔案打更新檔)

    patch -i /PATH/TO/PATCH_FILE  /PATH/TO/OLDFILE

    patch  /PATH/TO/OLDFILE < /PATH/TO/PATCH_FILE

    -b 選項來自動備份改變了的檔案

三、grep及正規表達式

1)Linux上文本處理三劍客

grep:文本過濾(模式:pattern)工具

        grep, egrep(支援擴充正規表達式), fgrep(不支援正規表達式搜尋)

sed:stream editor,文本編輯工具

awk:Linux上的實作gawk,文本報告生成器

2)grep: Global search REgular expression and Print out the line

    作用::文本搜尋工具,根據使用者指定的“模式”對目标文 本逐行進行比對檢查;列印比對到的行;     模式:由正規表達式字元及文本字元所編寫的過濾條件

grep [OPTIONS] PATTERN [FILE...]

    grep root /etc/passwd

grep [OPTIONS] PATTERN [FILE...] grep root /etc/passwd

指令選項:

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

-v: 顯示不能夠被pattern比對到的行

-i: 忽略字元大小寫

-n:顯示比對的行号

-c: 統計比對的行數

-o: 僅顯示比對到的字元串

-q: 靜默模式,不輸出任何資訊 (配合echo $? 可用于寫腳本)

-A #:after, 同時顯示後#行

-B #: before, 前#行

-C #:context, 前後各#行

-e:實作多個選項間的邏輯or關系

     grep –e ‘cat ’  -e ‘dog’  file

-w:整行比對整個單詞

-E:使用ERE擴充的正規表達式

3)正規表達式

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

程式支援:grep, vim, less,nginx等

分兩類: 基本正規表達式:BRE          擴充正規表達式:ERE

 元字元分類:字元比對、比對次數、位置錨定、分組

4)基本正規表達式

字元比對

.   : 比對任意單個字元

[]  : 比對指定範圍内的任意單個字元

[^] :比對指定範圍外的任意單個字元

[:digit:]、[:lower:]、[:upper:]、[:alpha:]、[:alnum:] 、[:punct:]、[:space:]

比對次數(預設工作于貪婪模式:盡可能長的比對)

用在要指定次數的字元後面,用于指定前面的字 符要出現的次數

*:比對前面的字元任意次,包括0次

.*:任意長度的任意字元

\?:比對其前面的字元0或1次

\+:比對其前面的字元至少1次

\{m\}:比對前面的字元m次

\{m,n\}:比對前面的字元至少m次,至多n次

\{0,n\}:比對前面的字元至多n次

\{m,\}:比對前面的字元至少m次

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

^:行首錨定,用于模式的最左側(^root  以root開頭的行)

$:行尾錨定,用于模式的最右側(root$  以root結尾的行)

^PATTERN$: 用于模式比對整行(整行隻有此PATTERN)

    ^$: 空行(空白字元也不包括)

    ^[[:space:]]*$ :空白行(空行或包含空白字元的行)

單詞:非特殊字元組成的連續字元(字元串)(包括數字,不包含特殊字元)

\< 或 \b:詞首錨定,用于單詞模式的左側

\> 或 \b:詞尾錨定;用于單詞模式的右側

\<PATTERN\>:比對整個單詞

分組及引用

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

注:分組括号中的模式比對到的内容會被正規表達式引擎記錄 于内部的變量中,這些變量的命名方式為: \1, \2, \3, ...

\1: 從左側起,第一個左括号以及與之比對右括号之間 的模式所比對到的字元

執行個體: \(string1\+\(string2\)*\)

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

    \2: string2

後向引用:引用前面的分組括号中的模式所比對字元(而 非模式本身)

四、egrp及擴充的正規表達式

1)egrep

egrep = grep -E

egrep [OPTIONS] PATTERN [FILE...]

2)擴充正規表達式

字元比對(同基本正規表達式)

次數比對

*:比對前面字元任意次

?: 0或1次

+:1次或多次

{m}:比對m次

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

    {0,n}   {m,}

位置錨定(同基本正規表達式)

分組

()

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

或者

a|b

C|cat: C或cat

(C|c)at:Cat或cat

3)fgrep

不支援正規表達式元字元:當無需用到元字元去編寫模式時,使用fgrep更好