zoukankan      html  css  js  c++  java
  • 11、shell_sed

    正则表达式:正则表达式,就是用一种模式,去匹配一类字符串的公式。
    正则表达式的解释是用正则表达式引擎来实现的,常用正则表达式引擎有两类:
    基本正则、扩展正则。
     
    正则表达式基础:
    正则表达式是由一些普通字符和元字符组成。元字符不再表示字符本身,而代表一些特定控制意义。
    正则表达式元字符:
        基本正则:^   $   .   *   []      {n,m}
        扩展正则:?   +   |   {n,m}  ()
        ^     表示开头
                ^a     以a开头
        ^b     以b开头
    例:显示以r开头的用户名  cut -d: -f1 /etc/passwd | grep ^r
    例:显示不以r开头的用户名  cut -d: -f1 /etc/passwd | grep -v "^r"
    例:显示 httpd 或 vsftpd 的配置文件,去掉注释
        $     表示结尾
        a$    表示以a结尾
        b$    以b结尾

    例:查看本机不允许登录的用户

    cat /etc/passwd | grep "nologin$"
    .     任意字符

    例:第2个字符是a

    .a
    *     零个或多个
    : 查看每行至少含有2个或以a的行
    cat test.txt | grep aaa*
        []     字符范围
    例:以a或b开头的行
        cat test.txt | grep "^[ab]"
    例:显示以数字开头的行
        cat test.txt | grep ^[0123456789]
        cat test.txt | grep ^[0-9]
    要注意的是:如果 ^ 放在[  ] 中不再表示开头,表示的是取反
                   转义
        {m,n}        限定字符长度,有m-n个
     
    POSIX 正则表达式集
    [[:alpha:]]      任意字母
    [[:alnum:]]     任意字母或数字
    [[:blank:]]     空格或制表符
    [[:digit:]]     0-9的数字
    [[:lower:]]     小字字母
    [[:upper:]]     大写字母
    [[:print:]]     可打印字符
    
    扩展正则元字符:
        ? 零个或一个
    例:显示有2到3个a的行
    cat test.txt  | egrep aaa?
        + 一个或多个
    例:显示至少有3个a的行
     cat test.txt  | egrep aaa+  
        |
    例:显示2或4开头的行
    cat test.txt  | egrep "^2|^4"
    cat test.txt  | grep "^[24]"
        {}  表出现次数
    例:显示行有2到4个a的行
    cat test.txt  | egrep "a{2,4}"
        ()  分组
    把符合替换的一系列字符分到一组中(打包),然后在后续的命令中用 1  2  3  等去引用它们
     
    grep/egrep 文本搜索
        格式: grep 文本 路径 
    -r   子目录也搜
    -v   排除
    例:在 /etc 下看看哪个文件下有 sshd
    grep sshd /etc/*
    grep -r sshd /etc/*
     
    sed (stream editor) 流式编辑器
    传统的编辑器,如  vi/vim  交互式的,需要人工去操作,这样功能虽然很强大,但在做编程时,如需要修改一个文件的内容,这样是很难做到的。
    sed 它的工作方式完全不一样,它没有交互,所有的操作都是写在命令中完中,
    如:我要删除文件的第2行
        格式:sed [option] '[address]{command}' [file_name]
        option:
    -i   直接在原文件操作,默认在内存中进行
    -f file 将操作系统写到命令文件,sed 从文件中读操作命令
    -n 不输出
    address:
    它表示的是操作地址(内容)
    可用两种方式来表示address
    1、行模式
    写具体的行,如 1、2、$
    sed '$d' test.txt
    sed '1,$d' test.txt   --全文删除
    2、模式匹配 
       /匹配模式/     即用// 把某种特征符(正则表达式)括起来
    sed '/^#/d' vsftpd.test
       command:  表示要操作的命令
    具体命令后面再讲
        command 中同时执行多条件的处理
    1、将每个命令用参数 -e 连接起来
    例:将vsftpd.test 中的注释删除,同时将anonymous_enable改为NO
    sed -e '/^#/d' -e '/anonymous_enable=YES/canonymous_enable=NO' vsftpd.test

    echo "The tiger" | sed  -e 's/tiger/cat/' -e 's/cat/dog/'

    2、将sed 命令用分号分隔
    echo "The tiger" | sed 's/tiger/cat/;s/cat/dog/'
    3、将多条命令写到文件
    4、命令分行号,用{} 括起来
       echo "The tiger" | sed '{
    > s/tiger/cat/
    > s/cat/dog/
    > }'
     

    sed 操作命令:

    s 替换
        格式:s/原字符/新字符/参数
        参数:
    g 一行中所有的都替换,不加的话,只替换一行中的第一个
    p 打印
    n(1-512)  替换一行中第n次出现的字符
      
    例:把/etc/passwd 中的root改为admin
    sed -n 's/root/admin/pg' /etc/passwd
     
    例:把1-10中的 不用登录的用户,改为能登录
    sed -n '1,10s/sbin/nologin/bin/bash/p' /etc/passwd
     
    例:把第一个字符和第二个字符换掉
    [root@t183 test]# sed 's/(^.)(.)/21/' test.txt  
     
    d 删除行
       例:删除第2行
    sed '2d' test.txt
       例:把文件中的空行删除
    a    行后追回
    i    行前插入

    例:sed '5a iiiiiii' test.txt

    例:sed '5i iiiiiii' test.txt
     
    c    整行修改(修改的是一行)
         例:把第3行改为   my sed test change
         例:把vsftpd 文件中的   anonymous_enable 改为 NO,同时增加一行  local_root=/share/ftp
          sed -n '/^anonymous_enable/s/YES/NO/p;/^local_enable/a local_root=/share/ftp/' vsftpd.test
     
    y    字符变换,对单个字符进行一一替换
         例:把a变成A
         sed 'y/a/A/' test.txt
         
    =    显示行号
         sed '=' /etc/passwd
     
    nq (如3q) 显示多行
         sed '3q' /etc/passwd
     
    w    写文件
         格式: w 文件名
    例:将 vsftpd 的前3行写到一个文件aa中
        sed '1,3w aa' vsftpd.test
    例:去掉 vsftpd 的注释,将主要内容放到bb中
    r    读文件,把其它文件中的内容,复制到当前文件中
    例:把bb的内容放到aa中,第2行后
    sed '2r bb' aa
     
    !    取反
    例: sed -n '/bash$/p' /etc/passwd   --打印bash结尾的行
       sed -n '/bash$/!p' /etc/passwd  --不打印以bash结尾的行
     
    示例:
    1、删除文件中每行的第一个字符  sed 's/^.//' test.txt

    2、删除文件中每行的第二个字符  sed 's/(^.)(.)/1/' test.txt

    3、删除文件中每行的最后一个字符  sed 's/.$//' test.txt

    4、删除所有带数字的行

    sed '/[[:digit:]]/d' test.txt

    sed '/[0-9]/d' test.txt

    5、把当前的ip地址写到 /etc/sysconfig/network-scripts/ifcfg-eth0

    大致过程:
    1) 获得当前的IP地址(不能是眼睛看的,要用程序去获取)
    ifconfig eth0 | grep "inet addr" | cut -d: -f2 |
    cut -d " " -f1
    -------------------------------------------
    ifconfig   查看、修改ip(临时性修改)
    查看
      ifconfig  [网络接口名]  
        如:ifconfig eth0
    临时性修改:
      ifconfig [网络接口名] ip地址
        如:ifconfig eth0 10.1.1.xxx
     
    永久性修改为静态IP:
    vim /etc/sysconfig/network-scripts/ifcfg-eth0
    DEVICE=eth0
    BOOTPROTO=static    --静态的,如果是DHCP就是动态
     
    ......
     
    IPADDR=10.1.1.178   --如果是静态的必须有这一行,DHCP会忽略这一行
    ONBOOT=yes
               
    修改后,要重启网络服务:
    service network restart
     
    -------------------------------------------------------
    6、写个程序 修改主机名,修改时,从键盘输入主机名,然后在临时修改,再永久修改(即把主机名写到配置文件)不能用 vim ,要在程序中用sed 来实现。
    hostname              --查看主机名
    hostname xxx.uplooking.com    --临时修改
      
    要永久性修改要把 hostname=xxx.uplooking.com 写到配置文件  
    /etc/sysconfig/network
     
     
     
     
     
     
  • 相关阅读:
    Python入门示例系列07 Python注释
    Python入门示例系列09 Python算术运算
    Python入门示例系列10 字符串(初级)
    SQL循环26个字母插入到一个表中
    UBUNTU LINUX中连接ANDROID 小米真机调试
    Ubuntu下包含2种远程桌面的方式:VINOServer以及VNC Server
    一个合格的程序员应该读过哪些书
    linux下如何查看文件编码格式及转换文件编码
    尽量不要使用文本模式
    S.O.L.I.D.类设计原则
  • 原文地址:https://www.cnblogs.com/steven9898/p/11331205.html
Copyright © 2011-2022 走看看