shell正则表达式基本用法grep、sed、awk (附脚本代码演示)

一、正则表达式
     它是一种文本模式匹配(a到z之间字母和特殊字符---元字符);
     它是一种字符串匹配的模式,可以检查一个字符串是否含有某种子串、把要匹配的子串替换 或者 是从某个字符串中
     提取某个条件的子串;
     它就像一个数学公式一样,我们通过它来生成一个公式从海量的数据中匹配出需要的数据;
     常见的命令有   grep、sed、awk。

新建个测试数据 vim file

					ac
					
					ab
					abbc
					abcc
					aabbc
					cabbbc
					acc
					abc
					asb
					aa
					bb
					a_c
					aZc
					aAAAAc
					a  c
					ABC
					
					ccc
					
					dddd
					http://www
					abababab
					c c d
					123
					a3c
					e*f

特殊字符
   1.  定位符 使用技巧:同时指定开头和结尾,是精确匹配;单一指定开头和结尾,是模糊匹配
  ^      指定开头^a    默认指定一个字符
  $      指定结尾a$   默认指定一个字符

 知识点
     egrep 和  grep -E    这两个表达的一样的作用   是增强版的grep
     egrep  "^ac$"   file    这是精确匹配上面我们新建的文件内容

  2.  字符串:匹配字符串
    .    匹配任意一个字符
    ()   字符串分组
    []   定义字符类,匹配中括号里的一个字符,
    [^]  在里面 加 ^ 就是取反
     \   转义字符  例如匹配  a开头  中间* 结尾c的  就可以使用这个转义字符   格式  egrep   "^a\*c$"  file
     |   管道命令  分组  或者关系

 3.限定符 
   *   代表某个字符不出现或者出现多次   egrep "^ab*c$"  file
   ?  和*有点类似,但是代表该字符出现一次或者不出现
   +  表示前面字符出现一次或者多次,但必须出现一次
   {}n,m}  某个字符之后出现,表示该字符最少n次,最多m次
   {m}   正好出现m次

 4.POSIX特殊字符
    [:alpha:]	英文大小写字符,亦A-Z a-z 
	[:alnum:]	英文大小写字符以及数字:亦A-Z a-z 0-9
	[:blank:]	空格键与tab键
	[:cntrl:]	键盘的控制按键
	[:digit:]	数字,亦0-9
	[:graph:]	除去空格符(空格键和tab键)外的其ls它所有符号
	[:lower:]	代表小写字符,亦:a-z
	[:print:]	任何可以被打印出来的字符
	[:punct:]	标点符号
	[:upper:]	大写字符,亦:A-Z
	[:space:]	空白符
	[:xdigit:]	16进位的数字类型,0-9,A-F,a-f的数字与字符

例1 匹配合法ip
      egrep '^((25[0-5] | 2[0-4][[:digit:]] | [01]?[[:digit:]][[:digit:]]?).){3}  (25[0-5] | 2[0-4][[:digit:]] | [01]?[[:digit:]][[:digit::]]?)$'  --color ip.txt
      分析   (25[0-5]  ip取值250-255     
      2[0-4][[:digit:]] 取值200-249
      [01]?[[:digit:]][[:digit:]]?.)  取值0到99
      .) {3}   接着这个代表ip地址的   x . x . x.   出现三次
      (25[0-5] | 2[0-4][[:digit:]] | [01]?[[:digit:]][[:digit::]]?)$'   这是最后一段的ip  没有  .  结尾


例2   匹配座机号码
egrep "^[[:graph:]]{12}$"  "[1-9}[0-9][0-9]?-[1-9][0-9]{6,7}$"

sed命令
  语法
   sed [options] '{command}[flags]' [filename]
    命令选项
    -e script  将脚本中指定的命令添加到处理输入时执行的命令中  多条件,一行中要有多个操作
    -f  script  将文件中指定的命令添加到处理输入时执行的命令中
    -n             抑制自动输出
    -i     			编辑文件内容
    -i.bak		修改时同时创建.bak备份文件
    -r  			使用扩展的正则表达式
    !			取反 (跟着模式条件后与shell有所区别)
	 sed常用内部命令
	 a    			在匹配后添加
	 i				在匹配前添加
	 p				打印	
	 d				删除
	 s				查找替换
	 c				更改
	 y				转换   N   D   P

	flags
 	数字  				表示文本替换的模式
 	g:					表示用新文本替换现有文本的全部实例
 	p:					表示打印原始内容
 	w filename:   将替换的结果写入文本	

 $=  统计文本有多少行    (小技巧)
 sed -n ‘¥=’  filename
 
 脚本演示 :   shell解决DNS负载均衡RS的健康检测
			#! /bin/bash
			caipan1=0 
			caipan2=0 #定义两个裁判变量记录状态
			while true;do 
			ping -c1 192.168.1.1 &> /dev/null
			state=$? 
			if ! [ state -eq 0 ] && [ $caipan1 -eq 0 ];then 
			     sed -i '/192.168.1.1/s/^/;/' dns 
			     /etc/init.d/bind restart
			     caipan1=1
			elif [ state -eq 0 ] && [ $caipan1 -eq 1 ];then
			     sed -i '/192.168.1.1/s/;//' dns 
			     /etc/init.d/bind restart
			     caipan1=0
			fi
			ping -c1 192.168.1.2 &> /dev/null 
			state=$?
			if ! [ state -eq 0 ] && [ $caipan2 -eq 0 ];then 
			     sed -i '/192.168.1.2/s/^/;/' dns 
			     /etc/init.d/bind restart
			     caipan2=1
			elif [ state -eq 0 ] && [ $caipan2 -eq 1 ];then
			     sed -i '/192.168.1.2/s/;//' dns 
			     /etc/init.d/bind restart
			     caipan2=0
			fi
			     sleep 5 #休息5秒,继续工作。
			done

awk语句对输出流的处理
  1. awk介绍
         awk可以实现数据的处理、运算、输出,它认为每一行的数据视为一条记录,每一列视为字段     
         (aaaa\nbbb\n视为行,aaaa     bbb   ccc视为列)
     awk语法
        awk  [options] [BEGIN]{program}[END]{file}
        		常用命令选项
        		-F		fs 指定描绘一行中数据字段的文件分隔符   默认是空格
        		-f		file 指定读取程序的文件名
        		-v		var=value	定义awk程序中使用的变量和默认值
				注意:awk程序脚本由左大括号和右大括号定义,脚本命令必须放置在两个大括号之间,
							由于awk命令行假定脚本是单文本字段括在单引号内。
				awk程序运行的优先级是:
						1)BEGIN: 在开始处理数据流之前执行,可选项(要打印字符串一定要加上BEGIN,
															不然就执行program了。)
						2)program:  如何处理数据流,必选项  (要有数据流才会执行,不然就一动不动了)
						3)END:	处理完数据流后执行,可选选

	2. awk对字段(列)的提取
    		字段相关内置变量
    			$0 		表示整行文本
    			$1		表示文字中的第一个数据字段
    			$2		表示文字中的第二个数据字段
    			$N		表示文字中的第N个数据字段
    			$NF		表示文字中的最后一个个数据字段
    			例  命令格式   awk  '{print $0}'	  filenam
	3. awk对记录(行)的提取
				NR:  指定行号
				例  awk  ‘NR==3(print $0)’	filenam    指定提取第三行。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值