zoukankan      html  css  js  c++  java
  • linux运维、架构之路-正则表达式

    一、通配符的含义

    符号

    参数说明

    其他说明

    |

    管道

    把前一个命令结果通过管道传递给后面一个命令

    ;

    命令的分隔符

    ll /oldboy/;cat oldboy.tx

    .

    表示当前目录

    *

    匹配文本或字符串

    ls *.txt,ls *.log

    /

    根或路径的分隔符

    &&

    命令分隔

    表示并且,前一个执行成功才会执行后面的

    $

    取变量的值

    echo $PATH

    {}

    配合echo打印序列

    echo {1..6}

     通配符中以*和{}最为常用

    1、举例说明

    ①查找/oldboy下所有.txt文件

    [root@oldboyedu37 oldboy]# find /oldboy -type f -name "*.txt"
    /oldboy/abc.txt
    /oldboy/oldboy.txt
    /oldboy/a.txt

    ②在/oldboy目录下批量创建10个以文件,例如:oldboy1-oldboy10.txt

    [root@oldboyedu37 oldboy]# touch oldboy{1..10}.txt
    [root@oldboyedu37 oldboy]# ls -lrt
    -rw-r--r-- 1 root root        0 Jun  5 17:58 oldboy9.txt
    -rw-r--r-- 1 root root        0 Jun  5 17:58 oldboy8.txt
    -rw-r--r-- 1 root root        0 Jun  5 17:58 oldboy7.txt
    -rw-r--r-- 1 root root        0 Jun  5 17:58 oldboy6.txt
    -rw-r--r-- 1 root root        0 Jun  5 17:58 oldboy5.txt
    -rw-r--r-- 1 root root        0 Jun  5 17:58 oldboy4.txt
    -rw-r--r-- 1 root root        0 Jun  5 17:58 oldboy3.txt
    -rw-r--r-- 1 root root        0 Jun  5 17:58 oldboy2.txt
    -rw-r--r-- 1 root root        0 Jun  5 17:58 oldboy1.txt
    -rw-r--r-- 1 root root        0 Jun  5 17:58 oldboy10.txt

    ③{}备份文件作用

    [root@oldboyedu37 oldboy]# cp oldboy.txt{,.bak}
    -rw-r--r-- 1 root root       29 Jun  5 18:01 oldboy.txt.bak

    二、正则表达式

    1、基本正则表达式(BRE,basic)

    符号

    参数说明

    其他说明

    ^

    以……开始

    ^word表示以word开始的行或字符串

    [^]

    在[]里面^表示非

    [^word]不包含word的行或字符串

    $

    以……结尾

    word$表示以word结尾的行或字符串

    .

    代表任意一个字符

     

    *

    匹配前一个字符0次或多次

     

    .*

    匹配所有

     

    +

    匹配前一个字符1次或多次

     

    ^$

    表示空行

    可以理解为以结尾开始,或以开始结尾

    {n,m}

    匹配前一个字符n到m

     

    转译符号

    让一个特殊的字符还原它本来的意义

    2、扩展正则表达式(ERE)

    3、正则表达式应用——别名环境变更配置vi/etc/profile

    主要是给grep和egrep加—color过滤出的内容显示颜色

    4、正则表达式使用案例

    ①模拟环境

    [root@oldboyedu37 tmp]# cat oldboy.txt 
    I am oldboy teacher!
    I teach linux.
    I like badminton ball ,billiard ball and chinese chess
    ! my blog is http://oldboy.blog.51cto.com our site is http://www.etiantian.org my qq num is 49000448.
    not
    4900000448. my god ,i am not oldbey,but OLDBOY!

    ②过滤出oldboy.txt以my开头的行

    [root@oldboyedu37 tmp]# grep "^my" oldboy.txt 
    my blog is http://oldboy.blog.51cto.com
    my qq num is 49000448.
    my god ,i am not oldbey,but OLDBOY!

    ③过滤出oldboy.txt以m结尾的行

    [root@oldboyedu37 tmp]# grep "m$" oldboy.txt 
    my blog is http://oldboy.blog.51cto.com

    ④^$、过滤出oldboy.txt文件的空行

    [root@oldboyedu37 tmp]# grep -n "^$" oldboy.txt 
    3:
    8:

    ⑤. 过滤出oldboy.txt以.结尾的行    .在与三剑客配置中有特殊意义,所以使用撬棍转译

    [root@oldboyedu37 tmp]# grep ".$" oldboy.txt 
    I teach linux.
    my qq num is 49000448.
    not 4900000448.

    ⑥.*匹配所有内容 grep ".*" oldboy.txt

    [root@oldboyedu37 tmp]# grep ".*" oldboy.txt 
    I am oldboy teacher!
    I teach linux.
    
    I like badminton ball ,billiard ball and chinese chess!
    my blog is http://oldboy.blog.51cto.com
    our site is http://www.etiantian.org
    my qq num is 49000448.
    
    not 4900000448.
    my god ,i am not oldbey,but OLDBOY!

    ⑦[ABC]过滤出oldboy.txt文件中以m或n或o开头的行,并且以m或g结尾的行

    法一:[root@oldboyedu37 tmp]# grep "^[mon]" oldboy.txt|grep "[mg]$"
    my blog is http://oldboy.blog.51cto.com
    our site is http://www.etiantian.org
    
    法二:[root@oldboyedu37 tmp]# grep "^[mon].*[mg]$" oldboy.txt
    my blog is http://oldboy.blog.51cto.com
    our site is http://www.etiantian.org

    ⑧[^ABC]   排除oldboy.txt文件中以m或n的行

    [root@oldboyedu37 tmp]# grep "^[^mn]" oldboy.txt 
    I am oldboy teacher!
    I teach linux.
    I like badminton ball ,billiard ball and chinese chess!
    our site is http://www.etiantian.org

    5、扩展正则表达式(ERE)egrep

    ①+匹配前一个字符连续出现1次或多次

    [root@oldboyedu37 tmp]# egrep "0+" oldboy.txt 
    my qq num is 49000448.
    not 4900000448.

    ②|配合egrep同时可以过滤多个字符串

    [root@oldboyedu37 tmp]# egrep "3306|1521" /etc/services 
    mysql           3306/tcp                        # MySQL
    mysql           3306/udp                        # MySQL
    ncube-lm        1521/tcp                # nCube License Manager
    ncube-lm        1521/udp                # nCube License Manager

    ③{n,m} 重复前面的字符n到m次

    [root@oldboyedu37 tmp]# egrep "0{1,5}" oldboy.txt 
    my qq num is 49000448.
    not 4900000448.

    6、小试牛刀

    ①利用sed取ip地址

    方法一:
    定位到ip地址所在的行
    [root@oldboyedu37 tmp]# ifconfig eth0|sed -n '2p'
    inet addr:10.0.0.8  Bcast:10.0.0.255  Mask:255.255.255.0
    匹配掐头去尾取想要的内容
    [root@oldboyedu37 tmp]# ifconfig eth0|sed -n '2p'|sed 's#^.*ddr:##g'|sed 's#  Bc.*$##g'
    10.0.0.8
    
    方法二:[root@oldboyedu37 tmp]# ifconfig eth0|sed -n '2p'|sed -r 's#^.*ddr:|Bc.*$##g'
    10.0.0.8
    
    方法三:利用sed的后向引用
    [root@oldboyedu37 tmp]# ifconfig eth0|sed -n '2p'|sed -r 's#^.*ddr:(.*)Bc.*$#1#g'
    10.0.0.8
    
    方法四:sed直接定位所取的行并匹配替换
    [root@oldboyedu37 tmp]# ifconfig eth0|sed -nr '2s#^.*ddr:(.*)Bc.*$#1#gp'
    10.0.0.8

    ②取/etc/hosts文件属性权限

    方法一:[root@oldboyedu37 tmp]# stat /etc/hosts|sed -nr '4s#^.*(0(.*)/-.*$#1#gp'
    644
    方法二:[root@oldboyedu37 tmp]# stat /etc/hosts|sed -n '4p'|sed 's#^.*(0##g'|sed 's#/-.*$##g'
    644
    方法三:利用stat命令带的参数直接取出
    [root@oldboyedu37 tmp]# stat -c %a /etc/hosts
    644

    7、date显示时间

    ①工作中常配合tar命令打包使用

    [root@oldboyedu37 /]# tar zcvf oldboy_$(date +%F).tar.gz oldboy/
    oldboy/
    oldboy/netstat.log
    oldboy/web_url.log
    oldboy/oldboy.txt
    oldboy/t1.awk
    oldboy/access-test.log
    oldboy/.bak
    oldboy/oldboy.log

    ②简写几天前、几天后

    date -d '+3day'    #——>显示3天后的日期时间
    date -d '-3day'    #——>显示3天前的日期时间
    date -d '-3hour'   #——>显示3小时前的日期时间
    [root@oldboyedu37 /]# date +%F -d '-1day'——工作中常用方法打包,打包一天前

     三、AWK格式及使用正则

    1、通过awk取出passwd的第5行内容

    [root@nfs-server oldboy]# awk 'NR==5' passwd 
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

    2、显示passwd第五行的最后一列

    [root@nfs-server oldboy]# awk -F ":" 'NR==5{print $NF}' passwd 
    /sbin/nologin

    3、找出passwd中以root开头的行

    [root@nfs-server oldboy]# awk '/^root/' passwd 
    root:x:0:0:root:/root:/bin/bash

    4、找出passwd第六列中包含home的行

    [root@nfs-server oldboy]# awk -F ":" '$6~/home/' /etc/passwd 
    salt:x:500:500::/home/salt:/bin/bash

    小题:

    已知[root@nfs-server files]# cat reg.txt 
    Zhang Dandan    41117397   :250:100:175
    Zhang Xiaoyu    390320151  :155:90:201
    Meng  Feixue    80042789   :250:60:50
    Wu    Waiwai    70271111   :250:80:75
    Liu   Bingbing  41117483   :250:100:175
    Wang  Xiaoai    3515064655 :50:95:135
    Zi    Gege      1986787350 :250:168:200
    Li    Youjiu    918391635  :175:75:300
    Lao   Nanhai    918391635  :250:100:175
    说明:
    ###第一列是姓氏
    ###第二列是名字
    ###第一第二列合起来就是姓名
    ###第三列是对应的ID号码
    ###最后三列是三次捐款数量

    ①姓氏是Zhang的人,显示他的第二次捐款金额及她的名字

    [root@nfs-server files]# awk -F "[ :]+" '/^Zhang/{print $1,$2,$5}' reg.txt 
    Zhang Dandan 100
    Zhang Xiaoyu 90

    ②显示Xiaoyu的姓氏和ID号码

    [root@nfs-server files]# awk '$2~/Xiaoyu/{print $1,$3}' reg.txt
    Zhang 390320151

    ③显示所有以41开头的ID号码的人的全名和ID号码

    [root@nfs-server files]# awk '$3~/^41/{print $1,$2,$3}' reg.txt 
    Zhang Dandan 41117397
    Liu Bingbing 41117483

    ④显示所有以一个D或X开头的人名全名

    [root@nfs-server files]# awk '$2~/^[DX]/{print $1,$2}' reg.txt 
    Zhang Dandan
    Zhang Xiaoyu
    Wang Xiaoai

    ⑤显示所有ID号码最后一位数字是1或5的人的全名

    [root@nfs-server files]# awk '$3~/[15]$/{print $1,$2}' reg.txt 
    Zhang Xiaoyu
    Wu Waiwai
    Wang Xiaoai
    Li Youjiu
    Lao Nanhai

    ⑥显示Xiaoyu的捐款.每个值时都有以$开头.如$520$200$135

    方法一:[root@nfs-server files]# awk '/Xiaoyu/{print $4}' reg.txt|tr ":" "$"
    $155$90$201
    方法二:
    [root@nfs-server files]# awk '/Xiaoyu/{gsub(/:/,"$",$NF);print $NF}' reg.txt 
    $155$90$201
    方法三:
    [root@nfs-server files]# awk '/Xiaoyu/{print $4}' reg.txt|sed 's#:#$#g'
    $155$90$201

    ⑦显示所有人的全名,以姓,名的格式显示,如Meng,Feixue

    [root@nfs-server files]# awk '{print $1","$2}' reg.txt 
    Zhang,Dandan
    Zhang,Xiaoyu
    Meng,Feixue
    Wu,Waiwai
    Liu,Bingbing
    Wang,Xiaoai
    Zi,Gege
    Li,Youjiu
    Lao,Nanhai

    四、 AWK数组计算

    1、计算/etc/services 文件有多少个空行 awk

    [root@nfs-server files]# awk  '/^$/{i=i+1}END{print i}' /etc/services 
    16

    2、已知:cat url.txt,计算出域名出现的次数

    http://www.etiantian.org/index.html

    http://www.etiantian.org/1.html

    http://post.etiantian.org/index.html

    http://mp3.etiantian.org/index.html

    http://www.etiantian.org/3.html

    http://post.etiantian.org/2.html

    方法一:[root@nfs-server files]# awk -F "[/.]+" '{print $2}' url.txt|sort|uniq -c
          1 mp3
          2 post
          3 www
    方法二:数组方法:[root@nfs-server files]# awk -F "[/.]+" '{hotel[$2]++}END{for(pol in hotel)print pol,hotel[pol]}' url.txt 
    www  3
    mp3  1
    post 2

    3、使用awk计算1加到100

    方法一:[root@nfs-server files]#  awk 'BEGIN{ for(i=1;i<=100;i++) sum=sum+i;print sum}'
    5050
    方法二:
    [root@nfs-server files]# seq 100|awk '{hotel=hotel+$1}END{print hotel}'
    5050

    4、假如现在有个文本,格式如下:

    a  1

    b  3

    c  2

    d  7

    b  5

    a  3

    g  2

    f  6

    d  9

    即左边是随机字母,右边是随机数字,要求写个脚本使其输出格式为:

    a  4

    b  8

    c  2

    d  16

    f  6

    g  2

    解答:

    [root@nfs-server files]# awk '{hotel[$1]=hotel[$1]+$2}END{for(pol in hotel)print pol,hotel[pol]}' a.txt 
    a 4
    b 8
    c 2
    d 16
    f 6
    g 2
    成功最有效的方法就是向有经验的人学习!
  • 相关阅读:
    一个来自红帽的Java垃圾回收算法,试图把停顿时间降到10毫秒以下 原创 2017-01-10 薛命灯
    Filter 配置多个URL-PATTERN
    页面接口防刷 解决思路一nginx
    数据库 原理解析
    程序员提高工作效率的15个技巧【Facebook】
    我总是记不住的那几个代码
    自适应开发
    文字换行
    CSS对字体单位的总结
    页面距离总结
  • 原文地址:https://www.cnblogs.com/yanxinjiang/p/7561309.html
Copyright © 2011-2022 走看看