内建变量

FS:输入分割符

OFS:输出分割符

-v 自定义变量



awk -F: -v OFS=':' '{print $1,$3}' /etc/passwd


RS:输入换行符

ORS:输出换行符


#使用内置变量不需要加$符,$1,$2打印字段是$

NF:显示每行的字段数,就是以空白分割有多少个字段。

NR:显示行号

FNR:分开显示文件行号


#awk '{print NF}' /etc/fstab 

0

1

2

10

1

9

12


注:awk '{print $NF}' /etc/fstab

本来第二行有1个字段,$NF就相当于打印$1.


#NR相当于打印文件的行号,文件总共15行。

$ awk '{print NR}' /etc/fstab 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

 

$ awk '{print NR}' /etc/issue

1

2

3


#NR后面跟2个文件,统计2个文件共多少行。

[ody@vm10-10-254-2 ~]$ awk '{print NR}' /etc/issue /etc/fstab 

1

2

3

4

5

6

7

8

9

10

11

12



#分开统计文件行数:

 awk '{print FNR}' /etc/issue /etc/fstab 

1

2

3 #第一个文件三行

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15 #第二个文件15行



ARGC:awk参数的个数

ARGV:打印awk各参数


[root@192 ~]# awk '{print ARGC}' /etc/fstab  /etc/passwd

3

3

3

3

3


[root@192 ~]# awk 'BEGIN{print ARGC}' /etc/fstab  /etc/passwd

3


[root@192 ~]# awk 'BEGIN{print ARGV[0]}' /etc/fstab  /etc/passwd

awk

[root@192 ~]# awk 'BEGIN{print ARGV[1]}' /etc/fstab  /etc/passwd

/etc/fstab

[root@192 ~]# awk 'BEGIN{print ARGV[2]}' /etc/fstab  /etc/passwd

/etc/passwd

[root@192 ~]# awk 'BEGIN{print ARGV[3]}' /etc/fstab  /etc/passwd



自定义变量:

1、-v var=value

各变量区分大小写

2、在program中直接定义:

#awk -v test='hello world' 'BEGIN{print test}'

hello world


printf命令

格式化输出:print FORMAT,item1 item2

1、FORMAT必须给出

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

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


格式符:

%c:显示字符的ASCII码;

%d,%i:显示十进制证书

%e,%E:科学技术显示

%f:为浮点数

%g,%G:以科学计数法或浮点数形式显示数值

%s:显示字符串

%u:无符号整数

%%:显示%自身


修饰符:

#[.#]:第一个数字控制显示的宽度;第二个#表示小数点后的精度。

%3.1f

-:左对齐

+:显示数值的符号



[root@192 ~]# awk -F: -v OFS=':' '$3>=1000{print $1,$3}' /etc/passwd

nfsnobody:65534



使用模式~匹配,匹配的字符串需要使用双斜线括起来。

[root@192 ~]# awk -F: '$NF~/bash$/{print $1,$NF}' /etc/passwd

root /bin/bash

mysql /bin/bash

ody /bin/bash

meng /bin/bash


/stratline/,/endline/匹配从哪开始到那结束


注意:不支持直接给出数字格式

[root@localhost ~]# awk -F: 'NR>=2&&NR<=10''{print $1}' /etc/passwd

bin

daemon

adm

lp

sync

shutdown

halt

mail

uucp


#if语句


[root@localhost ~]# awk -F: '{if ($3>=1000) print $1,$3}' /etc/passwd

nfsnobody 65534


if else 循环:


awk -F: '{if ($3>=1000) {printf "Comon user: %s\n",$1} else {printf "System user: %s\n",$1}}' /etc/passwd


 awk -F: '{if($NF=="/bin/bash") print $1}' /etc/passwd


 

 while循环:

源文件内容:

[root@192 ~]# cat /etc/grub.conf 

# grub.conf generated by anaconda

#

# Note that you do not have to rerun grub after making changes to this file

# NOTICE:  You have a /boot partition.  This means that

#          all kernel and initrd paths are relative to /boot/, eg.

#          root (hd0,0)

#          kernel /vmlinuz-version ro root=/dev/mapper/VolGroup-lv_root

#          initrd /initrd-[generic-]version.img

#boot=/dev/sda

default=0

timeout=5

splashp_w_picpath=(hd0,0)/grub/splash.xpm.gz

hiddenmenu

title CentOS (2.6.32-431.el6.x86_64)

root (hd0,0)

kernel /vmlinuz-2.6.32-431.el6.x86_64 ro root=/dev/mapper/VolGroup-lv_root rd_NO_LUKS rd_NO_MD rd_LVM_LV=VolGroup/lv_swap crashkernel=auto LANG=zh_CN.UTF-8 rd_LVM_LV=VolGroup/lv_root  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet

initrd /initramfs-2.6.32-431.el6.x86_64.img


[[:space:]] 以空格开头

* 多个空格

/^[[:space:]]*initrd/  以多个空格开始的inited的行,做while循环打印$i,每列的字符数。

 [root@192 ~]# awk '/^[[:space:]]*initrd/{i=1;while(i<=NF) {print $i,length($i);i++}}' /etc/grub.conf 

initrd 6

/initramfs-2.6.32-431.el6.x86_64.img 36




for循环:

[root@192 ~]# awk '/^[[:space:]]*initrd/{for(i=1;i<=NF;i++) {print $i,length($i)}}' /etc/grub.conf 

initrd 6

/initramfs-2.6.32-431.el6.x86_64.img 36




break和continue  控制循环的

break [n]  跳出本次循环

continue  结束本轮循环,进入下轮循环


next

提前结束对本行的处理而直接进入下一行。


打印uid为偶数的行 。

如果不等于0,就结束对本行的处理next,等于0就不符合匹配,直接进入下一行。 

[root@192 ~]# awk -F: '{if ($3%2!=0) next; print $1,$3}'  /etc/passwd

root 0

daemon 2

lp 4

shutdown 6

mail 8


数组:

遍历数组中的每个元素,使用for循环:

for (war in arry) {for-body}


注意:var会遍历arry中的每个索引:

state["LISTEN"] 定义这个数组元素第一次从0开始

state["LISTEN"]++  第一行++ 就是1,第二行就是在1的基础上++ 就是2 ......

for 循环遍历数组中的每个元素,state[i] 打印每行元素的个数

END 只对最后一行做统计,


无END效果如下:

[root@192 ~]# netstat -ant | awk '/^tcp/''{state[$NF]++} {for (i in state) print i,state[i]}'

LISTEN 1

LISTEN 2

LISTEN 3

LISTEN 4

LISTEN 5




[root@192 ~]# netstat -ant | awk '/^tcp\>/{state[$NF]++}END{for (i in state) {print i,state[i]}}'

ESTABLISHED 1

LISTEN 9


[root@192 ~]# ss -ant | awk '{s[$1]++} END {for (i in s) print i,s[i]}'

ESTAB 2

State 1

LISTEN 9


函数:

内置函数:

rand():返回0和1之间的一个随机数


字符串处理:

length([s]):返回指定字符串的长度

split(s,a[,r]):以r为分割符切割字符s,并将切割后的结果保存至a所表示的数组中:



[root@192 ~]# echo $alllist

192.168.1.1,192.168.1.2

[root@192 ~]# awk 'BEGIN{s="'$alllist'";split(s,ip,",");for(i in ip) print ip[i]}'

192.168.1.1

192.168.1.2