zoukankan      html  css  js  c++  java
  • shell脚本之正则表达和文本处理(文本处理三剑客:1、grep 2、sed 3、awk)

    文本处理三剑客:1、grep  2、sed  3、awk

    一、grep:(过滤)

    grep的使用,主要的参数有:

    -n  :显示行号;
    -o  :只显示匹配的内容
    -q  :静默模式,没有任何输出,得用echo$?来判断执行成功没有,即有没有过滤到想要的内容

    -l  :如果匹配成功,则只将文件名打印出来,失败则不打印,通常-rl一起用,grep -rl 'root' /etc 
    -A  :如果匹配成功,则将匹配行及其后n行一起打印出来
    -B  :如果匹配成功,则将匹配行及其前n行一起打印出来
    -C  :如果匹配成功,则将匹配行及其前后n行一起打印出来
    --color
    -c  :如果匹配成功,则将匹配到的行数打印出来
    -E  :等于egrep,grep的扩展正则

    -i  :忽略大小写

    -v  :取反,不匹配
    -w:匹配单词,过滤单词

     

    基本正则表达式:

    例如:

    ^b,表达的是搜寻以b开头的行

    ^.,表达的是行首

    word$,表达的是以单词$结尾的行

    .,表达的是匹配任意字符

    ,是转意字符

    b*,指的是有0至无穷个b

    [n1-n2],匹配一个字符范围中的一个字符。

    ab{3},指的是左边的b有3个;ab{2,4},指的是左边的b有2至4个;ab{2,},指的是左边的b有2至无穷个

     

    扩展正则表达式

    +,ab+,指的是左边的b有1至无穷个

    ?,ab?,指的是左边的b显示的次数是0次或者1次

    |,或(or)的方式匹配多个字串 

    (),匹配整个括号内的字符串,原来都是匹配单个字符




    使用以下举例:正则表达式及字符处理 目标文件/etc/passwd,使用grep命令或egrep 1.显示出所有含有root的行:
    grep ‘root’ /etc/passwd

     

    2.输出任何包含bash的所有行,还要输出紧接着这行的上下各两行的内容:
    grep -C2 'bash' /etc/passwd

    3. 显示出有多少行含有nologin。

    grep -c 'nologin' /etc/passwd

    4.显示出那些行含有root,并将行号一块输出。
    grep -nw 'root' /etc/passwd

    5.新建用户
        abominable
        abominate
        anomie
        atomize
     编写正则表达式,将他们匹配出来
        egrep 'a.omi(nabl|nat|z|)e' /etc/passwd

     在etc/passwd下过滤出

     abominable
        abominate
        anomie
        atomize
    egrep '^a[a-z]+e' /etc/passwd或者egrep 'a.omi(nabl|nat|z|)e' /etc/passwd

     


    6.建四个用户 Alex213sb Wpq2222b yH438PIG egon666 过滤出用户名组成是字母+数字+字母的行 egrep '^[a-zA-Z]+[0-9]+[a-zA-Z]+' /etc/passwd

    7.显示出/etc目录下所有包含root的文件名
    grep -o ‘root’ /etc/passwd


    8. 过滤掉/etc/ssh/sshd_config内所有注释和所有空行 grep -v '^#' /etc/ssh/sshd_config |grep -v '^ *$'




    二、sed 流编辑器(包括1、定位 2、处理)
    sed的可选参数比较少,主要就是下面这几个。

    (1)-e 允许多项编辑 

    (2)-i 直接修改

    (3)-f 指定sed脚本文件

    (4)-n 取消默认的输出 

    sed的匹配是以‘/’开头和结尾的,中间包含着对文本的匹配模式
    使用以下举例:以/etc/passwd文件为模板
    1,删除文件每行的第一个字符。
     sed -r 's/.//' /etc/passwd或sed -r 's/^(.)(.*)/2/' /etc/passwd

     

    2,删除文件每行的第二个字符。
     sed -r 's/^(.)(.)(.*)/13/' /etc/passwd


    3,删除文件每行的最后一个字符。
    sed 's/.$//' /etc/passwd或者sed -r 's/(.*)(.)$/1/' /etc/passwd

    
    
    4,删除一个文件中所有的数字。
    sed -r 's/[0-9]//g' /etc/passwd

     

     

    5,删除每行开头的所有空格。
    sed -r 's/ //g' /etc/passwd或者sed -r ‘s/^ *//g’ /etc/passwd

     

     

    6,用制表符替换文件中出现的所有空格。
    sed -r 's/ / /g' /etc/passwd

     


    7,把所有大写字母用括号()括起来。
    sed 's/[A-Z]/(&)/ /etc/passwd'

     

    8,打印每行3次。
    sed -r 'p;p' /etc/passwd

    9,隔行删除。
    sed -r '1~2d' /etc/passwd

     

    10,只显示每行的第一个单词。 
    sed -r 's/^([a-Z]+)([^a-Z]+)(.*)/1/' /etc/passwd

    三、awk使用
    -F 定义字段分隔符,默认的分隔符是连续的空格或制表符
    正则需要用//包围起来 
    ^ 行首
    $ 行尾
    . 除了换行符以外的任意单个字符
    * 前导字符的零个或多个
    .* 所有字符
    [] 字符组内的任一字符
    [^] 对字符组内的每个字符取反(不匹配字符组内的每个字符)
    ^[^] 非字符组内的字符开头的行
    [a-z] 小写字母
    [A-Z] 大写字母
    [a-Z] 小写和大写字母
    [0-9] 数字

    NR变量定址 
    NR 表示AWK读入的行数
    FNR表示读入行所在文件中的行数

    调用awk

    有三种方式调用awk

    1.命令行方式
    2.shell脚本方式
    3.将所有的awk命令插入一个单独文件,然后调用:

    用以下举例:

    (1)打印uid在30~40范围内的用户名。

    awk -F: '$3>30 && $3<40 {print $1}' /etc/passwd

    (2)打印第5-10行的行号和用户名

    awk -F: 'NR>=5 && NR<=10 {print $1 NR}' /etc/passwd

    (3)打印奇数行

    awk -F: 'NR%2!=0 {print $1 "..." NR}' /etc/passwd


    (4)打印偶数行

    awk -F: 'NR%2==0 {print $1 "..." NR}' /etc/passwd

     

    (5)打印字段数大于5的行(显示了字段数大于5的行和用户名)

    awk -F : 'NF>5{print NR $1}' /etc/passwd

    (6)打印UID不等于GID的用户名

    awk -F: '$3!=$4 {print $1}' /etc/passwd

    (7)打印没有指定shell的用户





     



  • 相关阅读:
    idea 配置mapper.xml代码提示
    vue配置请求转发解决跨域问题
    MySQL 连接出现 Authentication plugin 'caching_sha2_password' cannot be loaded
    判断链表是否有环(Java实现)
    Java实现链表反转(借助栈实现)
    IHS代理遇到404的问题
    麒峰可视化表单设计器vue版本
    2021.5.30发布内容
    表单常见问题说明
    排序算法与查找算法在项目中的实际应用
  • 原文地址:https://www.cnblogs.com/xuyuanyuan123/p/6600118.html
Copyright © 2011-2022 走看看