内建变量
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
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