什么是正则

正则就是一串有规律的字符串 掌握好正则对于编写shell脚本有很大帮助 各种编程语言中都有正则,原理是一样的

grep

grep [-cinvrABC] 'word' filename

-c 行数 -i 不区分大小写 -n 显示行号 -v 取反(除了'word'的行,其他行显示出来)

-r 遍历所有子目录 例: grep -r 'root' /etc/

-A 后面跟数字,过滤出符合要求的行以及下面n行 例:grep -nA2 'root' passwd

-B 同上,过滤出符合要求的行以及上面n行 -C 同上,同时过滤出符合要求的行以及上下各n行

grep/egrep示例

grep -n 'root' /etc/passwd grep -nv 'nologin' /etc/passwd grep '[0-9]' /etc/password //表示0-9范围内的数字的行数都显示出来

grep -v '[0-9]' /etc/password //与grep '[0-9]' /etc/password显示的内容相反,不要0-9数字范围内的行数 grep -v '^#' /etc/password //^是指以什么开头。把不以#开头的行显示出来 grep '[^0-9]' /etc/password //把非数字的字符匹配出来。^放到[]里时意思是非 grep '^[^0-9]' /etc/password //把以非数字开头的显示出来 grep -v '^#' /etc/inittab|grep -v '^$' grep '^[^a-zA-Z]' test.txt grep 'r.o' /etc/password //把r.o的行显示出来。r.o中间的.意思是任意字符 grep 'oo*' /etc/password grep 'o*o' /etc/password //左边的字符重复0-n次 grep '.' /etc/password //.*是指任意一个字符 grep 'o{2}' /etc/passwd //表示o出现两次 egrep 'o{2}' /etc/passwd或grep -E 'o{2}' /etc/passwd(grep -E与egrep一个意思) //与grep 'o{2}' /etc/passwd一致 egrep 'o+' /etc/passwd //+前面字符的1或多次 egrep 'oo?' /etc/passwd //?前面字符0次或1次 egrep 'root|nologin' /etc/passwd //'root|nologin'中间的|意思是或者 egrep '(oo){2}' /etc/passwd //字符oo出现两次

sed工具

sed -n '5'p test.txt //-n的意思是把无关的行数去掉 sed -nr '5'p test.txt //r的意思是不托译 sed -n '1,5'p test.txt //查出1-5行的内容 sed -n '1,$'p test.txt //查出第一行及以后的行数的内容 $是末行的意思 sed -n '/root/'p test.txt 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 //匹配第一行并且匹配出有111字符的行(有重复行数) sed -n '/bus/'Ip test.txt //I的意思是不区分大小写 sed '1'd test.txt //筛除指定行 sed -i '1,25'd test.txt //删除指定行 wc -l +文件名 //显示文件的行数 sed '1,3'd test.txt sed '/oot/'d test.txt sed '1,2s/ot/to/g' test.txt //s的意思是替换,g是全局,1,2是前两行的意思。 把ot换成to sed 's#ot#to#g' test.txt sed -r 's/(.)/aaa:&/' //在每行首位置增加字符 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

awk工具

支持分段 awk -F ':' '{print $1}' test.txt //用:的分隔符把第一行内容显示出来。显示所有是$0

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 //包含oo的行列出来 awk -F ':' '$1 ~/oo/' test.txt //匹配第一段有oo的行 awk -F ':' '/root/ {print $1,$3} /test/ {print $1,$3}' test.txt awk -F ':' '$3=="0"' /etc/passwd //第三段等于0的 awk -F ':' '$3>="500"' /etc/passwd //针对字符串 awk -F ':' '$3>=500' /etc/passwd //第三段大于等于500的 awk -F ':' '$7!="/sbin/nologin"' /etc/passwd //第七段不等于

awk -F ':' '$3<$4' /etc/passwd //$3<$4 awk -F ':' '$3>"5" && $3<"7"' /etc/passwd //$3>5并且$3<7 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}‘ //NF表示行 head -n3 /etc/passwd | awk -F ':' '{print NR}‘ //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