Linux Shell 命令记录概略:三

来源:互联网 发布:红米2网络解锁功能 编辑:程序博客网 时间:2024/06/07 13:13

9. awk命令:

    i> awk的调用方式,包括三种,

        第一:命令行直接驱动: awk [-F field-separator] 'command' input-files,其中-F field-separator为指明分隔符,awk命令的默认分隔符为空格,如果需要用冒号(:)作为其分隔符,则如:awk -F: 'command' input-files;而'command‘为要执行的awk命令,注:command必须被单引号所引,双引号不行

        第二:将所有awk命令插入一个文件,并且保证awk程序可执行,然后用awk命令解释器作为脚本的首行,以便通过键入脚本名称来调用它;

        第三:将所有awk命令插入一个文件,然后调用;例如:awk -f awk_script_file input-files;其中-f awk_script_file为awk脚本文件,input-files为使用awk进行浏览的文件;

        注:awk中分隔符为某些特殊字符,比如:制表符;则表示方法:awk -F '' 'command' input-files;或者awk -F '\t' 'command' input-files或者awk -F \\t 'command' input-files,其中对分隔符的指明时可以用单引号'\t',也可以使用双引号"\t";

    ii> awk命令的模式和动作,任何awk命令都有模式动作组成,模式部分决定了动作语句合适触发及触发条件,如果省略模式部分,动作将时刻保持执行状态;模式可以使任何条件语句或复合语句或正则表达式,模式包括两个特殊字段:BEGIN和END,使用BEGIN设置计数和打印头,BEGIN语句使用在任何文本浏览动作之前,END在完成浏览后输出文本总数和结尾状态标识;实际动作在{}内指明;

    iii> awk的域和记录:awk在执行时,其浏览域被记录位$1,$2,$3...$n,其中$n即为第n个域。如果要输出所有域,可以$1,$2...$n,但是,更方便的是使用$0;域的概念:域即为一行中被分隔符分隔开的字段;注:每当awk的扫描遇到换行后,即读取下一行时,所有域将重新设置;

    iv>  awk的普通输出:

          awk在输出时可以使用print,例如:awk '{print $0}' log.txt,即输出log.txt文件中的所有域,但是,这样的输出格式将会是一行,不方便阅读,如果想在输出每一行的所有域后同时输出换行,则可以修改命令为:awk '{print $0"\n"}' log.txt,注意换行符\n必须被双引号包括;如果这样输出,则每个域之间的表示任然使用源文件中的分隔符;如果要修改其分隔符,可以修改命令为:awk '{print $5","$1","$2","$3"\n"}' log.txt,注意,新的分隔符也必须使用双引号包括,当前例子中为逗号,也可以将逗号换成空格。

          注:若需要新的输出格式用空格隔开,则可以:awk '{print $1,$2,$5"\n"}' log.txt或者awk '{print $1" "$2" "$5"\n"}' log.txt

    v> 输出报告头和报告尾:awk 'BEGIN {print "report start.......\n"} {print $0"\n"} END {print "report end.....\n"}' log.txt,注:整个从BEGIN到END输出结束都为awk的动作,因此需要被单引号所包括;

    vi> awk中的内置变量:

        ARGC  --------   命令行参数个数

        ARGV  --------   命令行参数数组

        FILENAME  --------   awk浏览的文件名

        NF  --------   浏览记录的个数

        NR  --------   已读的记录数

        注:内置变量的使用任然同shell变量一样:$var

    vii> awk内置字符串函数:

        gsub(r, s)  --------------------------------- 在整个$0中用s替换r

        gsub(r, s, t) ------------------------------- 在整个t中用s替代r

        index(s, t) ---------------------------------- 返回s中字符串t的第一位置,注:index返回的索引下标是从1开始的,并非C语言等下标从零开始;

        length(s) ------------------------------------ 返回字符串s长度

        match(s, r) --------------------------------- 测试字符串s是否包含匹配字符串r

        split(s, a, fs) ------------------------------- 将字符串s用分隔符fs分隔成序列保存至数组a

        sprint(fmt, exp) ---------------------------- 返回经fmt格式化的exp

        sub(r, s) ------------------------------------ 用$0中最左边最长的子串代替s

        substr(s, p) -------------------------------- 返回字符串s中从p开始的后缀部分

        substr(s, p, n) ----------------------------- 返回字符串s中从p开始长度为n的后缀部分

    viii> awk命令支持简单的,即条件if,包括:<、>=、<=、==、!=、这些常见的条件操作符,同时包括:~(匹配正则表达式)和!~(不匹配正则表达式);例如:

        ls -l | awk '{if($2~/text/) print $0}'    即为第二个元素中如果包含字符串text,则输出该条信息;

        ls -l | awk '{if($2=="text") print %0}' 即为第二个元素为text时,输出该条信息,注:$2不能用双引号包括;

    ix> printf格式化输出,awk中的printf基本和C语言中的一样,整个格式化字符串用双引号包括,因此,空格可以在其中直接体现,不想print,需要将空格和其他字符一样用双引号包括。但是,在格式化字符串中不能有单引号出现,而且也无法转义:

        ls -l | awk '{printf "name's length: %d, name: %s\n", length($1), $1}'     即在该条语句中name's含有单引号,因此,会存在语法错误,即使改为\'也无法实现;因为awk命令中的元字符不包括单引号:\    ^    $    .    [    ]    |    (    )    *    +    ?

0 0
原创粉丝点击