一、awk基本应用
grep:文本过滤的, egrep
sed:流编辑器,实现编辑的
awk:文本报告生成器,实现格式化文本输出
1、概念
AWK是一种优良的文本处理工具,Linux及Unix环境中现有的功能最强大的数据处理引擎之一。这种编程及数据操作语言的最大功能取决于一个人所拥有的知识。awk命名:Alfred Aho Peter\ Weinberger和brian kernighan三个人的姓的缩写。
awk----> gawk GUN AWK
在Linux上常用的是gawk,awk是gawk的链接文件
man gawk----》pattern scanning and processing language 模式扫描和处理语言
任何awk语句都是由模式和动作组成,一个awk脚本可以有多个语句。模式决定动作语句的触发条件和触发时间。
patter{action} 比如: awk ‘/root/’mima 或 awk ‘$3 < 100’mima 或 awk ‘{print $2}’mima
上面模式和动作是可选的:
(1)如果没有模式,则action匹配的是mima文件中所有的记录
(2)如果没有动作,则patter匹配输出全部记录
模式:
l 正则表达式: /root/ 匹配含有root的行 /*.root/
l 关系表达式: < <= > >= && || + *
l 匹配表达式: ~(匹配) !~(不匹配)
l BEGIN和END
动作:
变量 -->可以自定义变量,变量名的引用不需要加$符号;它也有自己内置的变量
命令 -->ls date
内置函数---> 数学函数、时间函数、字符串函数、
流控制语句---> if while for
它的语法结构如下:
awk [options] 'BEGIN{ print "start" } ‘pattern{ commands }’ END{ print "end" }' file
其中:BEGIN END是AWK的关键字部,因此必须大写;这两个部分开始块和结束块是可选的
BEGIN模块:在动作执行之前进行,通过我们可以用来设置全局变量,设置标题
END模块:在动作执行之后进行
通过上面我们可以知道;AWK它工作通过三个步骤
(1)读:从文件、管道或标准输入中读入一行然后把它存放到内存中
(2)执行:对每一行数据,根据AWK命令按顺序执行。默认情况是处理每一行数据,也可以指定模式
(3)重复:一直重复上述两个过程直到文件结束
2 、awk的环境变量
awk内置变量(预定义变量)
ü $n 当前记录的第n个字段,比如n为1表示第一个字段,n为2表示第二个字段,字段之间由FS分隔
ü $0 这个变量包含执行过程中当前行的文本内容
ü FILENAME 当前输入文件的名
ü FS 字段分隔符(默认是任何空格)
ü NF 表示字段数,在执行过程中对应于当前的字段数
ü FNR 各文件分别计数的行号
ü NR 表示记录数,在执行过程中对应于当前的行号
ü OFS 输出字段分隔符(默认值是一个空格)
ü ORS 输出记录分隔符(默认值是一个换行符)
ü RS 记录分隔符(默认是一个换行符)
说明:
记录==》 awk会把每一个以换行符作为结束的行称为一个记录
记录分隔符==》默认的输出和输入分隔符都是回车
变量NR:你可以把它当前一个计数器
域:在记录中每个字段,称它为“域” 比如$1 $2
3 、实例演示
常用的命令选项:
-F fs指定分隔符
-v 赋值一个用户自定义变量
-f 指定脚本文件,从脚本中读取awk命令
范例1:分隔符的使用
用法:-F fs 其中fs是指定输入分隔符,fs可以是字符串或正则表达式;分隔符默认是空格
常见的写法: -F: -F, -F[aA]
范例2:指定多个分隔符
范例3:提取网卡的IP地址
范例4:关系运算符的使用
范例4-1:打印passwd文件中用户UID小于10的用户名和它登录使用的shell
[root@xuegod1603 days6]# awk -F: '$3<10{print $1"<=====>"$NF}' /etc/passwd
[root@xuegod1603 days6]# awk -F: '$3<10{print $1"\t"$NF}' /etc/passwd
[root@xuegod1603 days6]# awk -F: '$3<10{print $1,$NF}' /etc/passwd
范例4-2:打印系统中能够正常登录的普通用户
[root@xuegod1603 days6]# awk -F: '$3>=1000 && $NF=="/bin/bash"{print $1,$NF}' /etc/passwd
hr /bin/bash
范例5:添加开始和结束模块
[root@xuegod1603 days6]# cat test.awk
BEGIN{
print "UserId\t\t\tShell"
print "---------------------------------"
FS=":"
}
$3>=900 && $NF == "/sbin/nologin"{
printf "%-20s %-20s\n",$1,$NF
}
END{
print "-----------end-------------------"
}
[root@xuegod1603 days6]# awk -f test.awk /etc/passwd
UserId Shell
---------------------------------
polkitd /sbin/nologin
libstoragemgmt /sbin/nologin
colord /sbin/nologin
saslauth /sbin/nologin
chrony /sbin/nologin
geoclue /sbin/nologin
nfsnobody /sbin/nologin
setroubleshoot /sbin/nologin
gnome-initial-setup /sbin/nologin
-----------end-------------------
范例6:统计当前内存的使用率
24.3 awk高级应用
命令格式:
awk [-F | -f | -v ] ‘BEGIN {} / / {command1;command2} END {}’file
-F 指定分隔符
-f 调用脚本
-v 定义变量
‘{}’ 引用代码块
{…} 命令代码块,包含一条或多条命令
BEGIN 初始化代码块
/ str / 匹配代码块,可以是字符串或正则表达式
{print A;print B} 多条命令使用分号分隔
END 结尾代码块
==================================================
内置变量的特殊用法:
ü $0 表示整个当前行
ü NF 字段数量
ü NR 每行的记录号,多文件记录递增
ü \t 制表符
ü \n 换行符
ü ~ 匹配,与==相比不是精确比较
ü !~ 不匹配,不精确比较
ü -F'[:#/]+' 定义三个分隔符
范例1:提取IP地址
说明:
[ :]+表示以空格和分号为分隔符,但是因为有可能有多个空格或冒号,所以用一个+表示重复前的。NR==2表示行号
范例2:NR与FNR的区别
对于NR来说,在读取不同的文件时,NR是一直加的
对于FNR来说,在读取不同的文件时,它读取下一个文件时,FNR会从1开始重新计算的
范例3:去首行
范例4:匹配
范例5:条件表达式
select?if-ture:if-false 问号前面的select是条件,如果条件成立执行if-true,反之执行if-false
范例6:if语句
if(条件){命令1;命令2}elif(条件){命令}else{命令} 条件用小括号扩起来
范例7:变量(变量的引用,前面不加$符号)
1) 用-v指定 var=value 变量名区分大小写的
[root@xuegod1603 days6]# awk -v test="HELLO AWK" 'BEGIN{print test}'
HELLO AWK
2)在程序中直接定义
[root@xuegod1603 days6]# awk 'BEGIN{test=100;total=0;while(i<=test){total+=i;i++}print total}'
5050
范例8:格式化输出
printf命令:格式化输出 printf “FORMAT”,item1,item2.......
format的使用
注意:
1、其与print命令的最大不同是,printf需要指定format
2、format用于指定后面的每个item的输出格式
3、printf语句不会自动打印换行符;\n
format格式的指示符都以%开头,后跟一个字符;如下:
%c: 显示字符的ASCII码
%d:十进制整数
%e:科学计数法显示数值
%f : 显示浮点数
%g : 以科学计数法的格式或浮点数的格式显示数值;
%s : 显示字符串
%u : 无符号整数
%%: 显示%自身
例如:
[root@xuegod1603 days6]# awk -F: '{printf "%s",$1}' mima
rootbindaemonadmlpsyncshutdownhaltmailoperator[root@xuegod1603 days6]#
[root@xuegod1603 days6]# awk -F: '{printf "%s\n",$1}' mima
root
bin
daemon
adm
lp
sync
shutdown
halt
operator
[root@xuegod1603 days6]# awk -F: '{printf "UserName: %s\n",$1}' mima
UserName: root
UserName: bin
UserName: daemon
UserName: adm
UserName: lp
UserName: sync
UserName: shutdown
UserName: halt
UserName: mail
UserName: operator
[root@xuegod1603 days6]# awk -F: '{printf "UserName: %s %s\n",$1,$NF}' mima
UserName: root /bin/bash
UserName: bin /sbin/nologin
UserName: daemon /sbin/nologin
UserName: adm /sbin/nologin
UserName: lp /sbin/nologin
UserName: sync /bin/sync
UserName: shutdown /sbin/shutdown
UserName: halt /sbin/halt
UserName: mail /sbin/nologin
UserName: operator /sbin/nologin
修饰符:
%[+-n.n]s ====> %15s %-15s %-.6f
N: 显示宽度
-: 左对齐
+:显示数值符号
例子1:
例子2:
[root@xuegod1603 days6]# awk 'BEGIN{miao=0;zhang=0;print "name yuwen shuxue";print "===================="}{miao+=$2;zhang+=$3;printf "%-8s %-8d %-8d\n",$1,$2,$3}END{print "======================";printf "TOTAL:%5d %8d\n",miao,zhang;printf "AVGER:%5.2f %8.2f\n",miao/NR,zhang/NR}' b.txt
name yuwen shuxue
====================
lisi 40 60
wangwu 23 24
xiaoliu 65 30
======================
TOTAL: 128 114
AVGER:42.67 38.00
在学习过程中有遇到问题的同学,希望有一个可以答疑解惑的地方,可以点击加入我们,一起学习吧!