1. 程式人生 > >grep,sed,awk與簡單正則表達式應用

grep,sed,awk與簡單正則表達式應用

Linux學習

grep,sed,awk與簡單正則表達式應用

這裏使用的測試文件是linux /etc/passwd文件,最好是復制一份進行練習,方式對文件內容造成損壞。感覺還是要多練習才能很好的使用,習題這裏就不貼了,網上一找一大把。


grep:

  -o 用作計算出現多少次字段
  -c 打印符合要求的行數
  -n 在輸出符合要求的行的同時也打印行號
  -v 打印不符合要求的行
  -A 後跟一個數字 ps -A2表示打印符合要求的行及下面兩行
  -B 後跟一個數字 ps -B2表示打印符合要求的行及上面兩行

  -C 後跟一個數字 ps -C2 表示打印符合要求的行及上下各兩行
  -r 會把目錄下面的所有文件全部遍歷

過濾出帶有某個關鍵字的行並且輸出行號 grep -n ‘root‘ passwd
過濾出不帶有某個關鍵字的行並且輸出行號 grep -n -v ‘root‘ passwd
過濾出所有包含數字的行並且輸出行號 grep -n ‘[0-9]‘ passwd
過濾出所有不帶有數字的行  grep -n -v ‘[0-9]‘ passwd
去除所有以#號開頭的行:grep -n -v ‘^#‘ passwd
去除所有以#號和空行:grep -v ‘^#‘|grep -v ‘^$‘
過濾出以非數字開頭的行 grep ‘^[^0-9]‘ 1.txt
過濾出所有以英文字母開頭的行 grep ‘[a-zA-Z]‘ passwd
過濾任意一個或多個字符 grep ‘r.o‘ passwd;grep ‘r*t‘ passwd; grep ‘r.*t‘ passwd

^一般表示開頭,但是當在[^]時候會表示排除字符)
[^a]表示“匹配除了a的任意字符”。
[^a-zA-Z0-9]表示“找到一個非字母也非數字的字符”。
[\^abc]表示“找到一個插入符或者a或者b或者c”。
[^\^]表示“找到除了插入符外的任意字符。

* 0個或多個*前面的字符
. 任意一個字符(包括多個字符)
? 表示0個或一個?前面的字符
+ 表示一個或多個+前面的字符
.*表示任意字符不限制數量

註意:

+ ? | grep不支持(要使用-E選項),egrep才支持
(oo)* 0個或多個oo
(oo){1,2} 表示大於1次或2次

sed:(-n和p組合,其他不用)

打印指定行sed ‘10p‘ -n passwd; sed ‘1,4p‘ -n passwd; sed ‘5,$p‘  -n 1.txt
打印包含某個字符串的行 sed -n ‘/root/p‘ passwd 可以使用^ . * $
-e 可以實現同時進行多個任務 sed -e ‘/root/p‘ -e ‘/body/p‘ -n passwd
也可以用;隔開 實現 sed ‘/root/p‘; /body/p‘ -n passwd
刪除行 sed ‘/root/d’  passwd; sed ‘1d‘ passwd; sed ‘1,10d‘ passwd
替換 sed ‘1,2s/ot/to/g‘ passwd 其中s是替換的意思,g是全局替換,否則只是替換一次,/也可以為#,@等
刪除所有的數字 sed ‘s/[0-9]//g‘ passwd
刪除所有的非數字 sed ‘/[^0-9]//g‘ passwd
調換2個字符串的位置 head -n2 passwd | sed ‘s/\(root\)\(.*\)\(bash\)/\3\2\1/‘
直接修改文件內容 sed -i ‘s/ot/to/g‘ passwd
sed ‘s/[a-z]/\u&/g‘ passwd將小寫字母全局轉換為大寫字母
sed ‘s/[A-Z]/\l&g‘ passwd 將大寫字母全部轉換為小寫字母

awk:

截取文檔中的某段 awk -F ‘:‘ ‘{print $1}‘ passwd
也可以使用自定義字符串連接每個段 awk -F ‘:‘ ‘{print $1"#"$2"#"$3"#"$4}‘ passwd
匹配字符或者字符串 awk ‘/oo/‘ passwd
針對某個段匹配 awk -F ‘:‘ ‘$1~/oo/‘ passwd
多次匹配 awk -F ‘:‘ ‘/root/ {print $1,$3};$1 ~/test/;$3 ~/20/‘ passwd
條件操作符: == > < != >= <= 
    awk -F ‘:‘ ‘$3==0‘ passwd
    awk -F ‘:‘ ‘$3>500‘ passwd
    awk -F ‘:‘ ‘$7!="/sbin/nologin"‘ passwd
    awk -F ‘:‘ ‘$3<$4‘ passwd
    awk -F ‘:‘ ‘$3>$5 && $3<$7‘ passwd
    awk -F ‘:‘ ‘$3>$4 || $7="/bin/bash"‘ passwd

awk內置變量 NF(段數) NR(行數)
    head -n3 1.txt | awk -F ‘:‘ ‘{print NF}‘
    head -n3 1.txt | awk -F ‘:‘ ‘{print $NF}‘ 顯示最後一段
    head -n3 1.txt | awk -F ‘:‘ ‘{print NR}‘ 顯示行數
    打印20行之後的行 awk ‘NR>20‘ passwd
    awk -F ‘:‘ ‘NR>20 && $1~/ssh/‘ passwd
    更改某個字段的值awk -F ‘:‘ ‘$1="root"‘ passwd
    數學計算,把第三段和第四段的值相加,並且賦予第七段
        awk -F ‘:‘ ‘{$7=$3+$4;print $0}‘ passwd
    計算第三段的總和 awk -F ‘:‘ ‘{(tot=tot+$3)}; END {print tot}‘ passwd
    awk中也可以使用if關鍵詞 awk -F ‘:‘ ‘{if($1=="root")print $0}‘ passwd

grep,sed,awk與簡單正則表達式應用