sed、awk使用

1 当我们需要在程序中完成文本处理工作的时候,需要一些能够在命令行完成的编辑工具,如

sed和awk,比如说许多文本编辑都是对文本的每一行进行操作,那么这个时候就能够用到sed

 

2 sed为流编辑器,流编辑器能够对管道中标准输入接收的数据进行编辑

 

3 sed是基于行的,其按顺序对每一行执行命令,然后将结果写入到标准输出,它不修改任何

输入文件

 

4 使用sed删除或指定文件的某行

    1) sed -e 'd'/xxx_file        #删除xxx_file文件中的每一行

    2) sed -e'nd' /xxx_file       #删除xxx_file文件中的第n行

    3) sed -e'n,md' /xxx_file     #删除xxx_file文件中的n到m行(包括n和m行)

    4) sed -e'/regex/d' /xxx_file #删除xxx_file文件中,匹配正则表达式regex的行

                       #例如 sed -e '/^#/d' /xxx_file为删除xxx_file中以#开头的行

 

5 将4中的d换成p则是打印指定的行,换成=;p则是打印行号,换成ni是在第i行插入,换成a表示追加

 

6 如果在sed中同时带有-n参数,则除非明确使用p,否则不进行打印

 

7 可以指定两个逗号分开的规则表达式,从匹配的第一个规则表达式的第一行开始,到匹配

第二个规则表达式的行结束(包括该行),sed将于所有这些行匹配,如下

    sed -e'/BEGIN/,/END/p' /xxx_file

   

8 可以使用sed来替换文本,替换格式如下 s///g,如果没有g,则只替换第一次匹配,否则全部

替换

 

9 替换功能可以与地址范围一起使用,格式如下:

    sed -e'n,ms/regex/string/g' /xxx_file

 

10 替换格式中的/可以使用其他的符号进行替换,如s:::, s@@@等,则上边的表达可以表达为:

    sed -e'n,ms:regex:string:g' /xxx_file

   

11 注意sed的正则表达式匹配是最长匹配

 

12 可以将多条命令与一个地址范围一起使用,表达式如下:

    sed -n -e'n,m{s/reg1/str1/g;s/reg2/str2/g;...;p}’ /xxxfile

   

13 实战

1) 把jon的名字改成jonathan

Sed –e ‘s/jon/jonathan/g’ xxx_file

2) 删除头3行

Sed –e ‘1,3d’xxx

3) 显示5-10行

Sed -n –e ‘5, 10p’ xxx

4) 删除包括Lane的行

Sed –e ‘/Lane/d’ xxx

    5)显示所有生日在11-12之间的行

    6)把3个*行条件到以Fred开头的行

    7)用JOSEHAS RETIRED取代包括Jose的行

    8)把Proeye的生日改成11/14/46

    9)删除所有空白行

    10)写一个脚本

        在第一行之前插入标题PERSONNEL FILE

        删除以500结尾的工资

        显示文件内容,把姓和名颠倒

        在文件末尾添加THE END

 

 

 

 

1 awk常常用于处理字段,所谓字段,就是在文本文件中,每一行分成多列,列与列之间用特定的符号隔开。

 

2 awk中使用位置变量来表达当前处理的是哪一个字段,$0则表示当前行的内容,awk使用{}来定义一段可以

执行的代码块,如果在命令行中直接定义代码块,需要使用单引号进行引用

 

3 awk默认使用空格进行分割,如果需要使用其他的分隔符,方法如下:

    awk-F":" '{i++} ' /xxx_file

   

4 awk会针对每一个输入行执行一段代码块,另外awk提供BEGIN和END块,前者是awk初始化时候执行,后者

是awk结束时执行,都只执行一次,因此awk的代码块编写方式完整格式如下:

    BEGIN{}

    /reg/{}

    {}

    ...

    {}

    END{}

 

5 我们可以使用如下方式来决定某个代码块是否执行

    /regex/{},如果当前正则表达式满足,则执行,否这不执行

 

6 awk包含两种变量:自定义变量和内建变量

  其内建变量包含:

    FILENAME : 当前输入的文件名

    FNR : 输入文件的记录数

    FS :字段分隔符

    RS :输入记录分隔符

    NF :记录字段数

    NR :在工作中的记录数

    OFS :输出字段分隔符

    ORS :输出记录分隔符,默认为\n

 

7 awk允许在数组名称之后,以方括号将任意数字或者字符串表达式扩起来作为索引,如下

    arr["ab"]=1

    arr[1]="dawd"

    arr['cd']=2

  同时,awk支持使用delete来删除某个数组元素或所有元素,如下

    delete arr[1]

    delete arr

   

8 awk支持直接对系统环境变量进行范围,通过ENVIRON数组,如ENVIRON["HOME"]

 

9 awk中的print语句使用空格或者逗号分割不同的部分,也可以不使用任何符号来进行连接

Print “ab”$1”cd”$2

print “ab” $1 “cd” $2

print “ab”,$1,  “cd”, $2

10 awk允许使用算术运算符,其内容大致与java语言相同,其中较为特殊的符号如下:

    ~    匹配正则表达式

    ~!   不匹配正则表达式

    ^*** 求幂

    in 数组成员

   

11 awk中语句编写方式与shell相同,可以使用;或者换行符进行分割

 

12 awk中支持顺序,条件和循环判断语句,如下:

    if,同java

    while,同java

    do-while,同java

    for,同java

    break,continue,大体同java,但是不支持定点退出

   

13 awk支持函数,函数的定义如下:

 

    functionfunc(arg1, arg2, arg3,    loc1,    loc2,...) {}

   

    1)函数支持参数的值传递和引用传递,由于awk不支持取地址运算,所以引用传递只能通过

       数组实现

    2)函数可以通过return返回值,如果不使用return,系统会默认返回0或者空字符串

    3)在函数体中使用,且没有出现在参数列表上的变量,函数视为全局变量。对于参数列表

       中的局部变量,通常在声明的时候在其前边放置多个空白

    4)支持递归调用

 

14 awk提供了两种格式化方式:

    1)printf,用法同c语言,如printf("%020x dawd %d","abc", 10);

       且同时会把格式化的字符串打印到标准输出

        printf提供如下格式化字符以供使用:

            c       ASCII字符

            s       字符串

            d       十进制整数

            ld      十进制长整数

            u       十进制无符号整数

            lu      十进制无符号长整数

            x       十六进制整数

            lx      十六进制长整数

            o       八进制整数

            lo      八进制长整数

            e       科学计数法浮点数

            f       浮点数

            g       e或f中较短的形式

           

            -       左对齐

            #       八进制整数前加0,十六进制整数前加0x

            +       显示使用d,e,f,g转换整数时,加上+或-

            0       用0而不是用空白符来填充所显示的值

    2)sprintf,用法同printf,但是会把格式化字符串返回,并赋值给变量

   

15 字符串处理内置函数

    sub(/reg/,newsubstr, str)      替换第一个匹配的字符串

    gsub(...)               str中匹配的的字符串全替换

    index(str,substr)          substr在str中的索引

    length(str)             str的长度

    match(str,/reg/)           如果找到匹配的串,返回出现的位置,否则返回0(字符串第一个索引为1)

    split(str,array, sep)          使用sep分割str,并将结果放入到array中

    substr(str,pos[, length])      返回str中pos开始的length个字符

    toupper(str)                大写化

    tolower(str)                小写化

    sprintf(...)                格式化

   

16 算术函数

    sin(x)

    cos(x)

    atan2(x)        余切

    int(x)          去整,过程没有舍入

    exp(x)          求幂

    log(x)          自然对数

    sqrt(x)         平方根

    rand()          生成一个大于等于0,而小于1的随机数

    srand(x)        x是rand()函数的种子,如果没有x,则以当前时间为种子,

                通常在rand之前调用srand()以制作一个起随机数

   

    Srand()

    Rand()

   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值