1、AWK实例
(1)分隔符使用(-F,FS)
A、读取/etc/passwd文件,打印第一列,“:”作为分隔符
[root@test ~]# awk -F: '{print $1}' /etc/passwd
[root@test ~]# awk 'BEGIN {FS=":"} {print $1}' /etc/passwd
root
bin
daemon
adm
lp
B、指定多个字符为分隔符
先使用“A”分割,然后对分割结果再使用"D"分割
[root@test ~]# echo "12AxAbADXaAD52" | awk -F"[AD]" '{print $1}'
12
[root@test ~]# echo "12AxAbADXaAD52" | awk -F"[AD]" '{print $2}'
x
[root@test ~]# echo "12AxAbADXaAD52" | awk -F"[AD]" '{print $3}'
b
[root@test ~]# echo "12AxAbADXaAD52" | awk -F"[AD]" '{print $4}'
[root@test ~]# echo "12AxAbADXaAD52" | awk -F"[AD]" '{print $5}'
Xa
[root@test ~]# echo "12AxAbADXaAD52" | awk -F"[AD]" '{print $6}'
[root@test ~]# echo "12AxAbADXaAD52" | awk -F"[AD]" '{print $7}'
52
[root@test ~]#
C、打印指定字段信息
读取输入信息,并打印第一、二、三个字段
[root@test shell]# echo "hello the world" |awk '{print $1,$2,$3}'
hello the world
读取输入信息,打印当前行
[root@test shell]# echo "hello the world" |awk '{print $0}'
hello the world
读取输入信息,打印该行字段个数
[root@test shell]# echo "hello the world" |awk '{print NF}'
3
读取输入信息,打印该行最后一个字段
[root@test shell]# echo "hello the world" |awk '{print $NF}'
world
(2)设置变量(-v)
自定义变量a=1,并输出第一个字段,第一个字段+a
[root@test shell]# echo "1 2 3" |awk -va=1 '{print $1,$1+a}'
1 2
(3)运算操作
[root@test shell]# cat test.txt
1 2 3 test
4 5 h j,77
[root@test shell]# awk '$1' test.txt
1 2 3 test
4 5 h j,77
输出第一列大于2的行
[root@test shell]# awk '$1>2' test.txt
4 5 h j,77
输出第一列等于2的行
[root@test shell]# awk '$2==2' test.txt
1 2 3 test
(4)字符串匹配
输出第7列含bash,并打印第1,第7列
[root@test ~]# awk -F: '$7 ~ /bash/ {print $1,$7}' /etc/passwd
root /bin/bash
mysql /bin/bash
www /bin/bash
[root@test ~]#
(5)过滤本地ip地址
[root@test ~]# ifconfig eth0 |grep Bcast
inet addr:192.168.0.10 Bcast:192.168.0.255 Mask:255.255.255.0
[root@test ~]# ifconfig eth0 |grep Bcast | awk '{print $2}'
addr:192.168.0.10
[root@test ~]#
(6)打印出 passwd 文件中用户UID小于10的用户名和它登录使用的 shell
[root@test ~]# awk -F: '$3<10{print $1 $NF}' /etc/passwd
root/bin/bash
bin/sbin/nologin
daemon/sbin/nologin
adm/sbin/nologin
lp/sbin/nologin
sync/bin/sync
shutdown/sbin/shutdown
halt/sbin/halt
[root@test ~]# awk -F: '$3<10{print $1 "<======>" $NF}' /etc/passwd
root<======>/bin/bash
bin<======>/sbin/nologin
daemon<======>/sbin/nologin
adm<======>/sbin/nologin
lp<======>/sbin/nologin
sync<======>/bin/sync
shutdown<======>/sbin/shutdown
halt<======>/sbin/halt
[root@test ~]#
(7)显示系统内存使用率
[root@test ~]# cat free-use.sh
#!/bin/bash
USEFREE=`free -m | grep -i mem | awk '{print $3/$2*100"%"}'`
echo -e "内存使用百分比:$USEFREE"
[root@test ~]# sh free-use.sh
内存使用百分比:88.8776%
[root@test ~]#
(8)条件表达式
== != > >=
awk -F":" '$1=="mysql"{print $3}' /etc/passwd
awk -F":" '{if($1=="mysql") print $3}' /etc/passwd //与上面相同
awk -F":" '$1!="mysql"{print $3}' /etc/passwd //不等于
awk -F":" '$3>1000{print $3}' /etc/passwd //大于
awk -F":" '$3>=100{print $3}' /etc/passwd //大于等于
awk -F":" '$3<1{print $3}' /etc/passwd //小于
awk -F":" '$3<=1{print $3}' /etc/passwd //小于等于
(9)匹配代码块
//纯字符匹配 !//纯字符不匹配 ~//字段值匹配 !~//字段值不匹配 ~/a1|a2/字段值匹配a1或a2
awk '/mysql/' /etc/passwd
awk '/mysql/{print }' /etc/passwd
awk '/mysql/{print $0}' /etc/passwd //三条指令结果一样
awk '!/mysql/{print $0}' /etc/passwd //输出不匹配mysql的行
awk '/mysql|mail/{print}' /etc/passwd
awk '!/mysql|mail/{print}' /etc/passwd
awk -F: '/mail/,/mysql/{print}' /etc/passwd //区间匹配
awk '/[2][7][7]*/{print $0}' /etc/passwd //匹配包含27为数字开头的行,如27,277,2777...
awk -F: '$1~/mail/{print $1}' /etc/passwd //$1匹配指定内容才显示
awk -F: '{if($1~/mail/) print $1}' /etc/passwd //与上面相同
awk -F: '$1!~/mail/{print $1}' /etc/passwd //不匹配
awk -F: '$1!~/mail|mysql/{print $1}' /etc/passwd
(10)逻辑运算
&& ||
awk -F: '$1~/mail/ && $3>8 {print }' /etc/passwd //逻辑与,$1匹配mail,并且$3>8
awk -F: '{if($1~/mail/ && $3>8) print }' /etc/passwd
awk -F: '$1~/mail/ || $3>1000 {print }' /etc/passwd //逻辑或
awk -F: '{if($1~/mail/ || $3>1000) print }' /etc/passwd
(11)数值运算
awk -F: '$3 > 100' /etc/passwd
awk -F: '$3 > 100 || $3 < 5' /etc/passwd
awk -F: '$3+$4 > 200' /etc/passwd
awk -F: '/mysql|mail/{print $3+10}' /etc/passwd // 第三个字段加10打印
awk -F: '/mysql/{print $3-$4}' /etc/passwd //减法
awk -F: '/mysql/{print $3*$4}' /etc/passwd //求乘积
awk '/MemFree/{print $2/1024}' /proc/meminfo //除法
awk '/MemFree/{print int($2/1024)}' /proc/meminfo //取整
(12)格式化输出
netstat -anp|awk '{printf "%-8s %-8s %-10s\n",$1,$2,$3}'
printf表示格式输出
%格式化输出分隔符
-8长度为8个字符
s表示字符串类型
打印每行前三个字段,指定第一个字段输出字符串类型(长度为8),第二个字段输出字符串类型(长度为8),
第三个字段输出字符串类型(长度为10)
netstat -anp|awk '$6=="LISTEN" || NR==1 {printf "%-10s %-10s %-10s \n",$1,$2,$3}'
netstat -anp|awk '$6=="LISTEN" || NR==1 {printf "%-3s %-10s %-10s %-10s \n",NR,$1,$2,$3}'
个人公众号: