• 三个支持正则表达式的行处理的工具: grep/sed/awk


    grep:

    全称Global Regular Expression Print, 是干什么的,不多说了;

    用法:grep 【-options] [pattern】 【filename]

    选项:

    -c: 只输出匹配行的数目
    -i: 不区分大小写
    -n:显示匹配航以及行号
    -l:查询多文件的时候只输出包含匹配字符的文件名
    -L: 列出不匹配的文件名;
    -v:反向匹配,即显示不匹配的行
    -h: 查询的时候不适用文件名
    -s:不显示错误信息 
    -E 使用扩展正则表达式        //很有用啊,
    
    -A :后跟一个数字(有无空格都可以),例如 –A2则表示打印符合要求的行以及下面两行
    
    -B :后跟一个数字,例如 –B2 则表示打印符合要求的行以及上面两行
    
    -C :后跟一个数字,例如 –C2 则表示打印符合要求的行以及上下各两行

    pattern:

    指的正则表达式;用双引号“”或单引号‘’引用起来;

    例子:

    int main() {
        printf int
        iostreamsd print include interfaces j
        int a = 0, i;
    int. main() {
        printf("hello,world!
    ");
        for(i=0; i<10; i++)
    .        a = a + i;
        return 0;
    }

    匹配括号里的内容:

    yinheyi@ubuntu:~/play$ grep -nE "(.+)" hello.c
    7:    printf("hello,world!
    ");
    8:    for(i=0; i<10; i++)

    sed 的用法:(来自:http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2856901.html

    sed 是一种在线编辑器,它一次处理一行内容;它也可以处理 正则表达式(其中用//来把正则表达式括起来);下面为它的用法:

    sed 【参数】 【动作】 文件

    参数:

    -n :使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到终端上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
    -e :直接在命令列模式上进行 sed 的动作编辑;
    -f :直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的 sed 动作;
    -r :sed 的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法)
    -i :直接修改读取的文件内容,而不是输出到终端。

    动作:

    a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
    c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
    d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
    i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
    p :列印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
    s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!

    补充:(来自:http://blog.csdn.net/wh_19910525/article/details/7613090

     a    在当前行后添加一行或多行。多行时除最后一行外,每行末尾需用“”续行
     c    用此符号后的新文本替换当前行中的文本。多行时除最后一行外,每行末尾需用""续行
     i    在当前行之前插入文本。多行时除最后一行外,每行末尾需用""续行
     d     删除行
     h     把模式空间里的内容复制到暂存缓冲区
     H     把模式空间里的内容追加到暂存缓冲区
     g     把暂存缓冲区里的内容复制到模式空间,覆盖原有的内容
     G     把暂存缓冲区的内容追加到模式空间里,追加在原有内容的后面
     l     列出非打印字符
     p     打印行
     n     读入下一输入行,并从下一条命令而不是第一条命令开始对其的处理
     q     结束或退出sed
     r     从文件中读取输入行
     !     对所选行以外的所有行应用命令
     s     用一个字符串替换另一个
     g     在行内进行全局替换
          
     w     将所选的行写入文件
     x     交换暂存缓冲区与模式空间的内容
     y     将字符替换为另一字符(不能对正则表达式使用y命令)

    举例子:

    sed '1ashabi‘ hello.c                 //在第一行后面增加一行;
    sed '1,4d' hello.c                        // 把第一行至第四行删除;
    sed -nr '/^int/p' hello.c                            // 把开头为int的行打印出来;
    sed -nr '/^[^int]/p' hello.c                            // 把开头不是int的行打印出来;
    
    sed '1,20s/int/sb/g' hello.c                    // 把第一行到第20行中的int换为sb;
     
    //多个命令用{}括起来,并用 ; 分开;
    如:
    sed -n '/int/{s/int/char/g;p}' hello.c              //把含有 int 的行 换为 char 并打印出来;

    AWK更牛逼:

    它可以把文件逐行读入,心空格或其它指定的分隔符将每一行切片,切开的部分再进行各种分析处理;

    如何调用 awk?(来自:http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858470.html

    三个方法:1, 命令行形式;也是下面要讲的形式;

    2. shell 脚本方式, 与bash 一样的道理;

    3. 将所有命令写入到一个单独的文件,然后调用 awk –f awk-script-file input-file,  我觉得这个方式与 shell 脚本形式差不多啊;

    awk的工作原理:(来自:http://man.linuxde.net/awk

    awk 'BEGIN{ commands } pattern{ commands } END{ commands }'
    第一步:执行BEGIN{ commands }语句块中的语句; 
    第二步:从文件或标准输入(stdin)读取一行,然后执行pattern{ commands }语句块,它逐行扫描文件,从第一行到最后一行重复这个过程,直到文件全部被读取完毕。 
    第三步:当读至输入流末尾时,执行END{ commands }语句块。

    说明:

    BEGIN语句块在awk开始从输入流中读取行之前被执行,这是一个可选的语句块,比如变量初始化、打印输出表格的表头等语句通常可以写在BEGIN语句块中。

    END语句块在awk从输入流中读取完所有的行之后即被执行,比如打印所有行的分析结果这类信息汇总都是在END语句块中完成,它也是一个可选语句块。

    pattern语句块中的通用命令是最重要的部分,它也是可选的。如果没有提供pattern语句块,则默认执行{ print },即打印每一个读取到的行,awk读取的每一行都会执行该语句块。(把Pattern当作一个条件比较好理解;)

    预备知识1:内置变量 (下面内容参考自:http://www.zsythink.net/archives/tag/awk/

    image

    另外: $0,表示整个条记录; $1表示当前行的第一个域,$2表示当前行的第二个域

    预备知识2: 模式各类;(下面内容参考自:http://www.zsythink.net/archives/tag/awk/

    • 空模式:就是空的,没有 ,任何行都满足这个模式;
    • 关系模式:就是指的符合关系运算符的模式;如下所示:

    image  

    • 正则表达式模式: 说明两点,1. 用 // 把正则表达式括起来;2. 它使用的为扩展的正则表达式,当使用{x,y}这种次数匹配时,需要加上参数 –posix或 –re-interval;
    • 行范围模式 :举个例子说明:
      // 用正则表达式来指定行的范围,(注意:都以第一次匹配的行为准)
      awk '/正则1/,/正则2/{动作}'  hello.c
      
      //当单纯地使用行号时,应该使用 NR变量;
      awk -F ':' 'NR>=3&&NR<=6{printf("%s@%s
      "), $1,$2}' passwd
    •     BEGIN和END模式;  不多说,上面已经说明;

    说明:可以多个模式并列的;pattern省略与为1,等价于/.*/;action省略,等价于 print; 很有用的;

    awk的打印命令:

    print函数:print函数的参数可以是变量、数值或者字符串。字符串必须用双引号引用,参数用逗号分隔。如果没有逗号,参数就串联在一起而无法区分。这里,逗号的作用与输出文件的分隔符的作用是一样的,只是后者是空格而已。 说明一点:当两个打印的变量想用内容连接时,使用“内容”。

    // 例子:
    
    yinheyi@ubuntu:~/play$ echo "hello" | awk 'BEGIN{a="xiaoming";b="xiaohong"} {print a ,b}'
    xiaoming xiaohong
    yinheyi@ubuntu:~/play$ echo "hello" | awk 'BEGIN{a="xiaoming";b="xiaohong"} {print a"@"b}'
    xiaoming@xiaohong

    printf函数:其用法和C语言的差不多,可以格式化输出;不多说;

     

    awk的动作命令:(下面内容参考自:http://www.zsythink.net/archives/tag/awk/

    1. 它的动作命令用{}括起来; 多个命令之间用;分开,如{print $1; print $2}

    2. {}里面可以放入一起C语言的控制语句,如判断、循环等;

    3. 使用awk 之外的变量时,用‘’ 引起来,比如:

    echo “12 34 12” | awk ‘{$1=‘$num’;print}’

    awk的使用:

    参数:-F ,指定输分隔符,分隔符用’’引起来;如: awk –F ‘:’ ;    

    好,先到这里吧;

  • 相关阅读:
    南京网络赛题解 2018
    ACM 第二十天
    存储型XSS漏洞(pikachu)
    XSS跨站脚本(pikachu)——反射型xss(get和post)
    暴力破解(pikachu)——防范措施(简单了解)
    暴力破解02(pikachu)——验证码
    暴力破解01(pikachu)——基于表单
    安全软件burp suite pro破解版(亲测有效)
    sql lab的基础配置和1-4关闯关攻略(建议自学MySQL语言后再观看)
    sql lab的环境配置以及火狐浏览器的使用
  • 原文地址:https://www.cnblogs.com/yinheyi/p/7291003.html
Copyright © 2020-2023  润新知