Linux三劍客詳解(grep、sed、awk)


前言

  在Linux的學習和使用當中,人們常常提到的三劍客其實指的是grep、sed、awk這三個命令的簡稱,當熟練掌握了這幾個命令,可以極大的提升運維效率。在講到這三個命令之前,我們得先了解什么是正則表達式,正則表達式是學習三劍客的基礎和前提。

一、正則表達式

  正則表達式:Regular Expression,描述了一種字符串匹配的模式(pattern),可以用來檢查一個串是否含有某種子串、將匹配的子串替換或者從某個串中取出復核某個條件的子串等。

標准正則表達式:

    元字符:

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

    字符集合:

   [:alnum:]         代表英文大小寫字符及數字,亦即 0~9、A~Z、a~z
   [:alpha:]          代表任何英文大小寫字符,亦即 A~Z、a~z
   [:blank:]          代表空格鍵與[tab]按鍵兩者
   [:cntrl:]            代表鍵盤上面的控制按鍵,包括CR、LF、Tab、Del等
   [:digit:]            代表數字而已,即 0~9
   [:graph:]          除了空格符(空格鍵與[tab]按鍵)外的其他所有按鍵
   [:lower:]          代表小寫字符,即 a~z
   [:print:]            代表任何可以被打印出來的字符
   [:punct:]          代表標點符號(punctuation symbol),亦即 : " ' ? ! ; : # $
   [:upper:]          代表大寫字符,即 A~Z
   [:space:]          代表會產生空白的字符,包括空格鍵、[tab]、CR等
   [:xdigit:]           代表十六進制的數字類型,因此包括 0~9、A~F、a~f 的數字與字符

   匹配次數(貪婪模式):

   *                      匹配其前面的字符任意次
   ?                    匹配其前面的字符0次或者1次
   +                     匹配其前面的字符至少1次
   .*                     任意長度的任意字符

  位置錨定:

    ^                     錨定行首,此字符后面的任意內容必須出現在行首
    $                     錨定行尾,此字符后面的任意內容必須出現在行尾
    ^$                   空白行

 

因為在Linux系統中shell解釋器的特殊處理,某些元字符在linux下具有展開式等特殊含義,在實際使用過程中,我們需要添加對其進行轉義。

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

\+ : 匹配至少1次;

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

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

\{0,3\} :匹配前面的字符0次至3次均可;

 備注:至少0次,必須要顯示的寫出來

\< 或者 \b :錨定詞首,其后面的任意字符必須作為單詞首部出現

\> 或者 \b :錨定詞尾,其后面的任意字符必須作為單詞的尾部出現

擴展正則表達式:

  字符匹配:
  .                  匹配單個字符
  [abc]           包含abc任意一個字符
  [^abc]          不包含abc任意一個字符

 

  次數匹配(不用再轉義):
  *                  匹配前一個字符任意次
  ?                 匹配其前面的字符1次或者0次
  +                 匹配其前面的字符至少1次
  {m,n}           匹配其前面的字符至少m次,至多n次

  位置錨定:
  \<                詞首
  \>                詞尾

二、grep命令--擅長查找

   grep命令家族有 grep、egrep、fgrep 三個子命令,適用於不通的場景,具體如下:

1.grep 原生的grep命令,使用“標准正則表達式”作為匹配標准

2.egrep 擴展的grep命令,相當於 $(grep -E) ,使用“擴展正則表達式”作為匹配標准

3.fgrep 簡化版的grep命令,不支持正則表達式,但搜索速度快,系統資源使用率低

 

基本語法

grep [options] PATTERN [FILE...]

options部分

-i :忽略大小寫
--color=auto : 高亮匹配上的字符串
-n : 顯示匹配的行號
-c : 統計匹配的行數
-v : 顯示沒有被模式匹配到的行
-o : 只顯示被模式匹配到的字符串
-q : 靜默模式,不輸出任何信息
-A # :after,后#行
-B # :before,前#行
-C # :context,前后各#行
-e :實現多個選項間的邏輯or關系
-w :匹配整個單詞
-E : 使用擴展的正則表達式,egrep = grep -E
-F : 相當於fgrep,不支持正則表達式

PATTERN部分

以字符串的形式來給定匹配模板,可以使用普通字符串以及正則表達式(標准&擴展)

FILE部分

需要查找內容的文件

三、sed命令--擅長取行和替換

 基本語法:

sed [option]  'script'  [input file] ...

option部分

-n :不輸出模式空間中未匹配上的內容stdout到屏幕,即不自動打印
-e :可以在sed命令中指定多個script腳本,多點編輯功能
-f :輸入sed腳本,腳本中寫着編輯命令
-r :支持使用擴展的正則表達式
-i :直接編輯源文件

script部分

 1.不給地址:對全文進行處理

 2.單地址:

    n:指定的第n行,$:最后一行

   /pattern/:被此模式所能夠匹配到的每一行

3.地址范圍:

   n,m :定位從第n行開始至第m行(都是閉區間)

   n,+k  :定位從第n行開始,包括往后的k行

   n,/pattern/ :定位從第n行開始,至指定模式匹配到的那一行

   /pattern1/,/pattern2/ :定位從 pattern1 模式匹配開始,直到 pattern2 模式匹配之間的范圍

4.步進方式:

    1~2 :以1為起始行,然后步進2行向下匹配,即所有的奇數行

    2~2 :以2為起始行,然后步進2行向下匹配,即所有的偶數行

5.編輯命令:

  • d 刪除模式空間匹配的行,並立即啟用下一輪循環
  • p 打印當前模式空間的內容,追加到默認輸出之后
  • a [\] text 在指定行后面追加文本,支持使用\n實現多行追加
  • i [\] text 在行前面插入文本
  • c [\] text 替換行為單行或多行文本
  • w /path/somefile 保存模式匹配的行至指定文件
  • r /path/somefile 讀取指定文件的文本至模式空間中匹配到的行后
  • = 為模式空間中的行打印行號
  • !模式空間中匹配行取反處理
  • s/// :查找替換,支持使用其他分隔符
  •         替換標記: g -- 行內全局替換     p -- 顯示替換成功的行     w  /path/  to  somefile  將替換成功的行保存至文件中

四、awk命令--擅長取列

   awk是一個報表生成器,主要用於格式化輸出。--格式化文本輸出器

語法:

awk [option] 'PATTERN{ACTION STATEMENTS}' FILE

       awk是按照行來讀取文件的,根據輸入分隔符切分成小部分(用內建變量來表示 $0,$1,$2等),$0表示顯示整行

option選項

-F:指明輸入字段的分隔符

-v:用來實現自定義變量   var=value

PATTERN

``:表示處理文件的所有行。

/pattern/ :表示處理正則匹配對應的行。

!/pattern/ :表示處理正則不匹配的行。

關系表達式:比如返回布爾類型的表達式,若結果為真則處理,假則不處理。對於非0非空字符串為真,其余為假。

n:表示處理第n行的文本。

BEGIN/END模式:BEGIN{}表。示僅在開始處理文件中的文本之前執行一次的程序,例如打印表頭。END{}表示文本處理完成之后執行一次,例如匯總數據。

內建變量

FS:輸入字段分隔符,默認為空白字符。也可使用-v指定。

OFS:輸出字段分隔符。使用-v指定。

RS:輸入時的換行符

ORS:輸出時的換行符

NF:每一行的字段數量。加上$NF表示最后一列。

NR:文件的行數,打印出來是打印行號

FNR:多個文件中的行數分別計數

FILENAME:當前文件的文件名

ARGC:參數命令行中參數的個數

ARGV:返回數組,命令行中的每個參數

示例:awk 'BEGIN {print ARGV[0]}' /etc/fstab /etc/issue

           此處ARGV[0] 是awk,固定為第0個參數。ARGV[1]是/etc/fstab,ARGV[2]是/etc/issue

           awk -v FS=':' '{print $1}' -v OFS=':' /etc/passwd

           指明冒號作為輸入及輸出的分隔符。同awk -F:...

自定義變量

方法1:-v var=value(區分字符的大小寫)

方法2:在program中定義

   示例:awk -v test='hello' 'BEGIN {print test}'

             awk 'BEGIN {test='hello' print test}'

五、擴展-格式化打印(printf)

 語法:

printf [format] [文本1] [文本2] ..

 常用格式替換符:

  %s           字符串
  %f            浮點格式
  %c           ASCII字符,即顯示對應參數的第一個字符
  %d,%i     十進制整數
  %o          八進制值
  %u          不帶正負號的十進制值
  %x          十六進制值(a-f)
  %X         十六進制值(A-F)
  %%         表示%本身

常用轉義字符:

  \a            警告字符,通常為ASCII的BEL字符
  \b            后退
  \f             換頁
  \n            換行
  \r             回車
  \t             水平制表符
  \v            垂直制表符
  \\             表示\本身


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM