• sed和awk学习整理


    Awk和Sed的基本使用
     
    可以用大至相同的方式调用sed 和awk 。命令行讲法是:
    command [options] script filename
    几乎和所有的unlx程序一样,sed和awk都可以从标准输入中取得输入并将输出发送到标准输出。如果指定文件名filename,输入就取自那个文件。输出包含处理后的信息。标准输出是指屏幕,而且一般来自这些程序的输出都输出到那里。输出也可被送到一个文件。例如she11中的I/O重定向,但是不允许送到向程序提供输入的同一个文件。每个命令的options是不同的。
     
    scipt指定了要执行的指令。如果在命令行上script,假如它包含有可以由she11解释的空格或任意字符(例如$和*),那么它必须用单引号括起。
     
    sed和awk一个共同的选项是-f选项,这个选项允许你指定脚本文件的名字。附着脚本大小的增长,将它放置在文件中比较方便。因此,可以按如下方式调用sed:
    sed -f scriptfile inputfile
     
    在sed和awk中,每个指令都包括两个部分:模式和过程。模式是由斜杠(/)分隔的正则表达式。过程指定一个或多个将被执行的动作。
     
    sed:
     
    只有在命令行上给出多个指令时才需要用-e选项。它告诉sed将一下参数解释为指令。当只有一个指令时,sed可以自己做决定。
    sed [-e] 'instruction' file
     
    并不是在任何情况下都需要将指令用单引号包围起来,但是你应该养成这个习惯。使用单引号可以阻止she11解释编辑指令中的特殊字符或空格(she11使用空格决定才是交给程序独立参数,特殊的she11字符在调用之前被展开)。
    [root@ds-education2 ~]# cat test
    John Daggett, 341 King Road, Plymouth MA
    AI ice Ford, 22 East 8roadway, Richmond VA
    Orvi 1 le Thomas, 11345 Oak 8ridge Road, Tulsa OK
    Terry Kalkas, 402 Lans Road, 8eaver Fal Is PA
    Eric Adams, 20 Post Road, Sudbury MA
    Hubert Sims, 328A 8rook Road, Roanoke VA
    Amy Wi Ide, 334 8ayshore Pkwy, Mountain View CA
    Sal Carpenter, 73 6th Street, 8oston MA
    [root@ds-education2 ~]# sed 's/MA/MACK/' test  //该指令只影响了3 行,但显示出了所有行。
    John Daggett, 341 King Road, Plymouth MACK
    AI ice Ford, 22 East 8roadway, Richmond VA
    Orvi 1 le Thomas, 11345 Oak 8ridge Road, Tulsa OK
    Terry Kalkas, 402 Lans Road, 8eaver Fal Is PA
    Eric Adams, 20 Post Road, Sudbury MACK
    Hubert Sims, 328A 8rook Road, Roanoke VA
    Amy Wi Ide, 334 8ayshore Pkwy, Mountain View CA
    Sal Carpenter, 73 6th Street, 8oston MACK
    [root@ds-education2 ~]#
     
    有3 种方式可以指定命令行上的多重指令:
    1、
    [root@ds-education2 ~]# sed 's/MA/MACK/; s/VA/VACK/' test  //使用;号处理
    John Daggett, 341 King Road, Plymouth MACK
    AI ice Ford, 22 East 8roadway, Richmond VACK
    Orvi 1 le Thomas, 11345 Oak 8ridge Road, Tulsa OK
    Terry Kalkas, 402 Lans Road, 8eaver Fal Is PA
    Eric Adams, 20 Post Road, Sudbury MACK
    Hubert Sims, 328A 8rook Road, Roanoke VACK
    Amy Wi Ide, 334 8ayshore Pkwy, Mountain View CA
    Sal Carpenter, 73 6th Street, 8oston MACK
    [root@ds-education2 ~]#
    2、
    [root@ds-education2 ~]# sed  -e 's/MA/MACK/' -e  's/VA/VACK/' test //使用-e选项来实现
    John Daggett, 341 King Road, Plymouth MACK
    AI ice Ford, 22 East 8roadway, Richmond VACK
    Orvi 1 le Thomas, 11345 Oak 8ridge Road, Tulsa OK
    Terry Kalkas, 402 Lans Road, 8eaver Fal Is PA
    Eric Adams, 20 Post Road, Sudbury MACK
    Hubert Sims, 328A 8rook Road, Roanoke VACK
    Amy Wi Ide, 334 8ayshore Pkwy, Mountain View CA
    Sal Carpenter, 73 6th Street, 8oston MACK
    [root@ds-education2 ~]#
    3、
    [root@ds-education2 ~]# sed '
    > s/MA/MACK/
    > s/PA/PACK/
    > s/CA/CACK/' test    //输入sed '之后回车即可,这种技术在C she11中不能使用。
    John Daggett, 341 King Road, Plymouth MACK
    AI ice Ford, 22 East 8roadway, Richmond VA
    Orvi 1 le Thomas, 11345 Oak 8ridge Road, Tulsa OK
    Terry Kalkas, 402 Lans Road, 8eaver Fal Is PACK
    Eric Adams, 20 Post Road, Sudbury MACK
    Hubert Sims, 328A 8rook Road, Roanoke VA
    Amy Wi Ide, 334 8ayshore Pkwy, Mountain View CACK
    Sal Carpenter, 73 6th Street, 8oston MACK
    [root@ds-education2 ~]#
     
    显示在屏幕上的结果是临时的,输入文件中没有发生改变!!!
     
    sed后接脚本文件:
    sed -f script file
    [root@ds-education2 ~]# cat sed_test
    s/MA/MACK/
    s/PA/PACK/
    s/CA/CACK/
    [root@ds-education2 ~]# sed -f sed_test test
    John Daggett, 341 King Road, Plymouth MACK
    AI ice Ford, 22 East 8roadway, Richmond VA
    Orvi 1 le Thomas, 11345 Oak 8ridge Road, Tulsa OK
    Terry Kalkas, 402 Lans Road, 8eaver Fal Is PACK
    Eric Adams, 20 Post Road, Sudbury MACK
    Hubert Sims, 328A 8rook Road, Roanoke VA
    Amy Wi Ide, 334 8ayshore Pkwy, Mountain View CACK
    Sal Carpenter, 73 6th Street, 8oston MACK
    [root@ds-education2 ~]#
     
    保存输出:
    [root@ds-education2 ~]# sed -f sed_test test  > sed_write  //使用重定向即可
    [root@ds-education2 ~]# cat sed_write
    John Daggett, 341 King Road, Plymouth MACK MA
    AI ice Ford, 22 East 8roadway, Richmond VA
    Orvi 1 le Thomas, 11345 Oak 8ridge Road, Tulsa OK
    Terry Kalkas, 402 Lans Road, 8eaver Fal Is PACK
    Eric Adams, 20 Post Road, Sudbury MACK
    Hubert Sims, 328A 8rook Road, Roanoke VA
    Amy Wi Ide, 334 8ayshore Pkwy, Mountain View CACK
    Sal Carpenter, 73 6th Street, 8oston MACK
    [root@ds-education2 ~]#
     
    阻止输入行的自动输出:
    sed的默认操作是输出每个输入行。-n选项可以阻止自动输出。当指定该选项时,每个要生成输出的指令都必须包含打印命令p
    [root@ds-education2 ~]# sed -n 's/MA/MACK/'  test  //接-n就不输出了
    [root@ds-education2 ~]# sed -n 's/MA/MACK/p' test //加上p后,被处理的行都被输出了
    John Daggett, 342 King Road, Plymouth MACK
    Eric Adams, 20 Post Road, Sudbury MACK
    Sal Carpenter, 73 6th Street, 8oston MACK
    [root@ds-education2 ~]#
     
    sed的命令选项:
    选项描述
    -e 编辑随后的指令
    -f 跟随脚本中的文件名
    -n 阻止输入行的自动输出
     
    Awk
    每次从一个或多个文件中读入一行或从标准输入中读入一行。指令必须包含在单引号中,从而与shell区别开(指令几乎总是包含大括号和/或美元符号,she11将它们解释为特殊符号)。可以用与sed相同的方式输入多重命令行:用分号分隔命令或使用Boruneshell的多行输入功能。
    尽管awk指令与sed指令的结构相同,都由模式和过程两部分组成,但过程本身有很大的不同。awk看上去不像编辑器而更像一种程序设计语言。语句和函数取代了使用一个或两二个字符组成的命令序列。例如,使用print语句打印表达式的值或打印当前输入行的内容。
    在通常情况下,awk将每个输入行解释为一条记录而将一行上的每个单词(由空格或制表符分隔)解释为每一个字段(可以改变这些默认设置)。一个或多个连续的空格或制表符看做一个定界符。awk允许在模式或过程中引用这些字段。$0代表整个记录。
    [root@ds-education2 ~]# cat test
    John Daggett, 342 King Road, Plymouth MA
    AI ice Ford, 22 East 8roadway, Richmond VA
    Orvi 1 le Thomas, 11345 Oak 8ridge Road, Tulsa OK
    Terry Kalkas, 402 Lans Road, 8eaver Fal Is PA
    Eric Adams, 20 Post Road, Sudbury MA
    Hubert Sims, 328A 8rook Road, Roanoke VA
    Amy Wi Ide, 334 8ayshore Pkwy, Mountain View CA
    Sal Carpenter, 73 6th Street, 8oston MA
    [root@ds-education2 ~]# awk '{ print $1 }' test //用于打印输入文件中每行的第一个字段。
    John
    AI
    Orvi
    Terry
    Eric
    Hubert
    Amy
    Sal
    [root@ds-education2 ~]#
     
    "$1" 表示每个输入行上的第一个字段的值。因为这里没有指定模式,所以打印语句应用于所有的行。下一个示例指定了"/MA/"模式,但是其中没有过程。这个默认操作是打印匹配这种模式的每一行。
    [root@ds-education2 ~]# awk '/MA/' test  //这个默认操作是打印匹配MA这种模式的每一行
    John Daggett, 342 King Road, Plymouth MA
    Eric Adams, 20 Post Road, Sudbury MA
    Sal Carpenter, 73 6th Street, 8oston MA
    [root@ds-education2 ~]#
    [root@ds-education2 ~]# awk '/MA/ { print $1 }' test  //打印出含有MA的行的第一字段(默认空格或者制表符隔开)
    John
    Eric
    Sal
    [root@ds-education2 ~]#
     
    使用-F选项将字段分隔符改变为逗号
    [root@ds-education2 ~]# awk -F, '/MA/ { print $1 }' test
    John Daggett
    Eric Adams
    Sal Carpenter
    [root@ds-education2 ~]#
     
    [root@ds-education2 ~]# cat test1
    taobao,facebook,baidu
    google,sina,sohu
    wangyi,shengda,51cto
    [root@ds-education2 ~]# awk -F, ' { print $1 }; { print $2 }; {print $3} ' test1
    taobao
    facebook
    baidu
    google
    sina
    sohu
    wangyi
    shengda
    51cto
    [root@ds-education2 ~]#
     
    awk的命令行选项:
    -f 跟随脚本的文本名
    -F 改变字段分隔符
    -v 跟随var=value
     
    Awk和Sed通过管道配合使用:
    [root@ds-education2 ~]# cat test1
    taobao,facebook,baidu
    google,sina,sohu
    wangyi,shengda,51cto
    [root@ds-education2 ~]# cat sed_test1
    s/taobao/TAOBAO/
    s/google/GOOGLE/
    s/wangyi/WANGYI/
    [root@ds-education2 ~]# sed -f sed_test1 test1 | awk -F, '{ print $1 } '
    TAOBAO
    GOOGLE
    WANGYI
    [root@ds-education2 ~]#

    转自:“枯木的Linux博客”


     

  • 相关阅读:
    刚才遇到了关于C#使用外部DLL函数上的char*的问题。
    重新整理过的 《C#编码规范》
    晕,完全晕了。
    Microsoft Visual Studio 2010 支持html5和css3的补丁包
    [mysql] 修改root密码和查看连接数
    Visual Studio统计有效代码行数
    [c#] 邮件附件为中文名的bug
    游戏名词解释
    [SVN] 以下后缀文件不应该提交入库
    [c#] 语言新特性
  • 原文地址:https://www.cnblogs.com/weizhixiang/p/6561733.html
Copyright © 2020-2023  润新知