awk是由条件和动作组成,先判断条件,再执行动作
先读取文本中的第一行内容,对其进行条件的分隔和判断 执行动作
格式:
awk ‘条件1{动作1}条件2{动作2}。。’ 文件名
条件:
一般使用关系表达式作为条件(BEGIN/END。。)或者大小判断
动作:
格式化输出,流程控制语句(复杂的awk语句)
[root@jason ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg_jason-lv_root 18G 2.1G 15G 13% /
tmpfs 939M 0 939M 0% /dev/shm
/dev/sda1 485M 39M 421M 9 % /boot
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg_jason-lv_root 18G 2.1G 15G 13% /
tmpfs 939M 0 939M 0% /dev/shm
/dev/sda1 485M 39M 421M 9 % /boot
/dev/sr0 3.6G 3.6G 0 100% /media
[root@jason ~]# df -h|grep /dev/sda1|awk '{print $5}'
9%
9%
[root@jason ~]# df -h|grep /dev/sda1|awk '{print $5}'|cut -d "%" -f 1
9
9
[root@jason ~]# awk '{FS=":"}{print $1 "\t" $3}' /etc/passwd
root:x:0:0:root:/root:/bin/bash 为什么会输出这个呢? 因为awk是先读取文本的第一行内容
bin 1
daemon 2
adm 3
lp 4
sync 5
root:x:0:0:root:/root:/bin/bash 为什么会输出这个呢? 因为awk是先读取文本的第一行内容
bin 1
daemon 2
adm 3
lp 4
sync 5
[root@jason ~]# awk '
BEGIN{FS=":"}
{print $1 "\t" $3}' /etc/passwd
root 0
bin 1
daemon 2 以:为分隔符,开始就指定从BEGIN来提取文本内容
adm 3
lp 4
sync 5
root 0
bin 1
daemon 2 以:为分隔符,开始就指定从BEGIN来提取文本内容
adm 3
lp 4
sync 5
[root@jason ~]# awk 'BEGIN{FS=":"}$3<=3{print $1 "\t"}' /etc/passwd
root
bin 加入一个条件 第三列的数值<=3
daemon
root
bin 加入一个条件 第三列的数值<=3
daemon
[root@jason ~]# awk '
BEGIN{printf "this is/etc/passwd"}BEGIN{FS=":"}$3<=5{print $1 "\t"}' /etc/passwd
this is /etc/passwd 在开始加入一行文字叙述
root
bin
daemon
adm
lp
sync
bin
daemon
adm
lp
sync
[root@jason ~]# awk '
END{printf "this is /etc/passwd"}BEGIN{FS=":"}$3<=5{print $1 "\t"}' /etc/passwd
root
bin
daemon
adm
lp
sync
this is /etc/passwd 结尾加入文字叙述
bin
daemon
adm
lp
sync
this is /etc/passwd 结尾加入文字叙述
awk操作符
= += -= *= /= %= ^= 赋值操作符
? 条件表达操作符
|| && ! 并、与、非
~ !~ 匹配操作符(匹配与不匹配)
< <= == != > >= 关系操作符
+ - * / % ^ 算术操作符
FS用来设置域分隔符,如: 以冒号为分隔符FS=":"
NF为记录域个数(列数),在记录被读之后设置,常用$NF指定最后一列
$0表示使用所有域
[root@jason ~]# awk '{print $0}' passwd > pass
将passwd的所有域 输出重定向到pass文件中 即:拷贝passwd到pass
[root@jason ~]# awk '{print $0}' passwd |tee pass
将passwd的所有域 通过管道将结果通过tee传到pass中,并在屏幕上显示结果
$n 指定区域 (列)
[root@jason ~]#
awk 'BEGIN{FS=":"}{print $1,"\t",$5}' passwd
使用begin模式,FS指定以“:”为分隔符,截取第1、5列 显示到屏幕
FS 设置域分隔符,相当于-F
在awk命令中传值 穿插if语句
查询可用空间小于36000M的分区:
[root@jason ~]# df -m|awk '($4 ~ /^[0-9]/) {if ($4 < LIMIT) print $6"\t"$4}' LIMIT=36000/ 14708/dev/shm 939/boot 421/media 0
查询当前用户登陆在哪个端口:
[root@jason ~]# who|awk '{if ($1 == user) print $1" you are connected to"$2}' user=$LOGNAMEroot you are connected to pts/0
使用~紧跟正则表达式可以匹配域,也可以用if,条件需要用()括起来
[root@jason ~]# awk '$0 ~ /ftp/' passwdftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
[root@jason ~]# awk '$0 !~ /ologi/' passwdroot:x:0:0:root:/root:/bin/bash
不匹配passwd含有ologi字符的行
精确匹配 使用==并用双引号括起条件可以精确匹配条件
[root@jason ~]# awk 'BEGIN{FS=":"}{if ($1 == "root") print $0}' passwd
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
以”:“为分隔符 精确匹配第一列是root的所有列
其他匹配
大小写匹配 '/[Gg]reen/'
匹配某个字符 ~ '/^...a/' 匹配第四个字符是a
匹配以X开头 ~ ' /^J/' 匹配以J开头
匹配以X开头 ~ ' /^J/' 匹配以J开头
匹配x或xx ~ '/blue/green/' 匹配蓝色或黄色