sed和gawk

  sed和gawk是shell脚本中必须熟练掌握的两个命令工具;这一节我们详细掌握sed命令的用法;

1、文本处理

  sed和gawk为Linux shell脚本下最常用的行编辑器;

  1.1、sed编辑器

    流编辑器(stream editor),与普通的交互式文本编辑器相对应。
    sed命令每次在内存中处理一行数据,然后保存到硬盘中,或者输出到显示器。

    sed编辑器的使用格式:sed options script file

    常用选项如下图:

    1、在命令行中定义编辑器命令

    用于STDIN输入流:

    $ echo "This is a test" | sed 's/test/big test/'

    This is a big test

    s 命令,用于替换,将前面匹配到的test 替换为 big test;

    可以以直接对文本进行处理:

    注意,它值修改显示内容,但是文本原来的内容它并不修改;此时,你去cat data1还是原来的数据;

    2、在命令行中使用多个编辑器命令

    通过 -e 选项使得 sed 命令能够执行多个选项

    $ sed -s 's/brown/green/; s/dog/cat/' data1

    使用次级提示符来输入这个命令也可以;

    $ sed -e '

    > s/brown/green/

    > s/for/elephant/

    > s/dog/cat/' data1

    3、从文件读取编辑器命令

    如果太多的sed命令要处理,可以将命令保存在文件中,然后在执行即可,这时候使用 -f 的参数就可以了;

  1.2、gawk程序

    sed命令有自己的局限性。一个能够提供类似于编辑环境的工具,它容许修改和重新组织文件中的数据。这正是gawk的特长。

    gawk程序是Unix中源awk程序的gnu版本。awk程序在流编辑方面比sed编辑器更先进的是:它提供了一种编辑语言而不仅仅是编辑器命令行。在编程语言内部,可以:

      定义要保存数据的变量

      使用算术和字符串操作符对数据进行运算

      使用接过话编程概念,例如if-then语句和循环,将逻辑添加到数据处理过程

      通过从数据文件内抽取数据元素以及按照其他顺序或格式对它们重定位,生成带格式的报告

    1、gawk命令格式

    基本格式:gawk options program file

    gawk的选项如下:

    2、自命令行读取程序脚本

    gawk的程序由 {  } 来定义。例如:

    $ gawk '{print "Hell John!"}'

    print 命令执行打印功能,将文本输出到STDOUT;

    如果要结束gawk程序,必须信号说明数据流已经结束。bash shel中Ctrl + D组合生成EOF字符。终止命令运行,返回到命令行;

    3、使用数据字段变量

    gawk主要作用就是处理数据。它是通过自动将变量分配给每行中的每个数据元素实现这一功能的。

      $0  代表整行文本

      $1  表示文本行中的第一个数据字段

      $2  表示文本行中的第二数据字段

      $n  表示文本汇总第n个数据段

    个数据之间通过字段分隔符来确定。-F 可以指定字段分隔符;

    -F 指定字段分隔符

    $ gawk -F: '{print $1}' /etc/passwd

    4、在程序脚本汇总使用多个命令

    多个命令之间用分号隔开就可以了

    $ echo "My name is Rich" | gawk '{$4="Dave"; print $0}'

    第一个命令时给$4指定一个字段Dave,之后打印整行

    5、从文件读取程序

    从文件中引用命令

    $ cat script2

    { print $5 "'s userid is " $1 }

    $ gawk -F: -f script2 /etc/passwd

    如果脚本中有多条命令,使用分号隔开就可以,如果不想使用分号,则从起一行即可;

    6、处理数据之前运行脚本

    gawk指定脚本运行的时间。BIGIN关键字,让gawk可以强制读取数据之前,执行BIGIN关键字之后的脚本程序:

    $ gawk 'BEGIN {print "Hello World!"}'

    Hello World

    在显示完数据后,就会立刻退出,不会再读取需要执行的文件;

    $ gawk 'BEGIN {print "Hello World!"} {print $0}'

    这样的话,就会执行第二段数据;要退出的话,就执行ctrl + D就行;

    7、在处理数据之后运行脚本

    与BEGIN一样,END关键字容许指定在读取的数据之后,gawk执行程序脚本

    $ gawk 'BEGIN {print "Hello World!"} {print $0} END {print "byebye"}'

    在使用ctrl + D之后,依然运行END关键字后面的命令;

    可以将这些小功能集合起来,写一个小功能:

BEGIN {
print "The latest list of users and shells"
print " Userid            Shell"
print "--------            ------"
FS=":"    #指定分隔符
}

{
print $1 "         "  $7
}

END {
print "This concludes the listing"
}

    使用这个脚本:

$ gawk -f script4 /etc/passwd

2、sed编辑器基础知识

  成功使用sed编辑器的关键是要了解其大量的命令和格式,这些命令和格式优租寓自定义文本编辑。

  2.1、更多的替换选项

    s 命令用于文本替换,其他几个选项也可以实现替换

    1、替换标记

    默认 s 只能替换一行中第一个数据

    $ sde 's/test/trial/' data4

    要想全部替换,必须使用替换标记。 s/pattern/replacement/flags

    替换标记有四种:1、数字:表示新文本替换的模式;2、g:表示用心文本替换现有文本全部实力;3:、p:表示打印原始行的内容;4、w file:将替换结果写入文件

    例如:

    指定第二个匹配字符串进行替换

    例如:

    将所有的test替换为trial

    p 替换标记会打印包含替换命令中匹配模式的那一行。进场和 -n sed选项一起使用:

    -n 表示禁止sed编辑器的输出。然而,p则是打印替换行。二则结合使用仅生成替换行;

    w将文本保存到另一文件中;

    2、替换字符

    $ sed 's//bin/bash//bin/csh/' /etc/passwd

    使用太多的转意字符,容易出错

    $ sed 's!/bin/bash!/bin/csh!' /etc/passwd

  2.2、使用地址

    寻找文本中的特定行进行编辑,有两种方式:1、行的数值范围;2、筛选行的文本模式。

    [address] command

    多行组合在一起:

    address {

      command1

      command2

      command3

    }

    1、数字式行寻址

    $ sed '2s/dog/cat/' data1  #就替换第二行的数据

    $ sed '2,3s/dog/cat/' data1  #替换第二行和第三行的数据

    $ sed '2,$s/dog/cat/' data1  #替换第二行到最后行的数据

    2、是用根本模式筛选

    命令格式:/pattern/command

    $ sed '/rich/s/bash/csh/' /etc/passwd  #将rich字符串行找出,并将其bash替换为csh

    记住sed命令时支持正则表达式的,pattern部分是可以使用正则表达式来完成;

    3、组合命令

    如果需要在单独行上执行多个命令,请使用大括号将命令组和在一起;

  2.3、删除行

    d 命令给出删除操作;

    $ sed '3d' data6  #删除第3行

    $ sed '2,3d' data6  #删除第二行和第三行

    $ sed '3,$d' data6  #删除第三行到最后行

    $ sed '/number 1/d' data6  #匹配number字符串的行的第一行删除掉

  2.4、插入和附加文本

    sed 也可以插入和附加文本。1、插入命令(i)在自定行之前添加新行;2、附加命令(a)在指定行之后添加新的一行;

    用法:

    sed '[address]command

    new line'

    $ echo "testing" | sed 'i

    > this is a test'

    $ echo "testing" | sed 'a

    > this is a test'

    上面两条命令时有区别的;

    在第三行的后一行中添加“This is an inserted line.”

    $符号表示最后一行,在最后行的后面添加新的内容;

  2.5、更改行

    c 更改命令,更改文本数据流中的所有文本内容。

    将第三行替换为指定内容

    也可以指定文本内容,和“删除”操作一样:

    $ sed '/number 3/c

    > This is a changed line of test.' data6

    也可以基于范围来替换:

    $ sed '2,3c

    > This a changed line of test.' data6

  2.6、变换命令

    变换命令(y)是唯一对单个字符进行操作的sed编辑器命令。变换命令使用格式:

    [address]y/inchars/outchars/

    $ sed 'y/123/789/' data7  #将文本中的1、2、3字符,替换为 7、8、9 一一匹配。

    $ echo "This 1 is a test of 1 try." | sed 'y/123/456/'

    This 4 is a test of 4 try.

  2.7、打印命令温习

    打印来自数据流的信息:1、小写p;2、打印行号 = 命令;3、列出行的 l 命令;

    1、打印行

    $ echo "this is a test" | sed 'p'

    $ sed -n '/number 3/p' data6  #-n禁止其他行的显示

    This is line number 3.

    $ sed -n '2,3p' data6

    This is line number2.

    This is line number3.

    2、打印行号

    $ sed '=' data1

    1

    The quick brown fox jumps over the lazy dog.

    2

    The quick brown fox jumps over the lazy dog.

    $ sed -n '/nmuber 4/{

    =

    p

    }' data6    #选出一行的命令

    3、列出行

    字表符 会直接打印出来

    直接显示颜色转意控制符;

  2.8、将文件用于sed

     1、写文件

    w 命令将文本行写入新的文件中,格式:[address]w filename

    如果向基于常见文本值从文本文件创建一个数据文件,这是一个很好的工具。

    2、从文件读取数据

    r命令容许您插入包含在独立文件中的数据。命令格式:[address]r filename

    $ sed '3r data11' data6  #在data6文本的第三行下面插入data11的内容

    $ sed '/number 2/r data11' data6   #在data6文本的匹配的字符number第二行下面插入data11文本内容

    $ sed '$r data11' data6  #在data6文本的最后一行插入data11文本内容

原文地址:https://www.cnblogs.com/BurnovBlog/p/10807482.html