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

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

 

       前言:本文主要介紹一下Linux中最重要的三個命令,他們在業界被譽爲“三劍客”,它們分別是:awk,sed,grep。它們三個側能的功能不同,grep擅長查找功能,sed擅長取行和替換,awk擅長取列。下面分別介紹三者的主要option和應用實例。

 

一、文本過濾工具grep(egrep)

grep [OPTIONS] PATTERN [FILE...]

 1.1、主要Option

  • --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,相當於egrep
  • -F 相當於fgrep,不支持正則表達式

 1.2、grep應用舉例

  • 查找 文件中包含root的行
grep -n root /etc/passwd

 

 二、流編輯器 --- 強大的替換工具sed

       sed是一種流編輯器,它一次處理一行內容。處理時,把當前處理的行存儲在臨時緩衝區中,稱爲“模式空間”(pattern space),接着用sed命令處理緩衝區中的內容,處理完成後,把緩衝區的內容送往屏幕。然後讀入下行,執行下一個循環。如果沒有使諸如‘D’ 的特殊命令,那會在兩個循環之間清空模式空間,但不會清空保留空間。這樣不斷重複,直到文件末尾。文件內容並沒有改變,除非你使用重定向存儲輸出。

sed [option]... 'script' inputfile

 2.1、主要Option

  • -n 不輸出模式空間內容到屏幕,即不自動打印
  • -e 多點編輯
  • -f /PATH/SCRIPT_FILE: 從指定文件中讀取編輯腳本
  • -r 支持使用擴展正則表達式
  • -i 直接編輯文件
  • -i.bak 備份文件並原處編輯

 

 2.2、Script 定界

  • 不給地址:對全文進行處理
  • 單地址:
    #: 指定的行,$:最後一行
    /pattern/:被此處模式所能夠匹配到的每一行
  • 地址範圍:
    #,#
    #,+#
    /pat1/,/pat2/
    `#,/pat1/
  • ~:步進
    1~2 奇數行
    2~2 偶數行

 

 2.3、編輯命令:

  • d 刪除模式空間匹配的行,並立即啓用下一輪循環
  • p 打印當前模式空間內容,追加到默認輸出之後
  • a [\]text1 在指定行後面追加文本,支持使用\n實現多行追加
  • i [\]text 在行前面插入文本
  • c [\]text 替換行爲單行或多行文本
  • w /path/somefile 保存模式匹配的行至指定文件
  • r /path/somefile 讀取指定文件的文本至模式空間中匹配到的行後
  • = 爲模式空間中的行打印行號
  • ! 模式空間中匹配行取反處理
  • s///:查找替換,支持使用其它分隔符,s@@@,s###

替換標記:
g 行內全局替換
p 顯示替換成功的行
w /PATH/TO/SOMEFILE 將替換成功的行保存至文件中

 2.4、應用實例

  • 打印文件的第二行  
sed -n 2p /etc/passwd

 

三、 報告生成器awk --- 列提取神器

awk [options] 'program' file…

  • program:pattern{action statements;..}
  1. pattern部分決定動作語句何時觸發及觸發事件
    BEGIN,END
  2. action statements對數據進行處理,放在{}內指明
    print, printf

 3.1、主要Option

  • -F 指明輸入時用到的字段分隔符
  • -v var=value 自定義變量

       awk執行時,由分隔符分隔的字段(域)標記1,1,2..n稱爲域標識,n稱爲域標識,0爲所有域。
       省略action,則默認執行 print $0 的操作。


 3.2、變量

  • FS:輸入字段分隔符;
  • OFS:輸出字段分隔符;
  • RS:輸入記錄分隔符;
  • ORS:輸出記錄分隔符;
  • NF:字段數量;
  • NR:記錄號;
  • NFR:各文件分別計數,記錄號。
  • FILENAME:當前文件名;
  • ARGC:命令行的參數;
  • ARGV:數組,保存的是命令行所給定的各參數。

注意:以上都是內置變量,在引用時不需要前面加$,每新建一個變量,都需要加個-v,與變量名之間有無空格都可以,變量可以在引用之後再聲明,但那一行的輸出會輸出空行。

 

 3.3、printf命令

       printf “FORMAT” , item1, item2, ... 不會自動換行,FORMAT中需要分別爲後面每個item指定格式符。

  •  格式符    
     No.                                item                                                          表現形式
 1 %c 顯示字符的ASCII碼
2 %d, %i  顯示十進制整數
3 %e, %E 顯示科學計數法數值
4 %f  顯示爲浮點數
5 %g, %G 以科學計數法或浮點形式顯示數值
6 %s  顯示字符串
7 %u   無符號整數
8 %% 顯示%自身
  • 操作符
     No.                              格式符                                                 item表現形式
1 #[.#] 第一個數字控制顯示的寬度;第二個#表示小數點後精度,%3.1f
2 - 左對齊(默認右對齊) %-15s
3 + 顯示數值的正負符號 %+d
  •   操作符
  1. 算術操作符:x+y, x-y, x*y, x/y, x^y, x%y

-x: 轉換爲負數
+x: 轉換爲數值

  1. 比較操作符:==, !=, >, >=, <, <=
  2. 模式匹配符:~:左邊是否和右邊匹配包含 !~:是否不匹配
  3. 邏輯操作符:與&&,或||,非!
  4. 函數調用:function_name(argu1, argu2, ...)
  5. 條件表達式(三目表達式):selector?if-true-expression:if-false-expression
  • PATTERN:根據pattern條件,過濾匹配的行,再做處理
  • 如果未指定:空模式,匹配每一行
  • /regular expression/:僅處理能夠模式匹配到的行,需要用/ /括起來
  • relational expression: 關係表達式,結果爲“真”纔會被處理
  • line ranges:行範圍 startline,endline:/pat1/,/pat2/不支持直接給出數字格式
  • BEGIN/END模式

 

  • awk控制語句
  1. { statements;… } 組合語句
  2. if(condition) {statements;…}
  3. if(condition) {statements;…} else {statements;…}
  4. while(conditon) {statments;…}
  5. do {statements;…} while(condition)
  6. for(expr1;expr2;expr3) {statements;…}
  7. break
  8. continue
  9. delete array[index]
  10. delete array
  11. exit

 3.4、應用實例

  • 打印文件第一列(文件分隔符爲‘:’)
awk -F ':' '{print $1}' /etc/passwd

 

四、參考文獻

  1. 本文摘自:https://blog.csdn.net/sj349781478/article/details/82930982
  2. awk學習http://blog.chinaunix.net/uid-23302288-id-3785105.html

  
 
    

 

 

 

 

 

 

 

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