跨行学Linux运维 正则表达式和三剑客

正则表达式(BRE)

基本正则

  • 正则表达式一般以行为单位处理的
  • 一行为单位,一次处理一行
  • 简单  高效  易用
  • 在三剑客中使用的就是正则,在普通命令中使用的就是通配符
符号意思
^查找以…开头的行
$查找以… 结尾的行(注意:结尾是否有空格    cat  -A)
^$空行
.过滤任意单个字符 不匹配空格
*前一个字符重复0次及0次以上
^ .* m以任意字符开始到m
m .* $以m开始到任意字符结束
[abc]或者 在中括号写啥找啥 特殊字符都会被转移
[^abc]中括号中^表示取反
[a-z]或者 匹配序列
[^^$]这里第一个表示取反,第二个就是普通符号

扩展正则(ERE)

符号意思
+前一个字符匹配1次及1次以上
[ ]+ 联合使用或者字符出现1次及1次以上
|或者
{n,m}最少出现n次,最多出现m次
{n}必须出现n次
{n,最少出现n次
{,m}最多出现m次

正则表达式大坑合集:
第一大坑:

*前一个字符连续出现0次或0次以上
Linux三剑客正则表达式01坑
‘1*’0次以上    1   11     111    
‘1*’0次    就会出现所有内容

第二大坑: ^.*m

贪婪匹配到最后一个m

贪婪匹配到最前面的m     m.*$
grep  'm.*$'  oldboy  file

第三大坑:

神奇的[  ]   在括号里的符号   大部分没有特殊的含义    写什么找什么
目前  第一个^ 代表取反

老三 grep

grep 命令用于查找文件里符合条件的字符串

语法格式:
grep ‘字符串’ file
cat file | grep ‘字符串’

参数:

参数意思
-v取反
-i不区分大小写
-r递归过滤
-n显示过滤到内容的行号
-E扩展正则
-o显示匹配过程
-w精确匹配

①  直接可以过滤文件的内容

grep    '过滤内容'    文件目标    #从文件中过滤出包含root的行
PS:因为别名设置了颜色    所以过滤出来内容有颜色显示

②从其他命令的输出过滤内容    过滤屏幕上的内容

   cat   passwd | grep  'root'
   
   ll   |   grep  ‘^-’   ^   #以什么开头

③显示过滤到内容的行号

    grep   -n   'root'    passwd.bak

④过滤出文件中包含   #   的行

      grep    '#'    config

⑤对取得的内容进行取反      但可能出现空行

      grep    -v   '#'     config

⑥过滤文件中的空行     ^$

    grep   -v   '^$'   config    |  grep    -v   '#'

⑦扩展    扩展正则

 egrep     -v   '#| ^$'      config

 grep    -Ev    '#  |   ^$'      config

案例1:查找以…开头的行

[root@xiaoheng ~]# egrep '^I' 1.txt
I am lizhenya teacher! 
I teach linux.
I like badminton ball ,billiard ball and chinese chess!

案例2:查找以…结尾的行

[root@xiaoheng ~]# egrep '!$' 1.txt
I am lizhenya teacher!
I like badminton ball ,billiard ball and chinese chess!

此处要注意结尾可能会有空格
[root@xiaoheng ~]# egrep 'm$' 1.txt
[root@xiaoheng ~]# egrep 'm $' 1.txt
my blog is http: blog.51cto.com
our site is http:www.lizhenya.com

案例3:过滤以 . 或者 !结尾的行(注意:.在正则表示所有符号,所以只想要.需要加撬棍)

[root@xiaoheng ~]# egrep '.$' 1.txt
I am lizhenya teacher!
I teach linux.
test
I like badminton ball ,billiard ball and chinese chess!
my blog is http: blog.51cto.com
our site is http:www.lizhenya.com
my qq num is 593528156
aaaa,
not 572891888887.
^^^^^^^^66$$$$$$$^^^$$
lizhenyalizhenyalizhenya

[root@xiaoheng ~]# egrep '\.$' 1.txt
I teach linux.
not 572891888887.

案例4:过滤出所有的空格
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VvufuGcp-1616647829457)(en-resource://database/544:1)]

案例5:过滤出包含$m的行    注意变量问题

[root@xiaoheng ~]# egrep '$m' 1.txt
[root@xiaoheng ~]# egrep '\$m' 1.txt
^^^^^^^^66$$$$$$$^^^$$m
[root@xiaoheng ~]#

案例6:过滤空行

[root@xiaoheng ~]# egrep '^$' 1.txt


[root@xiaoheng ~]#

案例7:过滤任意单个字符
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RQkxlIz5-1616647829460)(en-resource://database/545:1)]

案例面试题:统计文本中单词出现的次数

[root@xiaoheng ~]# egrep '[a-Z0-9]*' 1.txt -o |sort|uniq -c|sort -nr|head -3
      3 is
      3 I
      2 my

扩展命令:

sort   #  排序   把相同的放在一起    统计某个单词或者字母   或者IP地址出现的次数
     -r  逆序排序
     -n   按数字大小排序
     -k2  第二列
     
uniq    #统计相邻的   -c

老二 sed

作用:
1、查找过滤文件内容
2、 替换内容   直接替换  免交互****
3、如果内容输出到屏幕   临时替换   屏幕上显示的内容替换   但是不影响源文件
4、如果内容不显示到屏幕   则替换源文件   -i
5、增删改查

语法格式:
sed      ‘动作’    文件      
sed      ‘模式    动作’     文件    
sed      ‘过滤内容   动作’    文件
sed      ‘找谁    干啥’     文件
sed       ‘找老王的媳妇     弄她’    文件


sed   之查找过滤文件内容

使用sed查找文件的行    可以直接指定行
精确匹配行
语法:
        sed    ‘np’    file       #显示文件中的第n行    n 为数字
         -n     取消默认输出

作用:过滤文件中有用的行到新的文件中继续使用     > file.txt


案例1:显示文件第三行

sed  -n  '3p'  file

案例2:  显示文件中最后一行

sed  -n   '$p'    file

案例3:显示文件中的第2行到第5行    用逗号分隔   表示区间

sed    -n  '2,5p'   file

案例4:显示文件的第5行 到  最后一行   连续的行

sed -n   '5,$p'   file

sed 之模糊匹配

语法:  sed   ‘/过滤的内容/p’
             //     # 模式    需要过滤的内容   查找的内容
             p     #  print    打印输出到屏幕


案例:模糊匹配文件中包含  root   的行

sed    -n    '/root/p'    file

案例2:匹配文件中从root到adm区间的行

逗号表示范围    字符串之间的范围    过滤时间段好用
sed    -n    '/root/,/adm/p'    file

root开始匹配到adm   如果下面还有root,会继续从root往下匹配,如果有adm则停止,如果没有则下文全部匹配

sed  之增加内容

动作:

动作源单词解释
aappend追加当前行的下一行内容  ‘2a  heng’   file  第三行添加
iinsert插入   2i  heng
cchange替换内容   2c
w把内容定向到新文件中    了解
  • 以上内容只在屏幕上改变,想要改变源文件 需要加   -i
        
    语法:
    sed    ‘找谁    干啥’    1.txt
    sed    ‘2a     内容’       1.txt      # 下一行
    sed     ‘2i       内容’     1.txt      # 在指定行   其他往下顺延
    sed    ‘2c     内容’     1.txt      # 把指定行替换掉

案例1:a   在第二行的下面追加内容

   sed   '2a  oldboy'   1.txt

案例2:i    在当前行插入

sed   '2i  hahahh'   1.txt   

案例3:c    把当前行替换掉

操作:将selinx配置文件,第七行改成disable
sed -i  '7c  SELINUX=disable'    /etc/selinux/config

sed 之替换内容

作用:
替换字符串    替换单词
格式:
         sed    ‘s#找谁#替换成谁#g’     file        #临时替换
案例1:临时替换

sed    's#找谁#替换成谁#g'     file

案例2:永久替换

sed     -i    's#找谁#替换成谁#g'     file          #永久替换

案例3:结合使用   模式+动作方式

sed   -n  '3s#xxx#bbb#gp'   file

案例4:第三行的nnn替换成sss

sed  -n  '3s#nnn#sss#gp'   file

案例5:第三行到最后一行sss替换成ccc

sed  -n  '3,$s#sss#ccc#gp'   file

案例6:将第三行到第6行开头加上 #

sed  -n  '3,6s#^#\##gp'

案例7:查询hehe的一行,然后将那一行开头添加#

sed  -n  '/hehe/s#^#\##gp'   1.txt

vim中的替换:

%s#aaa#bbb#g
%针对所有行
s#aaa#bbb#    替换每一行的第一个过滤的内容
s#aaa#bbb#g     替换每一行中所有过滤的内容

s   sub   #替换标志
g   global    #  全局替换


sed    之删除

d    删除动作
格式:
       sed    ‘3d’   file     #  删除第三行
 
案例:删除第四行

sed  '4d'   file

案例:删除第2到第三行

sed    '2,3d'   file    

案例:  删除包含oldboy 的行

sed     '/root/d'   file    #删除包含root 的所有行

案例:删除aaa到bbb之前的行

sed     '/root/,/old/d'   file

sed  后向引用

sed  -r  支持扩展正则
语法格式:
         想要输出的内容经过正则匹配使用()保护起来
         输出的时候\1就是显示第一个()中的内容   \2显示第二个()的内容
         sed   ‘2s#( )#\1#g’    file

案例1:计算1到10的加法

[root@xiaoheng ~]# echo {1..10}|sed 's# #+#g'|bc
55

案例2:使用seq从1加到100

[root@xiaoheng ~]# seq 100|tr '\n' '+'|sed -r 's#(.*$)#\1\n#g'|sed  's#100+#100#g'
1+2+3+4+5+6+7+8+9+10+11+12+13+14+15+16+17+18+19+20+21+22+23+24+25+26+27+28+29+30+31+32+33+34+35+36+37+38+39+40+41+42+43+44+45+46+47+48+49+50+51+52+53+54+55+56+57+58+59+60+61+62+63+64+65+66+67+68+69+70+71+72+73+74+75+76+77+78+79+80+81+82+83+84+85+86+87+88+89+90+91+92+93+94+95+96+97+98+99+100
[root@xiaoheng ~]# seq 100|tr '\n' '+'|sed -r 's#(.*$)#\1\n#g'|sed  's#100+#100#g'|bc
5050

[root@xiaoheng ~]# seq 100|tr '\n' '+'|sed -r 's#(.*)\+100\+#\1#g'|sed -r 's#(.*)#\1+100\n#g'
1+2+3+4+5+6+7+8+9+10+11+12+13+14+15+16+17+18+19+20+21+22+23+24+25+26+27+28+29+30+31+32+33+34+35+36+37+38+39+40+41+42+43+44+45+46+47+48+49+50+51+52+53+54+55+56+57+58+59+60+61+62+63+64+65+66+67+68+69+70+71+72+73+74+75+76+77+78+79+80+81+82+83+84+85+86+87+88+89+90+91+92+93+94+95+96+97+98+99+100
[root@xiaoheng ~]# seq 100|tr '\n' '+'|sed -r 's#(.*)\+100\+#\1#g'|sed -r 's#(.*)#\1+100\n#g'|bc
5050

案例3:使用后向引用获取IP地址和子网掩码

[root@xiaoheng ~]# ifconfig eth0|sed -n '2p'|sed -r 's#^.*inet(.*) broadc.*$#inet \1#g'
inet  192.168.31.200  netmask 255.255.255.0

[root@xiaoheng ~]# ifconfig eth0|sed -n '2p'|sed -r 's#^.*inet (.*) netmas.*$#\1#g'
192.168.31.200

[root@xiaoheng ~]# ifconfig eth0|sed -n '2p'|sed -r 's#^.*mask (.*) broadc.*$#\1#g'
255.255.255.0

老大 awk

了解awk:
1、编程语言   三个人写的
2、查找匹配文件内容
3、格式化输出结果printf
4、统计数据
5、支持  for  while  if  数组 等

awk主要对哪些文件进行数据统计    部分统计优于python
1》日志文件(服务日志  SSHD  NGINX  MySQL  自研发的服务)
2》系统配置文件
3》常规普通文件
4》命令输出的结果
5》数值运算

awk语法格式:
1、模式     匹配查找字符串的过程   找谁    过滤字符串
2、awk的动作   必须在花括号内
3、只有模式没有动作   默认会执行print输出操作    #py   print     echo   shell 编程
4、如果没有模式(找谁)、默认的是对所有行进行操作

awk   '模式{动作}'    file
awk   '找谁{干啥}'    file
cat  file |awk  '模式{动作}'

awk中的变量(类似于操作系统自带的变量  LANG  PATH  PS1)
    1>NR   行号    把文件的所有行按照顺序都会记录到NR变量中
    2>$0   $1  表示文件所有和文件的第n列
    3> ,   都好在awk中表示空格
    4>  NF   存储了每一行的最后一列的列号

awk取行     NR   行号

awk     '管理行{管理列}'     目标文件
-F管理分隔符

==等于      在大部分的命令中一个等号是赋值    变量的意思
!=   不等于 
>  大于
<  小于
>=   大于等于
<=   小于等于
&&  并且   两端同时成立
||      或者

案例1:输出文件中大于3的行

awk  'NR>3'   file

案例2:输出文件中的第三行

awk  'NR==3'   file

案例3:输出文件中不等于5的行

awk  'NR!==5'   file

案例4:输出文件大于等于3的行

awk  'NR>=3'   file

案例5:输出文件内容等于2并且大于1的行

awk  'NR==2&&NR>1'   file

案例6:查找文件的3-5行

awk  'NR==3,NR==5'  file
awk   'NR>2&&NR<6'   file

awk取列

变量
$0   awk在执行过程中把每一行都复制给$0     $0表示所有文件内容
$1   文件中的第一列
$2   文件中的第二列
$n   文件中的第n列     n代表数字
默认的列是以tab键或空格来分隔的

案例1:$0  输出文件的所有内容

awk  '{print  $0}'   file

案例2:取文件中的列数

语法格式:
awk   ‘{print   $n}’   file        #  输出文件中的第n列

查找行
awk   '模式'   file

查找列
awk    '{动作}'    file             #对文件中所有的行都进行动作处理

案例3:输出文件中的第一列

awk  '{print  $1}'   file

案例4:输出文件中的第一列和最后一列    使用逗号分隔   逗号是awk中的变量

awk  '{print  $1,$NF}'  file

案例5:输出文件中的最后一列  变量NF表示每一行最后一列的总列数

awk  '{print  $NF}'   file

PS:awk中的动作都是变量    取消变量使用双引号
      awk动作中可以输出任何自己想要的字符串    必须加双引号
      awk动作中不在双引号中的字符串都被视为变量

指定分隔符样式
取出/etc/passwd中的第一列
-F   指定分隔符(可指定任意的)    默认以tab键和空格来分隔

①-F的第一种写法   -F":"
awk  -F":"  '{print  $1}'   file

②-F的第二种写法    -F:
awk  -F:    '{print  $1}'   file

案例1:指定多个分隔符[/.;]

awk  -F[./]  '{print  $1}'   file

案例2:指定连续多个分隔符[-=/]+

awk  -F[./]+   '{print  $1}'   file
PS:两个分隔符   在一起的话  中间也是一列
+前一个字符出现1次或1次以上都作为一个分隔符  一刀砍下去

设定多个分隔符
取出passwd中的第六列但是不要 /
awk   -F    指定多个分隔符
语法格式:
           awk     -F      “😕”
           awk     -F      “[😕]”

案例1:使用“:/”视为一个整体作为分隔符

awk  -F:/  file

案例2:使用“[😕]”或者:或者/作为分隔符

awk  -F[:/]   file

案例3:使用“[😕]+”

[:/]+   ===>   对中括号中的符号匹配1次及1次以上  
awk   -F[:/]+  file 

问题1:出现连续的分隔符
[/; ]+   主要是用+

问题2:以单引号或者任意符号作为分隔符
awk  -F’   ‘{print  $3}’   file   单引号需要加撬棍
任意字符都可以作为分隔符


同时取行和列

输出文件内容的第二行的第六列
语法格式:
           awk     ‘模式{动作}’    file
第一种
awk  ‘NR==2{print  $6}’   file

使用模糊匹配
语法格式:
          grep    ‘过滤的内容’    file
          sed    -n    ‘/匹配的内容/p’     file
          awk   ‘/  /’   file
          awk    ‘/ /,/ /’    file

案例1:查找包含root的行

awk  '/root/'   file

案例2:查找包含root或者nologin的行

awk  '/root|nologin/'   file

案例3:区间匹配

awk   '/root/,/bin/'    file

判断

可以是字符串的比对   也可以按照列数判断(数字)
字符串比对
        格式1:$1==“root”     等于root说明成功   成功后执行print动作   &&
        格式2:$3>100      第三列的每一行的数字都和100进行比较   如果动作默认输出  大于100的所有行
比较符号:
         ==       #字符串使用  ==  和  !=
         >
         <
         !=
         >=
         <=
案例1:将文件第一列含有root的行的第二列匹配出来

awk  '$1=="root"{print  $2}'   file

案例2:将文件第一列大于5的行的第二列匹配出来

awk   '$1>5{print  $2}'   file

三剑客的过滤功能总结以及补充

三剑客过滤内容的区别:
grep    ‘过滤的内容’  file
sed    -n   ‘/过滤的内容/p’   file
awk    ‘/过滤的内容/’    file

1、awk按照行来处理文件    文件中多少行就会做多少次print的动作

[root@xiaoheng ~]# awk '{print "o"}' 1.txt
o
o
o
o
o
o

2、
let  i++
i++    i的初始值为0       i++   =====>    i=i+1
获取变量的i的值

3、BEGIN
      作用:在读取文件之前做什么
      语法格式:
               awk     ‘BEGIN{print  1+1}’

[root@xiaoheng ~]# awk 'BEGIN{print "oldboy"}'
oldboy

[root@xiaoheng ~]# awk 'BEGIN{print 1+1}'
2

4、END   执行完文件后做的动作

[root@xiaoheng ~]# awk '{print $2}END{print "好了就到这吧"}' 1.txt
Wu
Liu
Wang
Zi
Li
Lao
好了就到这吧

5、BEGIN   END结合使用
     语法:
       awk     ‘BEGIN{开始前的动作}{读取文件的动作}END{读取文件后的动作}’    file

[root@xiaoheng ~]# awk 'BEGIN{print "开始"}{print $1}END{print "结束"}' 1.txt
开始
1
2
3
4
5
6
结束

[root@xiaoheng ~]# awk 'BEGIN{print "准备好了吗"}{print "everybody  跟我一起来"}END{print "好了就到这吧"}' 1.txt
准备好了吗
everybody 跟我一起来
everybody 跟我一起来
everybody 跟我一起来
everybody 跟我一起来
everybody 跟我一起来
everybody 跟我一起来
好了就到这吧

6、匹配规则
  正则匹配      
awk   ‘/^root/’    file
awk   ‘/bash$/’     file

awk   -F:   ‘$30’   file
awk   -F:    '$1
"root"’    file

awk   -F:   ‘$5 ~ /^root/’   file

awk  -F:   ‘$5 ~ /1/’    file

awk  -F:   ‘$5  !~  /2/’    file

统计行数   wc  -l
案例:

[root@xiaoheng ~]# awk -F: '{print $2}' /etc/passwd|wc -l
23

if判断格式:
    awk   ‘{if(  ){  }eles if(  ){  }eles(  ){   }}END{    }’   /etc/passwd


  1. rh ↩︎

  2. rh ↩︎

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值