zoukankan      html  css  js  c++  java
  • SED_AWK_正则

    AWK

    awk [选项] ‘条件{指令}’ 文件      //后面不一定要跟文件,可以接管道

    命令 | awk [选项]

    条件:

    1,/正则/(模糊匹配)

    #awk ‘/root/’ /etc/passwd           //包含root的行

    #awk -F: ‘$5~/root/’ /etc/passwd     //$5~代表在第5列里包含root

    #awk -F: ‘$5!~/root/’ /etc/passwd    //代表第5列里不包含root

    2,字符和数字比较(==,!=,>=,<=,<,>)

    #awk -F: ‘$1==”root”{print $3}’ /etc/passwd

    #awk -F: ‘$3<1000{print $1}’ /etc/passwd                //找出所有的系统用户

    3,逻辑符号&&,||

    #awk -F: ‘$3>10&&$3<20’ /etc/passwd

    #awk -F: ‘$3>=1000||$3<=10’ /etc/passwd

    #seq 300 | awk '$1%3==0||$1~/3/'       //求300内,可以被3整除或包含3的数

    指令{print行}                  //没条件则默认打印全部

    print $0                       一整行

    print $1                       第1列

    print $2                       第2列

    print NF                      当前行有几列

    print NR                     当前行的行号

    print $NF                    打印每一行的最后一列

    #awk -F: ‘NR==10,NR=20{print}’    //可以通过这样来打印10-20行的内容

    #awk -F: ‘NR>9&&NR<21{print}’     //这样打印10-20行的内容也可以

    awk默认的分隔符是空格或Tab

    #awk -F: ‘{print $1}’ /etc/passwd     //以:为分隔符

    #awk -F':|[ ]' '{print $1}'                               //这里以:和空格为分隔符,要注意awk多分隔符的问题

    #awk ‘BEGIN{}条件{}END{}’ 文件

    BEGIN{}里面的指令,在读取文件内容之前就执行,仅执行1次

    条件{}里面的指令,读文件过程中执行,执行N次(文件行数)

    END{}里面的指令,在读取文件后执行,仅执行1次

    #awk ‘BEGIN{print 1.3*2.3}’   //后面不用加文件,可以作为计算器来用

    #awk ‘BEGIN{x=3;print 22/x}’   //以;分隔命令

    #awk ‘/bash$/{x++} END{print x}’ /etc/passwd  //统计能登录的用户

    #awk -F: 'BEGIN{print "用户名 UID 家目录"}{print $1" "$3" "$6}' /etc/passwd   | column -t            //以” ”为分隔符,打印后按制表符,管道column -t能让输出更美观。

    # awk -F: '$1==ENVIRON["USER"]{print}' /etc/passwd   //输出当前用户的用户信           息,ENVIRON["USER"] 引用全局变量USER

    如何在awk中引用变量:

    方法一:”’$A’”——双引号+单引号+$变量+单引号+双引号

    方法二:”’”$A”’”——两边都用”’”包围,双引号+单引号+双引号

    方法三:如果是全局变量,ENVIRON["USER"] 引用变量USER,不是全局变量的话先用export命令变成全局变量

    awk的高级应用[支持if,for,while] if是命令,必须写在基本格式的{}里

    if() {} else{}

    if() {} else if() {} else if() {} else {}

    #awk -F: '{if($3>=1000) {x++} else {y++}}END{print "普通:"x," 系统:"y}'         /etc/passwd

    blog.51cto.com 丁丁历险

    while(){}

    #awk -F: '{i=1;while(i<=NF){if($i=="root"){x++}i++}}END{print x}'   /etc/passwd                                //以后写的时候最好用竖结构写好再套进去

    sed 文本编辑器(非交互)

    语法:

    sed [选项] ‘条件指令’ 文件

    选项:

    -r  支持扩展正则

    -n  一般和p打印一起用

    -i       直接修改文件内容

    -{}     可组合多个命令,以分号隔开

    条件:行号,/正则/,无条件

    指令:

    s:替换   sed -n ‘s/old/new/’           将每行的第1个old替换为new

    sed -n ‘s/old/new/3’                  将每行的第3个old替换为new

    sed ‘1s/$/hello/;3s/$/hello’     在第1,3行的后面添加hello字符

    sed -n “/<name>/s/rhel6/rhel7/”    把包含<name>的行的rhel6替换为rhel7

    sed -n ‘s/old/new/g’                  将所有的old都替换为new

    sed -n ‘p;n’                                   输出奇数行

    sed -n ‘n;p’                                   输出偶数行

    sed -n ‘$=’                                    输出文件的行数

    sed -n ‘4,+10p’                            输出第4行及其后的10行内容

    替换操作的分隔”/”,可用其它字符,如#,&等等,便于修改文件路径

    d:删除 

    sed ‘/xml/d’                                 删除所有包含xml的行

    sed ‘/xml/!d’                      删除不包含xml的行,!符号表示取反

    p:打印

    i                  行前插入文本  sed -i ‘3iXXX’ 文件    //写在第3行

    a                行后插入文本  sed -i ‘3aYYY’ 文件     //写在第4行

    sed ‘$a192.168.4.5 svr5.tarena.com svr5’ /etc/hosts

    //在文档的最后一行添加一行,内容为”192.168.4.5 svr5.tarena.com svr5”

    c                 替换当前行       sed ‘3c XX’ 文件       //整行替换

    sed ‘/^HOSTNAME/cHOSTNAME=mysvr.tarena.com’ /etc/sysconfig/network                                          //把以HOSTNAME开头的行整行替换为HOSTNAME=mysvr.tarena.com

    不常用r,w,H,G        sed ‘2r /etc/hosts’ 文件名——在第2行添加/etc/hosts的内容

    sed ‘w /root/new.txt’ 文件名——把文件全部内容写到/            root/new.txt里面

    H追加复制,h覆盖复制;G追加粘贴,g覆盖粘贴

    sed ‘2H;5G’ 文件名

    sed逐行处理器,处理大文件效率高

    sed也可以接管道

    指令:增,删,改,查。实现对文本的输出,删除,替换,复制,剪切,导入,导出

    条件:

    行号

    /正则/               /abc/d                删除包含abc的行

    打印指令

    #sed -n '/local*/p' rclocal.txt             //显示包含”loca”的行,l可有可无

    #sed -n '/local$/p' rclocal.txt           //注意这两句的区别,上面是local后面可                                                                                           以有东西,下面是local后面不可以有东西

    #sed -n '5,$p' rclocal.txt               //输出第五行到最后一行

    删除指令

    #sed ‘2d’ /etc/passwd

    #sed ‘/正则表达式/d’ /etc/passwd

    ()复制并保留——基本正则

    ()复制并保留——扩展正则

    abcdoabcd-abcdpabcd

    #egrep “(abcd)o1-1p1”             //(abcd)代表复制,1代表引用

    替换指令-变相删除操作

    #sed ‘1s/old/new/’ 文件

    #sed ‘s/old/new/’ 文件

    #sed 's/.//2;s/.$//' nssw.txt             //删除文中每行的第二个和最后一个字符

    #sed -r 's/^(.)(.)(.*)/213/' nssw.txt   //将文件中每行的第一个、第二个字符互换

    每行文本拆分为“第1个字符”、“第2个字符”、“剩下的所有字符”三个部分,然后通过替换操作重排顺序为“2-1-3”,用-r才能(.)定义,然后1来引用

    #sed -r 's/[0-9]//g;s/^( )+//' nssw2.txt  //删除所有数字、行首空格,+代表可能多个空格

    -r表示应用扩展正则

    #sed 's/[A-Z]/(&)/g' nssw.txt                 //为文件中每个大写字母添加括号

    使用“&”可调用s替换操作中的整个查找串

    # sed -r -i '/^IPADDR/s/192.168.4.(.*)/172.16.16.1/'

    /etc/sysconfig/network-scripts/ifcfg-eth0

    要求只修改网段地址时,可以利用扩展正则表达式的 1、2、……等调用,分别对应此前第1个、第2个、…… 以 ()包围的表达式所匹配的内容。

    #sed -n ‘$=’ a.txt            //输出文件的行数,$指代最后一行的行数

    #sed ‘$d’ a.txt               //删除文件的最后一行

    #sed ‘/^$/d’ a.txt            //删除所有空行

    #sed ‘s/xml//g’ a.txt                   //将所有的xml都删除

    #sed ‘s/doc/&s/g’ a.txt       //将所有的doc都替换为docs,&代表查找到的字符串

    #sed ‘4,7s/^/#/’ a.txt        //将4-7行的开头加#号,注释掉

    #sed ‘s/^#an/an’ a.txt       //以#an开头的替换为an,去除行首的#,用于ftp配                                                                                                          置文件能允许匿名上传和建文件夹

    UREC=$(sed -n ‘1p’ /etc/passwd)     //取第一行的记录

    正则表达式

    1,基本正则(模糊查找)

    ^                          开始

    $                          结尾                   ^$表示空行

    []                         集合(取任意单个),里面的元素没有前后顺序[a-z] [A-Z] [0-9]                                                                                                                             [a-fmox-z0-5]=[abcdefmoxyz012345]

    比如要查找tast和test,t[ae]st

    [^]                       对集合取反[^a-z],a-z都不需要

    [^A-Z]                 匹配包括非大写字母的行

    ^[^a-z]               匹配不以小写字母开头的行

    .                           任意单个字符

    *                          前一个字符出现了n次(包括0次),不能单独用,a*表示a出现任意次。the*,只匹配前一个                        字符

    .*                        多个任意字符

    {n,m}               前一个字符出现了n到m次,a{1,3},a出现1到3次

    {n,}                  前一个字符出现了n到任意次

    {n}          前一个字符出现了n次,刚好n次

    ()

    grep “正则” 文件

    -i 不区分大小写

    -v 反查verse

    -n 显示行号number

    -c 统计找到了几行count

    -q 安静地查找,找不找得到都不显示,一般脚本才需要用这个,配合echo $?使用。

    vim进去后也支持正则

    grep -v “^$” /etc/postfix/main.cf /etc/postfix/main.cf   //检索空白行

    2,扩展正则(简化基本正则,扩张新内容)

    {n,m}         前面的内容出现了n到m次

    ()                代表整体   c(ab)?的结果是c或者cab

    ?                可有可无0-1次

    +                前面的内容出现了至少1次 扩展?+等于基本的*

    (|)              或者         //grep (test|taste)

    基本正则:兼容性强但麻烦,几乎所有软件都能使用基本正则

    扩展正则:简单但兼容性差,不是每个软件都能使用扩展正则

    #grep “the” a.txt    //检索the这个单词,是不能有字符的意思

    注意和the,the的区别。

  • 相关阅读:
    Python学习之路【第三篇】--集合
    Python学习之路【第二篇】-pyc简介、Python常用的数据类型及其用法和常用运算符
    Python学习之路【第一篇】-Python简介和基础入门
    NotePad++ 配置Python工作环境
    码农跳槽指南:如何在新公司建立自己的“支配地位”?
    python实现简单的聊天小程序
    真正努力的人,从来不焦虑
    我在公司待了6年,清退我却只花了6分钟
    只有潮水退去后,才知道谁在裸泳
    什么是rpc
  • 原文地址:https://www.cnblogs.com/MR-HAIBO/p/9261252.html
Copyright © 2011-2022 走看看