Linux 三劍客實例詳解「grep、sed 、awk」

目錄

簡介

正則表達式

大師兄 -- AWK  

二師兄 -- sed

三師兄 -- grep


簡介

Linux 操作文本的三大利器分別是 grep、sed 、awk,簡稱三劍客。

大師兄 awk:最擅長取列;二師兄 sed:最擅長取行;三師兄 grep:最擅長過濾。

正則表達式

元字符 功能 說明
^ 匹配行首 表示以某個字符開頭
$ 匹配行尾 表示以某個字符結尾
^$ 空行 表示空行
. 匹配任意單個字符,包括 0 次 表示匹配一個非換行符的任意字符
* 匹配 0 個或多個字符 表示可重複的任意多個字符
[ ] 匹配指定範圍內的任意單個字符 表示過濾中括弧內的任意單個字符
[^] 匹配不在指定範圍內的字符 表示排除指定範圍內的字符
.* 匹配任意長度任意字符,不包括 0 次 表示任意多個字符
\(..\) 匹配子串 表示匹配子串
& 保存搜索字符用來替換其他字符 表示搜索的字符來替換替他字符

\<

匹配單詞的開始 表示單詞的開始,其後面的任意字符必須作爲單詞的首部出現
\> 匹配單詞的結束 表示單詞的結束,其前面的任意字符必須作爲單詞的尾部出現
x\{m\} 匹配字符 x 出現次數, m 次 表示統計字符 x 的出現次數
x\{m,\} 匹配字符 x 出現次數,至少 m 次 表示統計字符 x 的出現次數,至少 n 次
x\{m,n\} 匹配字符 x 出現次數,至少 m 次,不多於 n 次 表示統計字符 x 的出現次數,在 m 和 n 之間
\? 匹配其前面的字符 1 次或 0 次 表示統計前面的字符出現 1 次或 0 次

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

*** 三位師兄閃亮登場啦 ***

大師兄 -- AWK  

  • awk 是對文本進行格式化的工具,適合處理比較複雜的格式處理。
  • 有多個版本: 1、new awk: nawk ;2、gawk, awk
  • awk 命令格式:

awk [options] 'script' file1  file2, ...

awk [options] 'PATTERN {acticon}'  file1 file2, ...

格式說明:

  1. pattern部分決定動作語句何時觸發及觸發事件:BEGIN、END

  2. action 對數據進行處理,放在{}內指明:print、printf

  3. 最常用的是 print,默認以空白字符分隔

$0 代表整行,$1 代表第 1 段,$2  代表第 2 段,以此類推,$NF 代表最後一個字段,多個字段直接用逗號隔開

awk '{print $1, $2}' xxx.log

打印操作支持拼接打印,如:awk '{print "first" $1, $2}' xxx.log

    4. options 參數:輸入分隔符,默認以空白字符分隔,通過 -F 選項來執行分隔符

awk -F '#' '{print $1,$2}'  test

輸出分隔符,默認情況下輸出分隔符是空格,使用內置變量 OFS 來設定輸出分隔符,需要加上 -v 選項

awk -v OFS="-->" '{print $1,$2}' test

      5. awk 變量

FS:輸入字段分隔符,默認空白字符,一般需要加 -F

OFS:輸出字段分隔符,默認是空格,一般需要加 -v

NF:分隔後的字段數量

NR:當前行的行號

     6. pattern 模式:模式是條件,符合條件的行, awk 纔會進行處理

關係運算模式:awk -F '#' 'NF==5 {print $1}' test

如果行的分段數量爲5 的話,進行打印操作,其他的類似,如 NF>2,NF<4,$1==1234 等都是判斷條件。

awk -F '#'  'NF>=4 && NF<=5 {print $1}' test

二師兄 -- sed

  • sed 是一種流編輯器,它一次處理一行內容。處理時,把當前處理的行存儲在臨時緩衝區中,稱爲“模式空間”,接着用 sed 命令處理緩衝區中的內容,處理完成後,把緩衝區的內容送往屏幕。
  • sed 命令格式:

sed  [options]... 'script' inputfile

選項

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

script 地址定界

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

#:指定的行; $:最後一行

/pattern/:被此處模式所能夠匹配到的每一行
編輯命令

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

替換標記:

  1. g 行內全局替換
  2. p 顯示替換成功的行
  3. w /PATH/TO/SOMEFILE 將替換成功的行保存至文件中

實例說明:

sed -n 2p test     打印第 2 行內容

sed -n 2,5p test    打印第 2--5 行內容

sed -i 's/a/v/g' test    將文件中的 a 全部替換爲 v 「sed替換格式是:sed -i ‘s/要替換的內容/替換成的內容/g' 文件名」

mac 上執行上述命令會報錯 sed: 1: "test": undefined label 'est.txt'

解決方案:增加一個備份的追加名【sed -i '.bak' 's/a/v/g' test】

原因:mac強制要求備份,否則報錯

當然可以不使用其他備份名字,只是用'',就可以只保留一份

sed -i '' 's/a/v/g' test

三師兄 -- grep

  • grep 強大的文本搜索工具,根據模式搜索文本,並將符合模式的文本行顯示出來。
  • gerp 命令格式:

grep 【option】 pattern 【file】

option:

  • -i:忽略字符大小寫

  • -n:顯示匹配的行號

  • -v:顯示沒有被匹配的行

  • --color:將匹配的字符以高亮顏色標記出來

  • -c:統計匹配的行數

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

  • -q:靜默模式,不輸出任何信息

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

  • -v:反轉查找

  • -w:匹配整個單詞

  • -A:after ,顯示後行

  • -B:before ,顯示前行

  • -C:context,顯示前後行

  • -E:相當於 egrep,即 grep -E = egrep

實例說明:

grep -i 'b' test  在文件 test 中查找字符 b

grep -q 'abc' test  靜默執行。不會輸出任何信息,如果命令運行成功返回0,失敗則返回非0值。一般用於條件測試

grep -n 'v' test 查找包含字符 v 的行數

grep -nv 'v' test   查找不包含字符 v 的行數

grep -n v$ test  查找以 v 結尾的行

grep -v 'v' test  反向查找

grep 'ljl' -A 2 test  輸出匹配結果行的後 2 行

grep 'wooow' -B 2 test  輸出匹配結果行的前 2 行

grep 'wooow' -C 2 test   輸出匹配結果行的前後 2 行

grep -n 'abc' test1 test2 test3 或 grep -n 'abc' test*  多個文件查找匹配的結果行


                 (#^.^#)---我是有底線的---(#^.^#)

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