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()

   

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值