8.5_Linux文本處理工具和grep之正則表達式的使用

Linux文本處理工具使用


文件查看工具的使用


cat 命令的使用 

此命令一般用于查看文件內容比較多

NAME
       cat - concatenate files and print on the standard output
             # 鏈接文件并且以標準輸出打印顯示
             
SYNOPSIS
       cat [OPTION]... [FILE]...

        -n 顯示加行號

        -b 加行號并忽略空行的計算

        -s 忽略相鄰的重復的空行(壓縮空行為一行)

        -v 使用 ^ 和 M- 引用,除了 LFD 和 TAB 之外

        -T 能看到tab出來的空格,顯示為^I

        -A 顯示所有等于-vET

        -E 顯示結束符號$

wKiom1ekkaDxy5cWAAASsLZqgEk765.png

tac 命令的使用

此命令使用方法跟cat一樣,輸出內容跟cat相反

NAME
       tac - concatenate and print files in reverse
             #鏈接文件并且以相反方向顯示
SYNOPSIS
       tac [OPTION]... [FILE]...

wKioL1ekkYGyQw7EAAATI2A2wB0917.png

rev 命令的使用

此命令把所有字符相反排序顯示

NAME
     rev - reverse lines of a file or files
           # 反向顯示文件的行內容
SYNOPSIS
     rev [file ...]

wKioL1ekkTDT-CX-AAATAPQg0yY396.png

more 命令的使用

NAME
     more - file perusal filter for crt viewing
            # 分頁查看文件內容
SYNOPSIS
     more [file ...]

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

wKiom1eklAvD834lAAALfa7va1M882.png

wKioL1eklAuTW00jAAA3n7PCB34336.png

less 命令的使用

一頁一頁地查看文件或STDIN輸出

NAME
       less - opposite of more

當我們使用man命令查看文件幫助的時候,實際上就是調用less進程去查看幫助文件

查看時有用的命令包括:

/文本搜索文本(此時從文本當前位置向下搜索)

?文本搜索文本 (此時從文本當前位置向上搜索)

wKioL1eklZ6w5NQRAAB-Z_F97qc596.png

當使用搜索功能的時候,可使用小寫n跳到下一個,大寫N跳到上一個匹配

head 命令的使用

NAME
       head - output the first part of files
              # 輸出顯示文件的首部內容
SYNOPSIS
       head [OPTION]... [FILE]...

        -c #: 指定獲取前#字節

        -n #: 指定獲取前#行

          -#:指定行數

wKiom1eklyqwuqJhAAAn9Ne79CI167.png當我們只需要查看某文件的前5行內容的時候,可以使用此命令只查看文件的前5行的內容

tail 命令的使用

NAME
       tail - output the last part of files
              # 從文件的尾部查看內容
SYNOPSIS
       tail [OPTION]... [FILE]...

        -c #: 指定獲取后#字節

        -n #: 指定獲取后#行

          -#:指定獲取后#行

        -f: 跟蹤顯示文件新追加的內容,常用日志監控

wKiom1ekmPSgn6M9AAAh0osMV7s653.png

cut 命令的使用

根據指定的分隔符切片,并顯示出需要顯示的片

NAME
       cut - remove sections from each line of files
             # 從文件里面移除選擇的內容
SYNOPSIS
       cut OPTION... [FILE]...

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

        -f數字:指定要顯示的字段             

                #: 第#個字段

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

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

                混合使用:1-3,7

        -c按字符切割

        –output-delimiter=STRING指定輸出分隔符

wKioL1ekm_PhhdY_AAAnUIHcv0A950.png

指定查看以:為分隔符查看文件的第1,3,7的選項

paste 命令的使用

NAME
       paste - merge lines of files
               # 合并多個文件同行號的列到一行
SYNOPSIS
       paste [OPTION]... [FILE]...

        -d 分隔符:指定分隔符,默認用TAB

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

wKioL1emp1HBDn-vAAAx_1yvvWc399.png

分析文本的工具的使用

wc 命令的使用

計數單詞總數、行總數、字節總數和字符總數

NAME
       wc - print newline, word, and byte counts for each file
            # 統計文件顯示的行數、單詞數和字節數
SYNOPSIS
       wc [OPTION]... [FILE]...
       wc [OPTION]... --files0-from=F

            -l來 只計數行數

            -w來 只計數單詞總數

            -c來 只計數字節總數

            -m來 只計數字符總數

wKioL1emqKXD4YFwAAAvr3xJtUg650.png

4 行(文件行數) 9 單詞(文件單詞數) 33 字節(文件大小) /etc/issue (文件名)

sort 命令的使用

把整理過的文本顯示在STDOUT,不改變原始文件

NAME
       sort - sort lines of text files
              #對文本文件進行排序    
SYNOPSIS
       sort [OPTION]... [FILE]...

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

        -n 執行按數字大小整理

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

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

        -t 指定分隔符做為字段界定符

        -k數字 指定分隔后進行比較字段

wKioL1em8CPCWLs3AAAceo_2x1A442.png

-n 對一堆不規則的數字進行排序,-u 并且刪除重復項

uniq 命令的使用

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

NAME
       uniq - report or omit repeated lines
              # 忽略重復的行
SYNOPSIS
       uniq [OPTION]... [INPUT [OUTPUT]]

        -c: 統計每一行出現的次數(靠著的行)

        -d: 僅顯示重復過的行

        -u: 僅顯示不曾重復的行

            連續且完全相同方為重復

wKiom1em9eiD_Q8eAAAPL7ihH4w792.png

對已經排序的文件進行重復次數的統計,此命令通常跟sort一起用:

sort filelist.txt | uniq-c

diff 命令的使用

比較兩個文件之間的區別

NAME
       diff - compare files line by line
              # 比較文件之間的區別
SYNOPSIS
       diff [OPTION]... FILES

         -u 選項來輸出“統一的(unified)”diff格式文件,最適用于補丁文件

wKiom1enA0aSZvQ9AAAObZCxobM024.png

diff的結果第六行和第七行多了一個0出來,看下圖cat的結果,跟出來的結果是一樣的。

wKiom1enA0ah2LsJAAAimTREU9M140.png

patch 命令的使用

命令復制在其它文件中進行的改變(要謹慎使用!)

NAME
       patch - apply a diff file to an original
               # 變化文件應用到原始文件
SYNOPSIS
       patch [options] [originalfile [patchfile]]

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

wKioL1enDyOTZICjAAAps_9LZPQ492.png

修改文件變化的部分(打補?。?/p>

Linux文本處理三劍客之grep以及正則表達式的使用


grep、egrep、fgrep

NAME
       grep, egrep, fgrep - print lines matching a pattern
                            # 顯示匹配到的信息
SYNOPSIS
       grep [OPTIONS] PATTERN [FILE...]
       grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]

grep(Global search REgularexpression and Print out the line.)

作用:文本搜索工具,根據用戶指定的文本模式對目標文件進行逐行搜索,并顯示匹配的行

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

        –color=auto: 對匹配到的文本著色顯示;

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

        -i: 忽略字符大小寫

        -n:顯示匹配的行號

        -c: 統計匹配的行數

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

        -q: 靜默模式,不輸出任何信息,相當于 &> /dev/null,因為不是任何命令都有靜默模式

        -A #: after, 后#行

        -B #: before, 前#行

        -C #:context, 前后各#行

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

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

        -w:整行匹配整個單詞

        -E:使用擴展正則表達式,grep -E = egrep

注意,CentOS 7默認的grep是個別名

wKioL1enF0nhpzRzAAALwYIXh3Q166.png

選項例子

匹配/etc/passwd里面含root字符信息的文字,忽略大小寫,并且顯示其前后3行的內容,顯示行號 

wKiom1en2fuhl-4cAABcEPPvugs756.png

關于grep對各類引用的應用例子

grep root /etc/passwd (匹配文件中包含“root”字符的信息)

wKioL1enGIjyL6BdAAAeVpykBQE189.png

grep "$USER" /etc/passwd (匹配變量$USER信息里面含有的“root”字符信息,""號是弱引用)

wKioL1enGRHguAGUAAAZrc0FeiE641.pngwKiom1enGRGzQ4seAAAHe1ocl8A153.png

grep '$USER' /etc/passwd (匹配“$USER”字符的信息,因為''是強引用,變量不會在執行的時候發生改變,所以沒有匹配到任何的信息)

wKiom1enGWSRMMCqAAAMuTznDrs922.png

grep `whoami` /etc/passwd (匹配命令whoami輸出的字符信息,因為“是命令引用,所以匹配的是whoami輸出的信息)

wKioL1enGXPh47epAAAZPO7iIzo588.png

wKioL1enGXSTM15DAAAHkRlYFsQ599.png

正則表達式

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

程序支持:grep, vim, less,nginx等

正則表達式分兩類:

基本正則表達式:BRE

擴展正則表達式:ERE

grep -E, egrep

正則表達式引擎:

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

幫助手冊查詢 man 7 regex

元字符分類:字符匹配、匹配次數、位置錨定、分組

基本正則表達式元字符

字符匹配:

. :匹配任意單個字符;

[] :匹配指定范圍內的任意單個字符

[^] :匹配指定范圍外的任意單個字符

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

正則表達式字符匹配例子:

匹配任意兩個字符,后面跟著abc其中一個字符,后面再跟著一個非數字的字符

wKioL1en3Hjz-IU8AAAYGHom3e4804.png

分析:haaa , ..(ha),[abc](a),[^[:digit:]](a),符合

      hab3 , ..(ha),[abc](b),[^[:digit:]](3)錯,不符合

      12c3 , ..(12),[abc](c),[^[:digit:]](3)錯,不符號

      12aa , ..(12),[abc](a),[^[:digit:]](a),符號

匹配次數:用在要指定次數的字符后面,用于指定前面的字符要出現的次數

*:匹配前面的字符任意次,包括0次

貪婪模式:盡可能長的匹配

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

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

\+:匹配其前面的字符至少1次

\{n\}:匹配前面的字符n次

\{m,n\}:匹配前面的字符至少m次,至多n次

\{,n\}:匹配前面的字符至多n次

\{n,\}:匹配前面的字符至少n次

正則表達式匹配次數例子:

匹配開頭h至少1次,匹配i零次或1次,匹配123至少1次,至多3次

wKiom1en37vhlfScAAAeD0nqQys815.png

分析:hhhi123 ,h\+ (hhh),i\? (i),123\{1,3\} (123)。符合

     hi123123123 , h\+ (h) , i\? (i),123\{1,3\}(123123123123)一共有4個,所以只取第一個?(這里有個疑問,這個應該是貪婪模式?) 前半部分符合要求

     h123 , h\+ (h),i\? (此處為空,符合), 123\{1,3\} (123) ,符合

     i123 , h\+ (此處為空,不符合),i\? (i) , 123\{1,3\} (123) 

     hii23 ,h\+ (h) , i\? (ii,多了一個i,不符合) ,123\{1,3\} (23,少了1,不符合) 

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

^:行首錨定,用于模式的最左側

$:行尾錨定,用于模式的最右側

^PATTERN$: 用于模式匹配整行

^$: 空行

^[[:space:]]*$ :空白行

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

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

\<PATTERN\>:匹配整個單詞

正則表達式位置錨定的例子:

先舉個反例子,假如要求我們要匹配root的賬號,在沒有錨定位置的情況下,由于operator賬號里帶有root的信息,所以一并匹配了出來。

wKioL1en5LfzhCAGAAAUs5HbGjc494.png

假如我們只想匹配root賬號的信息,其他信息不顯示出來:用^號錨定行首,\>字符錨定單詞結尾,這個意思就是以root為行首,且以root為單詞結尾,匹配出來這樣的信息,就只有一個root賬號了。

wKioL1en5T3AODt6AAAVMfpxVLw750.png

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

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

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

實例:\(string1\+\(string2\)*\)

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

\2: string2

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

正則表達式位置錨定的例子:

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

\1: 匹配“abc123.”,后面的\{2\}即前面的信息“\1”重復2次,所以第一條信息,最后少了一個“.”,不符合要求,第二條信息“abc123.abc123.abc123.”剛好重復了兩次,符號要求。  

wKioL1en7GnC8kt1AAAToR1W9R4661.png

例二:    \2 從左側起,第二個左括號以及與之匹配右括號之間的模式所匹配到的字符,如下圖,即

\2: 匹配“123”,后面的\{2\}即前面的信息“\2”重復2次,所以第一條信息,符合;第二條信息,123只重復了1次,不符合;第三條信息,123重復了3遍,所以只匹配前面符合要求的部分。

wKioL1en7PDS6EeIAAAdi-G6x3A075.png

元字符部分整理

wKiom1enIaKxDkzpAACsPBFGJA8181.png

egrep及擴展的正則表達式

egrep

NAME
       grep, egrep, fgrep - print lines matching a pattern
                            # 顯示匹配到的信息
SYNOPSIS
       grep [OPTIONS] PATTERN [FILE...]
       grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]

用法: egrep = grep -E 

選項內容和用用法跟grep是一樣的,只是支持擴展的正則表達式的表示方式稍微有所不同,但是思想都是一樣的。

wKiom1en8QyB9bukAAAV_siE9HM768.png

擴展正則表達式元字符

字符匹配:

. 任意單個字符

[] 指定范圍的字符

[^] 不在指定范圍的字符

擴展正則表達式字符匹配的例子:

這個跟基本正則表達式的方式完全沒有改變,此例子跟上面的基本正則表達式一樣,就不再詳述意義。

wKioL1en9-jRGyIwAAAqez6NzX8075.png

次數匹配:

*:匹配前面字符任意次

?: 0或1次

+:1次或多次

{m}:匹配m次

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

擴展正則表達式次數匹配的例子:

匹配開頭h至少1次,匹配i零次或1次,匹配123至少1次,至多3次

wKioL1en-Y7AQPY6AAAa1_1gPCk843.png

分析:hhhi123 ,h+ (hhh),i? (i),123{1,3} (123)。符合

     hi123123123 , h+ (h) , i? (i),123{1,3}(123123123123)一共有4個,所以只取第一個?(這里有個疑問,這個應該是貪婪模式?) 前半部分符合要求

     h123 , h+ (h),i? (此處為空,符合), 123{1,3} (123) ,符合

     i123 , h+ (此處為空,不符合),i? (i) , 123{1,3} (123) 

     hii23 ,h+ (h) , i? (ii,多了一個i,不符合),123{1,3} (23,少了一個1,不符合)

可以看見,對于次數匹配的擴展正則表達式的跟基本正則表達式比起來,主要就是少了轉義符號\。這樣看上去的話更加簡潔了。

位置錨定:

^ :行首

$ :行尾

\<, \b :語首

\>, \b :語尾

擴展正則表達式位置錨定的例子:

這個跟基本正則表達式的方式完全沒有改變,這里也不再詳述

wKioL1en8qSyjG79AAAV_siE9HM253.png

分組:

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

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

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

實例:(string1+(string2)*)

\1: string1+(string2)*

\2: string2

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

()

后向引用:\1, \2, …

擴展正則表達式分組的例子:

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

\1: 匹配“abc123.”,后面的{2}即前面的信息“\1”重復2次,所以第一條信息,最后少了一個“.”,不符合要求,第二條信息“abc123.abc123.abc123.”剛好重復了兩次,符號要求。

wKioL1en_MTBO9jPAAASZhGOFw0396.png

例二:    \2 從左側起,第個左括號以及與之匹配右括號之間的模式所匹配到的字符,如下圖,即

\2: 匹配“123”,后面的{2}即前面的信息“\2”重復2次,所以第一條信息,符合;第二條信息,123只重復了1次,不符合;第三條信息,123重復了3遍,所以只匹配前面符合要求的部分。

wKiom1en_MSRS8XeAAAZ2rmHPUc827.png

以上的例子跟基本正則式的要求是一樣的,可以看見,對于分組的擴展正則表達式的跟基本正則表達式比起來,主要就是少了轉義符號\。這樣看上去的話更加簡潔了。

或者:

a|b

C|cat: C或cat

(C|c)at:Cat或cat

這個是基本正則表達式也有的:

wKiom1en_nvz63hxAAAaZUeoYjQ446.png

擴展正則表達式或者的例子:

wKiom1en_uXiGCHaAAAYp8-tIrc456.png

可以看見,對于或者的擴展正則表達式的跟基本正則表達式比起來,主要就是少了轉義符號\。這樣看上去的話更加簡潔了。

總結了一下,其實基本正則表達式功能跟擴展正則表達式功能上基本都一樣,只是有時候需要表達的信息的方法稍微有一點不一樣,正則表達式在實際使用中還是很復雜,例子里面都是一些比較簡單的例子,要能做到快速看明白和熟練使用正則表達式,需要多多練習。

原創文章,作者:~微風~,如若轉載,請注明出處:http://www.www58058.com/29762

(0)
~微風~~微風~
上一篇 2016-08-08
下一篇 2016-08-08

相關推薦

  • yum與rpm包

    yum與rpm包 包命名和工具 包:分類和拆包 Application-VERSION-ARCH.rpm:主包 Application-devel-VERSION-ARCH.rpm 開發子包 Application-utils-VERSION-ARHC.rpm 其它子包 Application-libs-VERSION-ARHC.rpm 其它子包 包之間:可…

    Linux干貨 2017-05-08
  • bash的基礎特性之一

    bash的基礎特性之一 命令歷史:shell進程會保存會話中此前用戶使用過的命令; history:命令的用法 history 【-c】【-d #】 【n】或者【文件名】     -c:清空命令歷史     -d 【#】:刪除指定的命令歷史…

    Linux干貨 2016-12-18
  • 行編輯器sed

    行編輯器sed   Sed,grep,awk命令被稱為文本編輯三劍客,目前學習了grep命令,sed命令 自我覺得sed命令更強大,排名第一,grep暫居第二,awk沒學不太清楚。   這次的博客寫一下剛學習的sed命令,grep命令是全局搜索剪切,sed命令則是逐行進行處理,它一次處理一行內容。Sed命令有兩個空間,…

    2017-08-26
  • grub legacy、內核編譯

    grub legacy grub: GRandUnified Bootloader    grub 0.x: grub legacy    grub 2.x: grub2 grub legacy:        stage1: m…

    Linux干貨 2016-09-13
  • vim文本編輯器練習

    1、復制/etc/profile至/tmp/目錄,用查找替換命令刪除/tmp/profile文件中的行首的空白字符? :%s@^[[:space:]]\+@@gc   2、復制/etc/rc.d/init.d/functions文件至/tmp目錄,用查找替換命令為/tmp/functions的每行開頭為空白字符的行的行首添加一個#號? :%s@^[…

    Linux干貨 2016-08-12
  • 磁盤管理——MBR與GPT的分區

    一、硬盤的結構 這里講的主要是網上所謂的老式磁盤,它是由一個個盤片組成的,我們先從個盤片結構講起。如下圖所示,圖中的一圈圈灰色同心圓為一條條磁道,從圓心向外畫直線,可以將磁道劃分為若干個弧段,每個磁道上一個弧段被稱之為一個扇區(圖中藍色部分)。扇區是磁盤的最小組成單元,通常是512字節           &…

    Linux干貨 2016-09-02
欧美性久久久久