shell正则表达式

一、grep

 

 1.grep概述

  文本过滤命令:grep是一种文本搜索工具,根据用户指定的“模式”对目标文本进行匹配检查,打印匹配到的行;

  grep:由正则表达式或者字符及基本文本字符所编写的过滤条件;

 

 2.grep匹配字符

  -E  ##扩展正则表达式

  grep root passwd   ##模糊过滤root字符

  grep -E "\

  grep -E "\" passwd  ##精确过滤以root字符

  grep -E -i "\" passwd  ##忽略大小写过滤root字符

  grep -E -i "^\" passwd ##忽略大小写过滤以root字符开头的行

  grep -E -i "\$" passwd ##忽略大小写过滤以root字符结尾的行

  grep -E  "root|ROOT" passwd ##模糊过滤root和ROOT字符

 

 3.grep匹配字符出现次数

  grep -E "x.." prc  ##x后至少2个字符

  grep -E "x..\>" prc  ##x后2个字符结尾

  grep -E "x..y\>" prc  ##x..y结尾ie

  grep -E "\" prc  ##x开头,2个字符,y结尾

  grep -E "x*y" prc  ##xy之间x出现任意次

  grep -E  "x?y" prc  ##xy之间x出现0-1次

  grep -E "\

  grep -E "\

  grep -E "\

  grep -E "\<(xy)+" prc ##以xy开头,xy字符最少出现1次

 

 4.用grep编辑脚本ip_show.sh

#!/bin/bash

`ifconfig br0 > /ost/ip_file`

grep -E "inet\ " /ost/ip_file | cut -d " " -f 10

 shell正则表达式_第1张图片

shell正则表达式_第2张图片

二、sed

 

 1.sed概述

  行编辑器:用来操作纯ASCII码的文本

  原理:处理时,把当前处理的行存储在“模式空间”(临时缓冲区),符合模式条件的处理,不符合条件的不处理,处理完成后把缓冲区内容送往屏幕;接着处理下一行,不断重复,直至文件结束;

 

 2.p模式(显示)

 sed -n '/#/p' fstab  ##显示文件带#的行

 sed -n '/#/p' fstab -i fstab  ##将显示结果覆盖掉原文件

 cat -n fstab | sed -ne '3p;6p;8p'  ##显示文件的3,6,8行

 cat -n fstab | sed -ne '1,3!p'  ##不显示文件的1-3行

 

 3.d模式(删除)

 sed '1,4d' fstab   ##删除文件的1、4行

 sed '/^#/d' fstab  ##删除文件以#开头的行

 sed '/^UUID/!d' fstab  ##除了以UUID开头的行都删除

 

 4.a模式(添加)

 sed '/^UUID/a hello' fstab  ##在以UUID开头的那一行后插入hello行

 sed '/^UUID/a hello\ntest' fstab  ##在以UUID开头的那一行后插入2行

 

 5.i模式(插入)

 sed '/^UUID/i hello' fstab  ##在以UUID开头的那一行前插入hello行

 

 6.c模式(替换)

 sed '/^UUID/c hello' fstab  ##将以UUID开头的那一行替换成hello行

 

 练习脚本,改变http服务的接口

[root@foundation77 ost]# vim change_http_port.sh

 

#!/bin/bash

[ -z $1 ] && {

echo please give a num for port

exit 1

}

sed "/^Listen/cListen\ $1" -i /etc/httpd/conf/httpd.conf

systemctl restart httpd

 

[root@foundation77 ost]# vim /etc/httpd/conf/httpd.conf

[root@foundation77 ost]# sh change_http_port.sh 8080

[root@foundation77 ost]# netstat -antuple | grep http

tcp6       0      0 :::8080                 :::*                    LISTEN      0          55387      4455/httpd          

[root@foundation77 ost]# sh change_http_port.sh 80

[root@foundation77 ost]# netstat -antuple | grep http

tcp6       0      0 :::80                   :::*                    LISTEN      0          56426      4539/httpd  

 

 7.w模式(写入)

 sed '/^UUID/w /ost/test' fstab  ##将文件fstab以UUID开头的那一行写入/ost/test

 sed -n '/^UUID/w /ost/test' fstab  ##同上,但是不输出结果

 sed '/^UUID/=' fstab  ##将文件fstab以UUID开头的行号输出

 sed '1r /ost/hello' fstab  ##将/ost/hello文件写入fstab的第1行

 sed '$r /ost/hello' fstab  ##将/ost/hello文件写入fstab的最后1行

 shell正则表达式_第3张图片

 8.其他参数  (-n:只显示匹配空间的内容)

[root@foundation77 ost]# sed -n -f prctise fstab    ##对fstab执行prctise的策略

[root@foundation77 ost]# cat prctise

/^UUID/p

\/^UUID/=

 sed -n -e '/^UUID/p' fstab -e '/^UUID/='  ##同上

 sed 's/s/S/g' fstab  ##将fstab全文的s替换成S

 sed '1,3s/s/S/g' fstab  ##将fstab前3行的s替换成S

 sed '/by/,/man/s/S/\#/g' fstab ##将fstab字符by与man之间的S替换成#

 sed 's@s@S@g' fstab  ##@于/意义相同

 sed 'G' hello  ##在hello文件的每行后插入空行

 sed '$!G' hello  ##除了最后1行,每行后插入空行

 sed '=' hello   ##显示行号

shell正则表达式_第4张图片

[root@foundation77 ost]# sed '=' hello

 

 

 

[root@foundation77 ost]# sed '=' hello | sed 'N;s/\n/ /g'

 

 

 sed -n '$p' hello  ##只打印hello的最后1行

 

三、awk

 

 1.awk概述

   awk处理机制:逐行处理文本,支持在处理第一行之前做一些准备工作,以及在处理完最后一行做一些总结性质的工作

 

 2.awk参数

 awk -F : 'BEGIN{print "NAME"}{print $1}' passwd

  ##以:为分隔符,处理前打印 NAME ,打印第1列

 awk -F : 'BEGIN{print "NAME"}{print $1}END{print NR}' passwd

  ##以:为分隔符,处理前打印 NAME ,打印第1列,处理后打印行数(NF列)

 awk -F : '/bash$/{print $7}' passwd

  ##以:为分隔符,打印以bash结尾行的第7列

 awk -F : '/bash$/' passwd

  ##以:为分隔符,打印以bash结尾行

 awk -F : 'NR==3' passwd

  ##以:为分隔符,打印第3行

 awk -F : 'BEGIN{print "NAME"}NR<=3&&NR>=2{print $1}' passwd

  ##以:为分隔符,处理前打印 NAME ,打印2-3行的第1个字符

 

 练习:

  1.打印能登陆系统且家目录不是/home的用户个数

  awk -F : 'BEGIN{N=0}/$6~/^/home/&&/bash$/{N++}END{print N}' /etc/passwd

  shell正则表达式_第5张图片

shell正则表达式_第6张图片

  2.打印设备eth0的IP

  awk -F = '/IPADDR/{print $2}' /etc/sysconfig/network-scripts/ifcfg-br0

 或者

  ifconfig br0 | awk -F " " '/inet\ /{print $2}'

 shell正则表达式_第7张图片

shell正则表达式_第8张图片

你可能感兴趣的:(shell正则表达式)