码迷,mamicode.com
首页 > 其他好文 > 详细

awk简单应用详解

时间:2016-02-03 22:42:08      阅读:254      评论:0      收藏:0      [点我收藏+]

标签:awk

gawk:pattern scanning and processing language

语法:gawk [options] ‘program‘ FILE ...

program:PATTREN{ACTION STATEMENTS}

选项:

-F :指明输入数据时的字段分隔符

-v var=value:自定义变量

1、print

print item1,item2,...

要点:(1) 逗号分隔符

      (2) 输出的各item可以是字符串,数值,字段(使用&引用),变量(直接输入变量即可)或者awk表达式

      (3) 如果省略item,相当于print $0


2、变量

    内置变量

FS:input field seperator输入时的分隔符:默认为空白字符

OFS:onput field seperator输出时的分隔符:默认为空白字符

RS:input record seperator:输入时的换行符

ORS:output record seperator:输出时的换行符

                NF:number of field :每一行字段数量

NR:number of recor :行数

FNR:各文件分别计数:行数

FILENAME:当前文件名

                ARGC:命令行参数的个数 (命令前使用BEGIN只显示一次)

ARGV:数组ARGV[#]:保存的是命令行中所给定的各参数

    自定义变量

(1)-v var=value 区分大小写

                (2) 在program中直接定义

awk ‘{test="1";print test}‘ filename

若不对文件做处理:awk ‘BEGIN{test="1";print test}‘

3、printf命令

     格式化输出:printf FORMAT(格式符),item1,item2,...

(1) FORMAT 必须给出

(2) 不会自动换行,需要显示给出换行控制符 \n

(3) FORMAT需要分别为后面的每个item指定一个格式化符号

            格式符:

%c :显示字符的ASCII码

%d,%i:显示十进制整数

%e,%E:科学计数法数值显示

%f:浮点数

%g,%G:科学计数法或浮点数

%s:字符串

%u:无符号整数

%%:显示%自身

            修饰符:

#[.#]:第一个数字控制显示的宽度,第二个显示小数点后的精度(%3.1f)

-:左对齐,默认右对齐

+:显示数值的符号(正负)

        4、操作符

    算数操作符

双目:+-*/ ^ %

单目:-x   +x

字符串操作符:没有符号的操作符,字符串连接

                赋值操作符:  =   +=  -= *= ...

比较操作符: >    >=    <    <=    !=     ==

模式匹配符:~   匹配

    !~ 不匹配

逻辑操作符:&& ||  !

函数调用:function_name(argu1,argu2,...)

条件表达式:select?if-true-expression:if-false-expression

        5、pattern

            (1) empty:空模式,匹配每一行

    (2) /regular expression/:正则表达式,仅处理匹配行

    (3) 条件表达式/关系表达式:结果有“真”“假”,处理结果为“真”的行

真:结果为非0值,非空字符串

    (4) line ranges:行范围

startline,endline:/pat1/,/pat2/由模式匹配指出范围

不支持直接给出数字的格式

                awk -F:‘(NR>=2&&NR<=10){print $1}‘ /etc/passwd

            (5) BEGIN/END模式

BEGIN{} :仅在开始处理文件中文本之前执行一次的程序

END{}:仅在文本处理完成之后执行一次

        6、常用action

            (1) expressions 

    (2) control statements:if,while等

    (3) compound statements:组合语句:

    (4) input statements

    (5) output statements

        7、控制语句

            if(condition) {statements} else {statements} 

    while(conditon) {statements}

    do {statements} while(conditon)

    for(expr1;2;3) {statements} 

    break

    continue

    delete array[index]

    delete array

    exit

    { statements }

示例:

    1、-F:指明输入数据时的字段分隔符,默认为空白字符。示例为使用“:”为分隔符,并输出第一组元素:

[root@localhost ~]# tail -n 5 /etc/passwd | gawk ‘{print $1}‘
pulse:x:497:496:PulseAudio
sshd:x:74:74:Privilege-separated
tcpdump:x:72:72::/:/sbin/nologin
armo:x:500:500:CentOS
named:x:25:25:Named:/var/named:/sbin/nologin
[root@localhost ~]# tail -n 5 /etc/passwd | gawk -F: ‘{print $1}‘
pulse
sshd
tcpdump
armo
named

    2、-v var=value与BEGIN共同使用:单独使用BEGIN不处理文本,只做输出动作,结合自定义变量的使用:(可使用选项定义,也在直接在program中定义变量)

[root@localhost ~]#  awk -v test=armo ‘BEGIN{print test}‘
armo
[root@localhost ~]#  awk ‘BEGIN{test="armo";print test}‘
armo

    3、内置变量的使用:NR:显示行号

[root@localhost ~]# tail -n 5 /etc/passwd | awk -F: ‘{print  NR,$1,$2 }‘
1 pulse x
2 sshd x
3 tcpdump x
4 armo x
5 named x
[root@localhost ~]#

    4、printf的格式化输出

[root@localhost ~]# awk -F: ‘{printf ("%s,%s\n",$1,$2)}‘ /etc/passwd
root,x
bin,x
daemon,x
adm,x
lp,x
...
[root@localhost ~]# awk -F: ‘{printf ("%15s    --%5s\n",$1,$2)}‘ /etc/passwd
           root    --    x
            bin    --    x
         daemon    --    x
            adm    --    x
             lp    --    x
           sync    --    x
       shutdown    --    x
           halt    --    x
           mail    --    x
第一域字符宽度15,第二域字符宽带5
[root@localhost ~]# awk -F: ‘{printf ("%-15s%+5.3f\n",$1,$3)}‘ /etc/passwd
root           +0.000
bin            +1.000
daemon         +2.000
adm            +3.000
lp             +4.000
sync           +5.000
shutdown       +6.000
第一域左对齐宽度15输出,第三域显示数值正负、宽度5、小数点后精确到三位输出

    4、操作符使用说明示例

[root@localhost ~]# awk -v a=2 -v b=1 ‘BEGIN{print "sum="a+b }‘
sum=3
[root@localhost ~]# awk -F: -v a=2 -v b=1 ‘{$3>=5?SUM=a+b:SUM=a+a;print $1,SUM}‘ /etc/passwd
root 4
bin 4
daemon 4
adm 4
lp 4
sync 3
shutdown 3
halt 3
mail 3
uucp 3

    5、pattern示例

[root@localhost ~]# awk -F: ‘(NR>=2&&NR<=10){print NR,$1}‘ /etc/passwd
2 bin
3 daemon
4 adm
5 lp
6 sync
7 shutdown
8 halt
9 mail
10 uucp
[root@localhost ~]#


awk简单应用详解

标签:awk

原文地址:http://armolee.blog.51cto.com/6288560/1740942

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!