awk编程

     awk的基本语法与C语言类似。

     awk为程序员提供了完善的编程模型。

     awk程序由一个主输入循环维持,主输入循环反复执行,直到终止条件被触发。当然,主输入循环无须由程序员去写,awk已经搭好主输入循环的框架,程序员写的代码被嵌到主输入循环框架中执行。主输入循环自动依次读取输入文件行,以供处理,而处理文件行的动作是由程序员添加的。

     awk还定义了两个特殊的字段:BEGIN和END,BEGIN用于在主输入循环之前,即在未读取输入文件行之前执行,END则相反,用于在主输入循环之后执行,即在读取输入文件行完毕后执行。

         

 

      awk模式匹配

      任何awk语句都由模式(pattern)和动作(action)组成。模式是一组用于测试输入行是否需要执行动作的规则,动作是包含语句,函数和表达式的执行过程。模式决定动作何时触发和触发事件,动作执行对输入行的处理。awk模式匹配经常需要用到正则表达式,awk还支持?和+两个扩展元字符,而grep和sed并不支持。

打印空白行

root@ubuntu:/home/yao/test# awk '/^$/{print "This is a blank line"}' t1.txt 
This is a blank line

单引号中间是awk命令,该awk命令由两部分组成,以/符号分隔,^$部分是模式,花括号部分是动作,该awk命令表示一旦读入的输入文件行是空行,就打印“This is a blank line”。


      awk的记录(records)和域(fields)

      awk认为输入文件时结构化的,awk将每个输入文件行定义为记录,行中的每个字符串定义为域,域之间用空格,Tab键或其它符号进行分隔,分隔域的符号叫做分隔符。

      awk定义域操作符$来指定执行动作的域,$后面跟数字或变量来标识域的位置,每条记录的域从1开始编号,如$1表示第一个域,$0表示所有的域。


root@ubuntu:/home/yao/test# ll
total 20
drwxr-xr-x 2 root root 4096 Apr 13 05:48 ./
drwxr-xr-x 4 yao  1000 4096 Apr  8 04:04 ../
-rw-r--r-- 1 root root  387 Apr 13 00:05 check_mem
-rw-r--r-- 1 root root  590 Apr  8 08:04 record_history.sh
-rw-r--r-- 1 root root  202 Apr 13 05:48 t1.txt
root@ubuntu:/home/yao/test# ll | awk '{print $0}' 
total 20
drwxr-xr-x 2 root root 4096 Apr 13 05:48 ./
drwxr-xr-x 4 yao  1000 4096 Apr  8 04:04 ../
-rw-r--r-- 1 root root  387 Apr 13 00:05 check_mem
-rw-r--r-- 1 root root  590 Apr  8 08:04 record_history.sh
-rw-r--r-- 1 root root  202 Apr 13 05:48 t1.txt
root@ubuntu:/home/yao/test# ll | awk '{print $3}' 

root
yao
root
root
root


       域操作符$后面还可以跟变量,或者变量运算表达式    

root@ubuntu:~# ll | awk 'BEGIN {one=1;two=2} {print $(one+two)}' 

root
root
root
root
root
root
root
root
root
root
root
root
root
root
root
root
root
root
  


       分隔符默认是空格键,使用awk -F选项来改变分隔符

root@ubuntu:~# awk -F ":" '{print $1}' /etc/passwd
root
daemon
bin
sys
sync
games
man
lp
mail
news
uucp
proxy
www-data
backup
list
irc
gnats
nobody
libuuid
syslog
messagebus
sshd
ftp
yao
nagios
mysql
ntp

     

            awk环境变量FS,通过在BEGIN字段中设置FS值来改变分隔符

root@ubuntu:~# awk 'BEGIN {FS=":"} {print $1}' /etc/passwd
root
daemon
bin
sys
sync
games
man
lp
mail
news
uucp
proxy
www-data
backup
list
irc
gnats
nobody
libuuid
syslog
messagebus
sshd
ftp
yao
nagios
mysql
ntp


 

        关系和布尔运算符

   awk定义了一组关系运算符用于awk模式匹配

  

    使用匹配正则表达式~符号  

root@ubuntu:~# awk 'BEGIN {FS=":"} $1~/root/' /etc/passwd
root:x:0:0:root:/root:/bin/bash


    

     awk条件语句

root@ubuntu:~# awk 'BEGIN {FS=":"} {if($3<$4) print $0}' /etc/passwd
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
libuuid:x:100:101::/var/lib/libuuid:/bin/sh
syslog:x:101:103::/home/syslog:/bin/false
messagebus:x:102:104::/var/run/dbus:/bin/false
sshd:x:103:65534::/var/run/sshd:/usr/sbin/nologin
ftp:x:104:110:ftp daemon,,,:/srv/ftp:/bin/false
mysql:x:105:112:MySQL Server,,,:/nonexistent:/bin/false
ntp:x:106:113::/home/ntp:/bin/false


 awk布尔运算符及其意义


 if语句的多条件匹配

root@ubuntu:~# awk 'BEGIN {FS=":"} {if($3 == 3 || $4 == 113 ) print $0}' /etc/passwd
sys:x:3:3:sys:/dev:/bin/sh
ntp:x:106:113::/home/ntp:/bin/false



 多条件模糊匹配

root@ubuntu:~# awk 'BEGIN {FS=":"} {if($3 ~ 13 || $4 ~ 11 ) print $0}' /etc/passwd
proxy:x:13:13:proxy:/bin:/bin/sh
ftp:x:104:110:ftp daemon,,,:/srv/ftp:/bin/false
yao:x:1000:110::/home/yao:/sbin/nologin
mysql:x:105:112:MySQL Server,,,:/nonexistent:/bin/false
ntp:x:106:113::/home/ntp:/bin/false


 表达式

 一个awk表达式可由数值,字符常量,变量,操作符,函数,和正则表达式自由组合而成。

 变量名只能包括字母,数字和下划线,而且不能以数字开头。变量默认数值为0,默认字符串值为空。

 awk算术运算符及其意义

 

 统计文件中的空行

root@ubuntu:/home/yao/test# awk '/^$/{print x+=1}' t1.txt 
1


脚本方式调用awk

root@ubuntu:/home/yao/test# chmod u+x t1.awk

root@ubuntu:/home/yao/test# vim t1.awk

#!/usr/bin/awk -f
BEGIN {FS=":"}
{print $1}

root@ubuntu:/home/yao/test# ./t1.awk /etc/passwd
root
daemon
bin
sys
sync
games
man
lp
mail
news
uucp
proxy
www-data
backup
list
irc
gnats
nobody
libuuid
syslog
messagebus
sshd
ftp
yao
nagios
mysql
ntp

系统变量

awk环境变量及其意义




格式化输出

awk借鉴C语言的语法,定义了printf输出语句,它可以规定输出的格式。

基本语法如下:

                   printf {格式控制符,参数}

  

root@ubuntu:~# ll | awk 'BEGIN {FS=" "} {printf("%5d\n",$2)}' 
  124
    6
   22
    1
    1
    1
    1
    2
   10
    1
    1
    1
    1
    1
    1
    2
    1
    2
    1


  内置字符串函数

  awk提供了强大的内置字符串函数,用于实现文本的字符串替换,查找以及分隔等功能。

gsub函数执行字符串替换功能,它将第一个字符串替换为第二个字符串

root@ubuntu:~# awk 'BEGIN {FS=":";OFS=":"} gsub(/root/,"yaoxiabing",$1) {print $0}' /etc/passwd
yaoxiabing:x:0:0:root:/root:/bin/bash 

root@ubuntu:~# awk 'BEGIN {print index("yaoxiabing",xia)}'
1

root@ubuntu:~# awk 'BEGIN {print length("yaoxiabing")}'
10

将系统变量IGNORECASE 设为1,表示awk不分大小写。

root@ubuntu:~# awk 'BEGIN {print match("yaoxiabing","xia")}'
4

root@ubuntu:~# awk 'BEGIN {print match("yaoxiabing","xa")}'
0

root@ubuntu:~# awk 'BEGIN {IGNORECASE=1;print match("yaoxiabing","XiA")}'
4

向awk脚本传递参数

awk传递的参数可以是自定义的变量,也可以使系统变量。


条件语句和循环语句

awk条件语句和循环语句与C语言的语法完全一样,

这里不详细介绍了


数组

awk的数组与C语言一样,但是awk数组无须定义数组类型和大小,而可以直接赋值后使用。

root@ubuntu:/home/yao/test# awk 'BEGIN {str[1]="100";if (1 in str) print "Found"}'
Found

split函数

root@ubuntu:/home/yao/test# awk 'BEGIN {split("123/456/789",str,"/");for(i in str)print str[i]}'
123
456
789

数组形式的系统变量

awk系统变量中有两个变量是以数组形式提供的:ARGV和ENVIRON 。ARGC和ARGV数组中元素的个数,与C语言一样,

root@ubuntu:/home/yao/test# awk 'BEGIN {for(i=0;i<ARGC;i++) print ARGV[i]; print ARGC}' 1 2 3
awk
1
2
3
4

ENVIRON变量存储了linux操作系统的环境变量,其结果类似于linux的set命令,显示当前系统所定义的所有环境变量

root@ubuntu:/home/yao/test# awk 'BEGIN {for (i in ENVIRON) print i"="ENVIRON[i]}'
AWKPATH=.:/usr/share/awk
OLDPWD=/root
LANG=en_US.UTF-8
HISTSIZE=1000
LANGUAGE=en_US:
USER=root
_=/usr/bin/awk
TERM=vt100
SHELL=/bin/bash
HISTFILE=/var/log/.hist/root/window.hist.2013-04-14-17:34:32
LESSCLOSE=/usr/bin/lesspipe %s %s
SSH_CONNECTION=192.168.234.1 4335 192.168.234.133 22
LESSOPEN=| /usr/bin/lesspipe %s
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
MAIL=/var/mail/root
SSH_CLIENT=192.168.234.1 4335 22
HOME=/root
PWD=/home/yao/test
SSH_TTY=/dev/pts/0
LOGNAME=root
SHLVL=1



转载于:https://my.oschina.net/yaodaren/blog/122623

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值