shell study-22day--正则awk实例

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}'

个人公众号:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值