2.正則

[TOC]shell

一,DAY4


1.什麼是正則

  • 正則是一串有規律的安符串
  • 掌握好正則對於編寫shell腳本有很大幫助
  • 名種編程語言中都有正則,原理是同樣的
  • 本章將要學習grep/egrep、sed、awk (egrep是grep的擴展)

2.grep

  • grep [-cinvABC] 'word' filename
  • -c行數
  • -i 不區分大小寫
  • -n 顯示行號
  • -v 取反
  • -r遍歷全部子目錄
  • -A後面跟數字,過濾出符合要求的行以及下面n行
  • -B同上,過濾出符合要求的行以及上面n行
  • -C同上,同時過濾出符合要求的行以及上下各n行編程

    • 演示
    [root@localhost grep]# grep -c 'root' passwd 
    2
    [root@localhost grep]# grep -n 'root' passwd 
    1:root:x:0:0:root:/root:/bin/bash
    10:operator:x:11:0:operator:/root:/sbin/nologin
    
    [root@localhost grep]# grep -nv 'nologin' passwd 
    1:root:x:0:0:root:/root:/bin/bash
    6:sync:x:5:0:sync:/sbin:/bin/sync
    7:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    8:halt:x:7:0:halt:/sbin:/sbin/halt
    
    [root@localhost grep]# grep -nA2 'root' passwd 
    1:root:x:0:0:root:/root:/bin/bash
    2-bin:x:1:1:bin:/bin:/sbin/nologin
    3-daemon:x:2:2:daemon:/sbin:/sbin/nologin
    --
    10:operator:x:11:0:operator:/root:/sbin/nologin
    11-games:x:12:100:games:/usr/games:/sbin/nologin
    12-ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    
    [root@localhost grep]# grep -nB2 'root' passwd 
    1:root:x:0:0:root:/root:/bin/bash
    --
    8-halt:x:7:0:halt:/sbin:/sbin/halt
    9-mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    10:operator:x:11:0:operator:/root:/sbin/nologin
    
    [root@localhost grep]# grep -nC2 'root' passwd 
    1:root:x:0:0:root:/root:/bin/bash
    2-bin:x:1:1:bin:/bin:/sbin/nologin
    3-daemon:x:2:2:daemon:/sbin:/sbin/nologin
    --
    8-halt:x:7:0:halt:/sbin:/sbin/halt
    9-mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    10:operator:x:11:0:operator:/root:/sbin/nologin
    11-games:x:12:100:games:/usr/games:/sbin/nologin
    12-ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

    grep/egrep示例

grep -n 'root' /etc/passwd   
 grep -nv 'nologin' /etc/passwd
 grep '[0-9]'/etc/inittab        過濾包含數字0到9的行
 grep -v '[0-9]'/etc/inittab     過濾不包含數字0到9的行
 grep -v '^#' /etc/inittab       過濾給不以#號開頭的行
 grep -v '^#' /etc/inittab|grep -v '^$'    過濾出不以#號開頭以及空行的行 
 grep -n '^[^0-9]' passwd            過濾出以非數字開頭的行
 grep '^[^a-zA-Z]' test.txt    過濾出非a-z A-Z 開頭的行
 grep 'r.o' test.txt       .點表示任意一個字符,
 grep 'o*' test.txt       *表示*號左邊的那個字符可重複0-n次,有o和沒有o的行都會過濾出來
 grep '.*' test.txt           .* 點星表示任意個任意字符
 grep 'o\{2\}' /etc/passwd     在正則中花括號表示前面字符的重複範圍,o\{2\}表示o出現兩次,這裏使用\是由於使用grep時花括號須要脫意
 egrep 'o{2}' /etc/passwd     使用egrep時,能夠不使用脫意符號 ,過濾出o連續出現兩次的行,像這樣aobo不連續的不會過濾
 egrep 'o+' /etc/passwd      +號表示+號左邊字符可得復1-n次
 egrep 'oo?' /etc/passwd     ?號表示前面那個字符重複0-1次, 包含0個o的或者1個o的都會過濾出來
 egrep 'root|nologin' /etc/passwd   | 表示或者的意思,過濾出包含root或者nologin的行
 egrep '(oo){2}' /etc/passwd        過濾出oo連續出現兩次的行

sed

sed也能實現grep的功能,可是比較麻煩,sed的強項是替換指定字符
sed -n '5'p test.txt 
 sed -n '1,5'p test.txt
 sed -n '1,$'p test.txt
 sed -n '/root/'p test.txt   -n表示只匹配有root的行,不加-n會把全部的行打印出來,p表示打印的意思 
 sed -n '/o\+t/'p passwd     
 sed -nr '/o+t/'p passwd     和sed -n '/o\+t/'p passwd同樣,加-r就能夠不用脫意符號
 sed -n '/^1/'p test.txt
 sed -n 'in$'p test.txt
 sed -n '/r..o/'p test.txt
 sed -n 'oo*'p test.txt
 sed -e '1'p -e '/111/'p -n test.txt

 sed '1'd test.txt
 sed '1,3'd test.txt
 sed '/oot/'d test.txt
 sed '1,2s/ot/to/g' test.txt
 sed 's#ot#to#g' test.txt
 sed 's/[0-9]//g' test.txt
 sed 's/[a-zA-Z]//g' test.txt
 sed -r 's/(rot)(.*)(bash)/\3\2\1/' test.txt
 sed 's/^.*$/123&/' test.txt
 sed -i 's/ot/to/g' test.txt

二,DAY5

awk

head -n2 test.txt|awk -F ':' '{print $1}'
 head -n2 test.txt|awk -F ':' '{print $0}'
 awk -F ':' '{print $1"#"$2"#"$3"#"$4}'
 awk '/oo/' test.txt
 awk -F ':' '$1 ~/oo/' test.txt
 awk -F ':' '/root/ {print $1,$3} /test/ {print $1,$3}' test.txt
 awk -F ':' '$3=="0"' /etc/passwd
 awk -F ':' '$3>="500"' /etc/passwd
 awk -F ':' '$3>=500' /etc/passwd 
 awk -F ':' '$7!="/sbin/nologin"' /etc/passwd

awk -F ':' '$3<$4' /etc/passwd
 awk -F ':' '$3>"5" && $3<"7"' /etc/passwd
 awk -F ':' '$3>1000 || $7=="/bin/bash"' /etc/passwd
 head -5 /etc/passwd |awk -F ':' '{OFS="#"} {print $1,$3,$4}‘
 awk -F ':' '{OFS="#"} {if ($3>1000) {print $1,$2,$3,$4}}' /etc/passwd
 head -n3 /etc/passwd | awk -F ':' '{print NF}‘
 head -n3 /etc/passwd | awk -F ':' '{print NR}‘
 awk 'NR>40' /etc/passwd
 awk -F ':' 'NR<20 && $1 ~ /roo/' /etc/passwd
 head -n 3 /etc/passwd |awk -F ':' '$1="root"‘
 awk -F ':' '{(tot=tot+$3)}; END {print tot}' /etc/passwd
 awk -F ':' '{if ($1=="root") {print $0}}' /etc/passwd
相關文章
相關標籤/搜索