第十一课 正则 9.1~9.7

9.1正则接受_grep{上}

9.2grep{中}

9.3grep{下}

9.4sed{上}

9.5sed{下}

9.6awk{上}

9.7awk{下}

正则接受_grep{上}

正则介绍

  • 正则就是一串有规律的字符串
  • 掌握好正则对编写shell脚本有很大帮助
  • 各种编程语言中都有正则,原理是一样的
  • 常用的工具有grep/egrep、sed、awk

grep

  • grep [-cinvABC] '关键词' filename
  • -c 行数,过滤出的行一共月多少行
  • -i 不区分大小写
  • -n 显示行号
  • -v 取反
  • -r 遍历所有子目录
  • -A 后面跟数字,过滤出符合要求的行以及下面n行
  • -B 同上,过滤出符合要求的行以及上面n行
  • -C 同上,同时过滤出符合要求的行以及上下各n行
  • 过滤指定的关键词,格式为:grep [-cinvABC] '关键词' filename
  • -c:表示打印符合要求的行数
  • -n:表示输出符合要求的行及行号

  • -i:不区分大小写

  • -v:取反,打印不符合要求的行

  • -r:遍历所有子目录

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

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

  • -C:后面跟一个数字,过滤出符合要求的行以及上下各n行

grep{中}

  • grep '[0-9]':表示过滤出包含数字的所有行

  • grep -vn '[0-9]':表示过滤出不包含数字的所有行

  • grep -n '^#':表示过滤出所有已#开头的行,^表示以什么开头,-v 过滤所有不已#开头的行

  • grep  '[^0-9]':表示过滤掉所有数字,^在中括号里表示的意思

  • grep   '^[^0-9]':表示过滤出以非数字开头的行

  • grep  -v '^[^0-9]':表示过滤出以数字开头的行

grep{下}

  • . 表示任意一个任意字符
  •  * 表示零个或多个*前面的字符
  • .* 表示通配,所有的都匹配
  • {} 表示范围,{}花括号前面字符的一个范围
  • +表示一个或多个+号前面的字符
  • ?表示0个或一个问号前面的字符
  • |表示或者

grep 'r.o':表示过滤出任意的一个字符, . 表示任意一个字符

grep 'o*o':表示过滤出零个到多个o*前面的字符

grep '.*':表示过滤出任意字符

grep 'o\ {2\ }' :表示过滤出指定字符出现的次数,{}可以是一个范围,如'o\ {0,3\ }

两种表示方法:egrep 'o{2 }'   grep -E 'o {2 }' 扩展 或者 -E

grep 'o\+o'或者egrep 'o+o'  +号代表前面一次或者多次o  大于1,要用egrep 或者拖义\

grep 'o?t':表示过滤出零个到1o,前面字符的0或者1

grep -E 'root|nologin' ,|表示或者的意思

sed{上}

  • sedgrep比较,sed能实现grep功能,但是比较麻烦,而且没有颜色显示sed优势在于替换一些指定的字符。
  • sed实现grep匹配的功能,匹配关键词用 '//'p -n作用是只显示我们要打印的行

  • sed还支持. * + 等特殊符号 +号得加-r参数

  • sed -nr '/o{2}/'p test.txt,匹配两次o

  • sed -nr '/root|bus/'p test.txt,匹配或者的用法

  • sed -n '2'p test.txt ,打印指定的行 sed -n '2,5'p test.txt,打印2-5行;sed -n '20,$'p test.txt,打印25行到末行,$表示末行

  • sed -n '1,$'p test.txt,全部打印出来
  • sed -e用法,在一行里执行多条命令
  • sed -e '1'p -e '/bus/'p -n test.txt,先打印第一行,然后再匹配含有bus的行

sed{下}

  • sed -n '/bus/'Ip test.txt,匹配不区分大小写

sed删除指定的行

  • sed '1,25'd test.txt,删除1-25行,实际上并没有删掉文件内容,列出剩下的行

  • 加上-i,可以直接删除文件内容

  • sed查找替换,与vim类似;sed '1,10s/root/toor/g' test.txts表示替换关键词,g表示全局替换

  • sed -r '1,10s/ro+/r/g' test.txt,替换的字符串能识别正则表达式

  • head  test txt |sed -r 's/([^:]+):(.*):([^:]+)/\3:\2:\1/' ,替换前十行第一段和最后一段字符串的位置,以冒号为参考对象,小括号里的内容用\1、\2、\3表示

  • head  test txt |sed 's/\/root/123/g' ,将/root替换成123,要用脱义符号\

  • 或者把分隔符/换成#@来区分

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

  • head  test txt |sed -r 's/(.*)/aaa:&/'在所有行前面加上固定字符串,&表示前面小括号内的内容

awk{上}

  • awk兼具sed的所有功能,而且还支持分段

截取文档中某个段

  • 打印文档中的某段,-F作用是指定分隔符

  • 打印所有的段awk -F ':' '{print $0}' test.txt

  • 打印文件的全部内容awk  '{print $0}' test.txt,不需要加F,类似于cat查看文件

  • awk如果不指定分隔符,则默认空格空白为分隔符

  • 打印多段内容awk -F ':' '{print $1,$2,$4}'  test.txt

  • 打印内容可以指定#来分割,需要用到双引号

awk匹配功能

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

  • awk -F ':' '$1 ~ /oo/' test.txt ,打印第一段中包含oo的行,~表示匹配

  • awk -F ':' '$1 ~ /o+/' test.txt ,匹配第一段中包含o的行,支持正则表达式,出现特殊符号时,awk不用加脱义字符,grepsed则必须要加脱义字符

  • awk支持多个表达式一起写

针对数学表达式的用法

  • awk -F ':' '$3==0' test.txt,匹配第3段等于0

  • 只要第一段加{print $1}

  • awk -F ':' '$3>=1000 {print $1}' test.txt,匹配第3段大于等于1000的,并打印所有段

  • awk -F ':' '$3>="1000"{print $0}' test.txt ,“1000”是以ASC码值进行排序的,被认为是字符串,需求是针对数字的不要加双引号

  • awk -F ':' '$7!="/sbin/nologin" {print $0}' test.txt,匹配出第7段不是/sbin/nologin的所有段,!=表示不匹配

awk{下}

  • awk -F ':' '$3<$4'  test.txt,匹配比较第3段小于第4段的行;
  • ;awk -F ':' '$3==$4' test.txt,匹配出第3段和第4段相等的行,==就是等于,精确匹配

  • awk -F ':' '$3>"5" && $3<"7"' test.txt,匹配第3段大于5的,和小于7的行,&&表示并且的意思

  • awk -F ':' '$3>1000 || $7=="/sbin/nologin"' test.txt,匹配第3段大于1000的,或者第7段等于/sbin/nologin的所在的行,|| 表示 或者 的意思

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

awk的内置变量

  • awk -F ':' '{OFS="#"} $3>1000 || $7 ~ /bash/ {print $1 $3 $7}' test.txt,先写OFS中间写条件最后写print语句

  • awk -F ':' '{OFS="#"} {if ($3>1000) {print $1,$2,$3,$4}' test.txt.匹配第3段大于1000,然后打印第1,第2,第3,第4段内容, 并用#分割

  • PFSprint打印时指定的那个分割符{都是数字的}
  • NR 表示行{都是数字的}
  • NF 表示段{都是数字的}

awk -F ':' '{print NR":"$0}' test.txt ,NR表示行号

awk -F ':' '{print NF":"$0}' test.txtNF表示用分隔符分割后每一行一共有多少段

awk -F ':' 'NR<=10' test.txt,打印前10行,awk -F ':' 'NR<=10 && $1 ~ /root|sync' test.txt,匹配前10行中,第1段包含root或者sync

awk -F ':' 'NF==6 && $1 ~ /root|sync/' test.txt,匹配文件中是6段的,并在第1段包含root或者sync

awk -F ':' '{print $NR":"$NF}' test.txt

head -n 3 /etc/passwd |awk -F ':' '$1="root" ',在前3行中,给第1段赋值为root

awk -F ':' '{(tot=tot+$3)}; END {print tot}' test.txt,tot值求和,tot默认0开始,每次和新的第三段值相加,最终第三段值加完,输出tot

猜你喜欢

转载自blog.csdn.net/weixin_42604768/article/details/81810691
9.7