grep、sed、awk

正則表達式使用單個字符串來描述、匹配一系列符合某個句法規則的字符串。在很多文本編輯器裏,正則表達式通常被用來檢索、替換那些符合某個模式的文本。

正則表達式由一些普通字符和一些元字符(metacharacters)組成。


檢索工具:grep

grep [-cinvABC] 'word' filename:根據關鍵字或正則表達式在文件中查找匹配的行

  • -c:顯示匹配行數

  • -i:不區分大小寫

  • -n:顯示行號

  • -v:顯示不匹配的行

  • -An:連匹配行的下面n行一起顯示

  • -Bn:連匹配行的上面n行一起顯示

  • -Cn:連匹配行的上下n行一起顯示

  • --color:將匹配到的關鍵字用紅色標識

  • -r:遞歸查詢某個目錄下的所有文件

    • --include=FILE_PATTERN:只搜索匹配表達式的文件

    • --exclude=FILE_PATTERN:不搜索匹配表達式的文件

    • --exclude-dir=PATTERN:不搜索匹配表達式的目錄

正則表達式之元字符

  • '[0-9]' 表示包含任意數字

  • '[a-zA-Z]' 表示包含任意字母

  • '^word' 表示首字符是word

  • 'word$' 表示尾字符是word

  • '^$' 表示空行;在正則表達式中^被定義爲行首,$被定義爲行尾

  • '^[a-zA-Z]' 表示以字母開頭的行

  • '^[^0-9]' 表示以非數字字符開頭的行;說明:在[]裏面加^表示取非

  • . 表示一個任意字符

  • .*表示任意個任意字符,包括空行

    • 以下幾個是用來處理重複字符的元字符

  • * 表示任意個*前面的字符,等價\{0,\};如'r*t'匹配了't'、'rt'、'rrt'…

  • + 匹配1個或1個以上的+前面的字符,等價\{1,\};如'r+t'匹配了'rt'、'rrt'…不匹配'rt'

  • ?匹配0個或1個?前面的字符,等價\{0,1\};如'r\?t'匹配了't'、'rt'

  • c{n} 匹配n個c(字符)

  • c{n,} 匹配n個或n個以上的c

  • c{n,m}匹配字符c的個數範圍表示最少匹配n個c,最多匹配m個c

    • =====================================

  • 'word_1|word_2' 管道符表示,匹配word_1或word_2

  • '(root)?' 小括號表示一個整體,是一個字,主要用來和處理重複字符的元字符結合使用

標藍底的是屬於egrep的擴展元字符如果要在grep中使用egrep的擴展元字符,必須使用-E參數或加\;

如\+、\?、\{n\}、\{n,\}、\{n,m\}、\|、\(word\)


注:可以使用管道符實現多層過濾,如下:只查看文件中可執行的語句。

[root@localhost ~]# grep -v '^#' ~/.bash_profile |grep -v '^$' ~/.bash_profile

空行不包含任何字符。

如需把一個目錄下,所有*.php 文檔中含有 eval 的行 過濾出 [root@localhost ~]# grep -r --include="*.php" 'eval' /data/

^和-v的區別:

grep '^[^0-9]' file 等價 grep -v '^[0-9]' file 匹配非數字字符開頭的行  顯示非數字開頭的行

spacer.gif

wKiom1aqDtKhEHJlAAAdL-X1kNw757.png

grep '[^0-9]' file 不等價 grep -v '[0-9]' file 匹配包含非數字字符的行  顯示不包含數字的行

spacer.gif

wKioL1aqDxqQVXdrAAAbHl26xbA513.png




sed:查找、替換工具

-i:直接修改原文件,默認並不修改,只是打印結果

-r:引用擴展正則表達式

-n:限制打印區域,只打印匹配的行,不加則打印全部內容且匹配的行會重複出現一次

p將前面正則表達式所匹配打印出來

  • sed -n '2p' test.txt 打印第2行

  • sed -n '/root/p' test.txt 打印包含root的行,字符串表達式得用//括起來

  • sed -nr '/root|users/p' test.txt 打印包含root或者users的行

-e:實現多個任務同時進行,也可以使用;實現

  • sed -n -e '/root/p' -e '/mail/p' test.txt 任務一打印匹配root的行,任務二打印匹配mail的行

  • sed  -n '1p;3,$p' test.txt 打印第一行和第三行到最後一行

d將前面正則表達式所匹配到刪除

  • sed '/user/d' test.txt 刪除包含user的行

  • sed '1,3d' test.txt 刪除第1行到第3行

替換字符串和vim編輯器中的方式相同,s是替換的意思,g是全局的意思,/可以用#@代替

sed '4,$s/word1/word2/g' test.txt 從第4行開始將全文中的word1替換成word2

刪除字符串

sed 's/word1//g' test.txt

調換2個字符串的位置

sed -r 's/(word1)(.*)(word2)/\3\2\1/'    1對應第一個小括號,2對應第一個小括號,3對應第一個小括號。

打印某行到某行的內容

sed -n '/word1/,/word2/'p filename 打印word1到word2的行

調換/etc/passwd的第一段和最後一段

sed -r 's/(^[^:]+)(:.*:)([^:]+$)/\3\2\1/g' /etc/passwd


awk:根據預設的分隔符和表達式,對相應區域進行處理並顯示

gawk 是一個模式掃描及處理語言。缺省情況下它從標準輸入讀入並寫至標準輸出。awk可使用變量、關係運算符、if關鍵詞


使用方法:awk '{pattern + action}' {filenames}

儘管操作可能會很複雜,但語法總是這樣,其中 pattern 表示 AWK 在數據中查找的內容,而 action 是在找到匹配內容時所執行的一系列命令。花括號({})不需要在程序中始終出現,但它們用於根據特定的模式對一系列指令進行分組; pattern就是要表示的正則表達式。

變量

  • $n:表示分段後的區域,$1表示第一段,$0表示整行

  • OFS:指定通用分隔符,用於處理結果的顯示

  • NF:該行分段後的區域數量,$NF表示該行最後一段

  • NR:當前處理記錄是已處理文件中的第幾行(當有多個文件對象時)

  • FNR:當前處理記錄是所屬文件中的第幾行

關係運算符

  • >,<,>=,<===,!=,!~

  • 比較數字時,不要加雙引號

命令連接符

  • ;       執行多個任務;等價shell中的命令連接符,將多條awk命令寫在一條awk命令中執行。例如awk '/root/' fruit;awk '$1 ~/admin/ {print $1}' fruit 等價 awk '/root/;$1 ~/admin/ {print $1}' fruit,也可以使用if,如awk '{if (/root/) print $0}{if ($1 ~/admin/) print $1}' fruit

  • ||      設置多個可匹配的表達式 awk '/word1/ || /word1/' fruit

  • &&  


awk '/apple/ || /3/' fruit

算術運算符    +    -    *    /    =

    給$n賦值時,需要給字符串用""而不是//

命令行方式:awk [-F  'field-separator']  'commands'  input-file(s)

-F:指定域分隔符,默認是空格

-v:引用shell變量 -v name=$shell

檢索是否包含某字符串時,得用//括起;sed和awk的匹配規則如果是正則表達式而不是純字符串則無須加//。

    [root@asus test]# awk '/apple/' fruit

可以通過指令控制打印的內容;指令如果沒寫,默認打印匹配的行。

匹配規則可以不寫,指令必須使用{}括起來;多個指令可以根據需求用;號寫在一個{}裏。

[root@asus test]# cat fruit

apple 3 46

banana 3 33

peach 6 43

pear 4 65

strawberry 6 44

watermelon 2 100

cherry 7 100

[root@asus test]# awk -F ' ' '$1=="pear" || $1 ~/water/ {print $1"¥"$2*$3}' fruit

pear¥260

watermelon¥200

[root@asus test]# awk -F ' ' '{if($1=="pear" || $1 ~/water/) print $1"¥"$2*$3}' fruit  

pear¥260

watermelon¥200

[root@asus test]# awk -F ' ' '$1=="pear" || $1 ~/water/ {$4=$2*$3;print $1"="$4"¥"}' fruit 
pear=260¥
watermelon=200¥

[root@asus test]# awk -F " " '$1=="pear" || $1 ~/water/ {OFS="-";$4=$2*$3;print NR,$1"="$4"¥"}' fruit

4-pear=260¥

6-watermelon=200¥

[root@asus test]# 

需要注意的是,沒有設置匹配規則時,每個{}裏的指令都會執行;反之,如果設置了匹配規則且有多個{指令}時,當表達式匹配到相應內容時,第一個{}裏的指令纔會執行,否則,只執行第一個{}後面的指令。簡而言之,就是當表達式生效時,第一個{}纔會執行

[root@asus tesst]# awk -F " " '$1=="pear" || $1 ~/water/ {OFS="-"}{$4=$2*$3;print NR,$1"="$4"¥"}' fruit  

1 apple=138¥

2 banana=99¥

3 peach=258¥

4-pear=260¥

5-strawberry=264¥

6-watermelon=200¥

7-cherry=700¥

[root@asus test]#

所以,一般情況下最好將指令寫在同一個{}內。

可以使用END指定{指令}直到最後才執行 [root@localhost ~]# awk -F ':' '{(tot=tot+$3)}; END {print tot}' 1.txt


awk想打印字符串得加雙引號,如果包含特殊字符就得將他用 單引號 雙引號 特俗字符 雙引號 單引號括起來

 如:awk '{print "This is a '"'"'"$1}' filename 


grep 是專門用於文本檢索的文本編輯工具;sed是tr的升級,可以刪除、打印匹配的行,替換、刪除字符串;awk是cut的升級,不僅可以以行爲單位,還可以將行分段,以域爲單位進行檢索、編輯,還可以控制域輸出,它類似一種數據庫操作語言。grep使用-E參數,sed使用-r參數,而awk使用--posix參數就可以使用擴展表達式符



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