linux 正则

正则 

      

什么是正则

正则就是一串有规律的字符串

掌握好正则对于编写shell脚本有很大帮助

各种编程语言中都有正则,原理是一样的

本章将要学习grep/egrep、sed、awk

 

 

 

grep       //过滤指定关键词

grep [-cinvABC] 'word' filename

 

创建grep目录,将/etc/passwd拷贝到当前目录

5fa865ff73ee101d0be2dc5456d6553fd77.jpg

grep  'word' filename    //过滤出指定的关键词的行

dd4a674cd8b4df49d7d8689a21fd2ae65b5.jpg

-c             //行数,显示出过滤关键词的行号

4f4dff0797ced00ea61dd0b440a74038901.jpg

-i              //不区分大小写,不区分过滤词的大小写

编辑passwd,更改为大写字母

635db2269055435e2ea2ef7452f9bbb9523.jpg

 

0dc0e5a147c42096ff7a3c1447b51cb0cb6.jpg

-n                 //显示行号,显示过滤出关键词的行号

0e7da741d4037fee529adfb61106ed68486.jpg

-v            //取反,过滤出除关键词之外的行

eafd8ef095caaf2fbe7f0baeb83e618ebd0.jpg

-r    遍历所有子目录

cf0fcfc69f9bbaee846a88b65c1258fb69f.jpg

-A 后面跟数字,过滤出符合要求的行以及下面n行

2f075e1590340845ffb5abf78f5b89ca1cb.jpg

-B 后面跟数字,过滤出符合要求的行以及上面n行

9f83326fb240191e034229980cadb436bfb.jpg

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

3089a692cd763f01dcbe42a32cc76e39f99.jpg

 

grep '[0-9]' passwd       //过滤出包含0-9中任意一个字符的行

2e782b9dae712d41cc1e38ac8e97d271b53.jpg

 

grep -v '[0-9]' /etc/inittab             //过滤出不包含数字的行

f612a07a0d0839b1d7fd6d2c6786bd30588.jpg

 

grep -v '^#' inittab          //过滤出不以#开头的行

拷贝/etc/inittab到当前目录,编辑该文件,增加一行字符串

eec6a5411e1236e69a875a34a3d9d8871d5.jpg

 

编辑inittab文件,增加空行及字符串

grep -v '^#' inittab                            //过滤掉以#开头的行

grep -v '^#' inittab |grep -v '^$'       //过滤掉以#开头的行和空行

efe5541441ccd37357382de6594c56689e1.jpg

 

grep  '[^0-9]' inittab        //非0-9的任意一个字符都匹配

301bed8a093d7b7ab68f5496bf3db13ed94.jpg

 

grep  '^[^0-9]' inittab        //以非0-9开头的字符都匹配,[ ]里面的^是取反,外面的^是以[ ]里面的内容开头 

ac5fa09c7ea976870a35e4b54a568a08fc4.jpg

 

grep 'r.o' passwd         //.代表任意一个字符

bed82db02b79c607010f095985055f29c1e.jpg

 

grep 'o*o' passwd           //和*左边的字符重复0到n个,匹配右边o结尾的字符

11e3c5475342427393e95193154843ab0ed.jpg

 

grep 'root.*bash' passwd             //过滤出指定的行

bc212a634cc6fa75250ba665e3b05003d9c.jpg

 

grep 'o\{2\}' /passwd      //过滤出出现2次o的行   

或者              egrep 'o{2}' passwd      ==    grep -E 'o{2}' passwd

6a012244021f03411f5d2ba339bd16cbb7f.jpg

544e9f4317dcb913001a9207d7c3b6e0e74.jpg

eb77dc387c8fd00eb9b16f11a4f7ea483e7.jpg

 

grep 'o\+o' passwd         

或者    egrep 'o+o' passwd      //和+左边的字符重复1到n个

fa82967df29cf8c0e0ce05a1169731c5549.jpg

 

egrep 'o?g' passwd                或者

grep -E 'o?g' passwd              //匹配?前面的字符的0个或者1个

62075f0ae7b178cb6c3c2549d45b636f87b.jpg

 

grep -E 'root|nologin' passwd              //过滤出root的行或者nologin的行

1424cf2b5ccda349269732f60e123b4b21f.jpg

 

egrep '(oo){2}' passwd             //过滤出2对oo的行

adc5b3f402839f8a7576a93aef90a751144.jpg

 

 

 

 

sed      

 

sed -n '/root/'p test.txt            //打印指定关键词的行

5a0367d82fab05cb151288ea3991440ac41.jpg

 

sed -n '5'p test.txt            //打印指定行数

bbb68c60b9f9ac3208d6727ae14ca48526e.jpg

sed -n '2,5'p test.txt     //指定打印行数的范围

acf0a245aa1bc8dbe45ecd23331b637d53e.jpg

sed -n '1,$'p test.txt      //打印第一行到最后一行

59d2c89ede2ede2db9f5913ab606af0dc67.jpg

 

sed -n '/o\+t/'p test.txt        或者

sed -nr '/o+t/'p test.txt   //和+左边的字符重复1到n个,加r参数无需加转义符

59d2c89ede2ede2db9f5913ab606af0dc67.jpg

 

 

sed -e '1'p -e '/root/'p -n test.txt      // -e参数,多次匹配

4af0378edbea483894d33fbb0f3fbfc0405.jpg

 

sed -n '/bus/'p test.txt             //打印出指定关键词的行,加I参数,同时显示大写字符

a0333447669373a8fbfc863ab2401ca8c49.jpg

 

sed '1,10'd test.txt                //删除指定的行,并打印出剩下的行,不是真正的删除

5dee02668dbf9d0e62f138272835c39454d.jpg

sed -i '1,15'd test.txt              //-i参数,直接删除指定的行

63178f3e76eefd346fd0db28662c521e437.jpg

sed -i '/sbin/'d test.txt            //指定字符串删除所在行

04a7c064d09b891b362a9b9b870e445c5bd.jpg

sed '1,10s/root/toor/g' test.txt       //指定范围,将root替换为toor

0a75bf7cef47443a8cc01acec2d58a71e57.jpg

 

sed -r '1,10s/ro+/r/g' test.txt |head         //替换正则,需加-r参数

21e3f7f3a179a7bc41566654917bd6bb330.jpg

 

head test.txt |sed -r 's/([^:]+):(.*):([^:]+)/\3:\2:\1/'      //前10行的第一段替换最后一段

ff9e2e2d807a307d3642b90d07870cc5089.jpg

head test.txt |sed 's/\/root/123/g'            //将/root替换为123,/root前面必须加转义符

9fce4fa9e26457f0c8b9de7a024efd6daa0.jpg

head test.txt |sed 's/\/sbin\/nologin/123/g'

或者 head test.txt |sed 's@/sbin/nologin@123@g'        //将/sbin/nologin替换为123

ad83028f1a241e30d06f76999e1232b5703.jpg

head test.txt |sed 's/[a-zA-Z]//g'           //删除文档中的所有英文字母

af371c709a40b301c20d048753d54f102e3.jpg

 

head test.txt |sed -r 's/(.*)/aaa:&/'         //在所有行的前面加上字符串

61d024556bed63d5dd7d259836f297a019a.jpg

 

 

 

awk

awk -F ':' '{print $1}' test.txt          //指定分割符,打印第一段,不会更改原文件内容

0610dee25567115b523b0cc2dfd145b770b.jpg

 

awk -F ':' '{print $0}' test.txt     //指定分割符,$0打印所有的段

c3d1af14ba4224894deaedde0638bdb4a50.jpg

awk '{print $0}' test.txt          //打印所有内容

10c46947288a3d167a60634816e606840eb.jpg

awk '{print $1}' 1.txt    // 忽略-F,没有指定分割符,默认会以空格或者空白字符为分隔符打印

cb08d39e33a222bfe168ea82ac0926d44dc.jpg

awk -F ':' '{print $1,$3,$4}' test.txt      //打印多段,直接用,

37c67b44d1a65fe093cfb90eb604eab5af0.jpg

awk -F ':' '{print $1"#"$3"#"$4}' test.txt       //指定符号分割

36eb8ee47b365348bf691d5830f0968446e.jpg

 

awk '/oo/' test.txt            //匹配,打印包含oo的行

ca8eabae6c8149e318153449ab7b561d3b5.jpg

 

awk -F ':' '$1 ~ /oo/' test.txt        //指定第一段包含有oo的行

ca8eabae6c8149e318153449ab7b561d3b5.jpg

awk -F ':' '$1 ~ /o+/' test.txt    //指定第一段包含有一个o及以上的行,无需加任何参数

43b7fe4744e44ede50811c970d77643efb2.jpg

 

awk -F ':' '/root/ {print $1,$3} /mail/ {print $1,$3,$4}' test.txt         //支持多个表达式一起写,同时打印出包含root和mail的行指定的段

847e0f29ab56572a88113e75235aaf0c8d5.jpg

awk -F ':' '/root|mail/ {print $0}' test.txt           //同时打印出包含root和mail的行

24dc48c6b1adb13e3e201ab238e67fbd72f.jpg

 

awk -F ':' '$3==0' test.txt       //打印出数值等于0的行

aeb4383724c2ff803666a54ad99c01af5e7.jpg

awk -F ':' '$3==0 {print $1}' test.txt         //打印出数值等于0的行的第一段

c5f6874f669d308eac3f5ec688502cfef49.jpg

awk -F ':' '$3>=100 {print $0}' test.txt         //打印出数值大于等于100的所有行

7c328c97fd3834e394e619f34ede7b79b8f.jpg

awk -F ':' '$3>="100" {print $0}' test.txt       //数字加上双引号默认为字符串

f5c6ded9f5d5d3849f2997f10fcc24e42fb.jpg

awk -F ':' '$7!="/sbin/nologin" {print $0}' test.txt     //打印出第7段不包含/sbin/nologin的行

1ca68eae5c8a86af0c64a25695af0d2f7aa.jpg

awk -F ':' '$3<$4' test.txt       //字段大小比较

255f1bf7335a3a97e362872038ccdee6f0c.jpg

awk -F ':' '$3==$4' test.txt       //第三段等于第四段的行

16db2d8ea541df54aa19fe66ab63480e8fb.jpg

awk -F ':' '$3>"5" && $3<"7"' test.txt         //第三段的字符串大于5并且小于7的行

d7f57ba8c94a232e6311d0973ab39da23e1.jpg

awk -F ':' '$3>100 || $7=="/sbin/nologin"' test.txt   //第三段大于100,或者第七段为/sbin/nologin的行

f5b5172b52778c7c4fba51fafc642979e43.jpg

awk -F ':' '$3>100 || $7 ~ /bash/' test.txt     //第三段大于100,或者匹配第七段包含bash的行

3773107d47e11c027f50e0ffef0e39bfdc0.jpg

awk -F ':' '{OFS="#"} $3>100 || $7 ~ /bash/ {print $1,$3,$7}' test.txt    //OFS指定print输出后的分隔符

c500f18648c2e4adf651f499b33632c2d56.jpg

awk -F ':' '{OFS="#"} {print $1,$3,$7}' test.txt       //不指定条件,输出全部

d0eb6140a89a525cd9df0b7819080addd9a.jpg

awk -F ':' '{OFS="#"} {if ($3>100) {print $1,$2,$3,$4}}' test.txt       //if为条件判断,表示如果第三段大于100,则打印出该行的1-4段,并用#作为分隔符

4b6cbb821b246c740dc1a11a7da2af3be53.jpg

awk -F ':' '{print NR":"$0}' test.txt        //NR参数打印显示所有行数

49c1b8afa5e426399717b7b314b9ba7a712.jpg

awk -F ':' '{print NF":"$0}' test.txt      //NF参数打印显示所有行的段数

0183cb19e68ffb28c529f8600260ce08474.jpg

awk -F ':' 'NR<=10' test.txt           //打印出1到10行

fb8f37fef920c9f2a3e268f0a9fda7dd3e8.jpg

awk -F ':' 'NR<=10 && $1 ~ /root|sync/' test.txt        //打印出1到10行,并且第一段包含root或者sync的行

98d57804f4e9383fda0cbba7f76f53734c8.jpg

awk -F ':' 'NR<=10 && $1 ~ /root|sync/' test.txt       //使用$符号,表示从第一段开始

29d873fc8ccd54fc6450696af545c2f0d25.jpg

head -n 3 test.txt |awk -F ':' '$1="root"'       //将前三行的第一段赋值为root

29d873fc8ccd54fc6450696af545c2f0d25.jpg

head -n 3 test.txt |awk -F ':' '{OFS=":"} $1="root"'      //定义打印出的分隔符

63fc7222c559aa27dd68c117e6053de06b3.jpg

awk -F ':' '{(tot=tot+$3)}; END {print tot}' test.txt       //tot每次循环都会把第三段的值相加,tot默认从0开始,求和第三段的值

712d635653a9c36a2d09351731db3fb1dfc.jpg

 

转载于:https://my.oschina.net/u/3991860/blog/2874924

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值