linux中的awk命令及用法
一、awk简介
awk是一种处理文本文件的语言,是一种强大的文本分析工具
二、awk的参数及语法
awk [参数] '{print 打印内容}' 处理的文件
-F:定义分隔符,表示读入文件已指定的分隔符分隔
-v:进入变量模式,可以进行变量的赋值和调用(调用不需要加$符号)
三、awk的基本用法
用法一:输出passwd中用户名及用户所使用的命令解释器
#方式一 awk -F':' '{print $1" "$7}' /etc/passwd #输出
root /bin/bash bin /sbin/nologin daemon /sbin/nologin #方式二 awk -F':' '{print $1" "$(NF)}' /etc/passwd #输出
root /bin/bash bin /sbin/nologin daemon /sbin/nologin
其中NF表示每行分隔之后的总共的列数
NR表示行数
awk -F':' 'NR==5 {print $1" "$(NF)}' /etc/passwd #第五行的内容
lp /sbin/nologin
用法二:使用多个分隔符进行分隔
#输出第五行的用户名及最终的命令解释器 awk -F'[:/]' 'NR==5 {print $1" "$(NF)}' /etc/passwd
#输出
lp nologin 注:多个分隔符之间使用[](小括号声明),awk默认的分隔符是空格
用法三:awk中使用变量
awk -v a=2 -v b=3 'NR==1 {print a+b}' /etc/passwd #输出
5 注:awk工具必须依赖于文件
四、awk中的内置变量及运算符的使用
运算符 | 描述 |
|| | 逻辑或 |
&& | 逻辑与 |
~ ~! | 匹配正则表达式和不匹配正则表达式 |
< <= > >= != == | 关系运算符 |
空格 | 连接 |
+ - * / % | 加减乘除取余 |
++ -- | 增加或减少 |
$ | 字段引用 |
in | 数组成员 |
接下来用的的文本内容,yanshi.txt
3 test nginx mysql
4 MySQL docker kvm awk
This's a test
22 tomcat redis shell,python,java
用法一:过滤第一例大于3的行
awk '$1 > 3' yanshi.txt
#输出 4 MySQL docker kvm awk This's a test 22 tomcat redis shell,python,java
用法二:过滤第一列大于3并且第二列等于“MySQL”的行
awk '$1 > 3 && $2 == "MySQL"' yanshi.txt #输出 4 MySQL docker kvm awk
\$n | 当前记录的第n个字段 |
FS | 字段分隔符 |
NF | 每行字段的个数 |
NR | 已读的记录数,也就是行号 |
OFS | 指定输出记录的分隔符 |
FILENAME | 当前文件名 |
IGNORECASE | 如果为真,则进行忽略大小写的匹配 |
ENVIRON | 环境变量关联数组 |
ERRNO | 最后一个系统错误的描述 |
ORS | 输出记录分隔符(默认值是一个换行符)。 |
用法一:指定#作为输出分隔
awk '{print $1,$2,$3}' OFS="#" yanshi.txt #输出 3#test#nginx 4#MySQL#docker This's#a#test 22#tomcat#redis ############################ awk '{print $1,$2,$3}' ORS="#" yanshi.txt #输出结果 3 test nginx#4 MySQL docker#This's a test#22 tomcat redis#
五、awk中的的正则表达式
元字符 | 说明 |
^ | 在串首部匹配 |
$ | 在串尾部匹配 |
. | 匹配任意字符 |
* | 匹配零个或多个前导字符 |
+ | 匹配一个或多个前导字符 |
? | 匹配零个或一个前导字符 |
[abc] | 匹配自定字符组(abc)中的字符 |
[^abc] | 匹配任何一个不再指定字符组(abc)的字符 |
[a-z] | 匹配a到z之间的任意一个字符 |
a|b | 匹配a或b |
(ab)+ | 匹配一个或多个ab的组合 |
\* | 配置星号本身 |
& | 用在替代串中,代表查找串中匹配到的内容 |
{m} | 指点匹配前面的字符m次 |
{m,} | 指定匹配前面的字符至少m次 |
{m,n} | 指定匹配前面的字符m~n次 |
~,!~ | 指定标量与正则表达式匹配或不匹配 |
可以查看 awk正则运算表达式详解
六、awk中的函数应用
应用一:求出已使用的内存的百分比
free | awk '/Mem/ {print int($3/$2*100)}' 13
应用二:生成一个随机数
echo "" | awk '{srand(); print int(rand()*10)}' 5 echo "" | awk '{srand(); print int(rand()*10)}' 6 #srand()将rand的函数种子,rand()返回任意数n,其中0<=n<1
应用三:时间函数
#systime()函数返回当前时间戳
echo "" | awk '{print systime()}' 1581650690 [root@fengling ~]# date -d@1581650690 Fri Feb 14 11:24:50 CST 2020 [root@fengling ~]# date Fri Feb 14 11:25:36 CST 2020
#strftime()函数格式化时间
echo "" | awk '{print strftime("%Y-%m-%d %H:%M:%s")}'
2020-02-14 11:28:1581650907
#mktime()将指定时间转换为时间戳
echo "" | awk '{print mktime(2018" "9" "10 " "10" "5" "20)}'
1536545120
date -d@1536545120
Mon Sep 10 10:05:20 CST 2018
七、awk的初始代码块与结束代码块
#要使用的文件log.txt
2019/03/12 21:23:25 [info] client: 118.124.94.110 server: www.minerbabe.com, request: "GET/keys/ssh/pb?device_id=4e8227b63&need_update=0 HTTP/1.1", host: "www.minerbabe.com"
2019/03/12 21:23:25 [error] client: 118.124.94.110 server: www.minerbabe.com, request: "GET/keys/ssh/pb?device_id=4e8227b63&need_update=0 HTTP/1.1", host: "www.minerbabe.com"
2019/03/12 21:23:25 [error] client: 118.124.94.110 server: www.minerbabe.com, request: "GET/keys/ssh/pb?device_id=4e8227b63&need_update=0 HTTP/1.1", host: "www.minerbabe.com"
2019/03/12 21:23:25 [info] client: 118.124.94.110 server: www.minerbabe.com, request: "GET/keys/ssh/pb?device_id=4e8227b63&need_update=0 HTTP/1.1", host: "www.minerbabe.com"
2019/03/12 21:23:25 [error] client: 118.124.94.110 server: www.minerbabe.com, request: "GET/keys/ssh/pb?device_id=4e8227b63&need_update=0 HTTP/1.1", host: "www.minerbabe.com"
2019/03/12 21:23:25 [error] client: 118.124.94.173 server: www.minerbabe.com, request: "GET/keys/ssh/pb?device_id=2d20b53c5&need_update=0 HTTP/1.1", host: "www.minerbabe.com"
2019/03/12 21:23:25 [error] client: 118.124.94.173 server: www.minerbabe.com, request: "GET/keys/ssh/pb?device_id=2d20b53c5&need_update=0 HTTP/1.1", host: "www.minerbabe.com"
2019/03/12 21:23:25 [error] client: 118.124.94.27 server: www.minerbabe.com, request: "GET/keys/ssh/pb?device_id=fa7c727f0&need_update=0 HTTP/1.1", host: "www.minerbabe.com"
2019/03/12 21:23:25 [error] client: 118.124.94.75 server: www.minerbabe.com, request: "GET/keys/ssh/pb?device_id=e7c5fbd34&need_update=0 HTTP/1.1", host: "www.minerbabe.com"
2019/03/12 21:23:25 [info] client: 118.124.94.29 server: www.minerbabe.com, request: "GET/keys/ssh/pb?device_id=d4b3050af&need_update=0 HTTP/1.1", host: "www.minerbabe.com"
#开头输出yi结尾输出三
echo "" | awk 'BEGIN {print"yi"} {print "er"} END{print "san"}' yi er san
实例一:打印出IP地址以及错误等级
要求格式:IP地址 错误等级
awk 'BEGIN{print "ip地址"" ""错误等级"} {print $5" "$3}' log.txt ip地址 错误等级 118.124.94.110 [info] 118.124.94.110 [error] 118.124.94.110 [error] 118.124.94.110 [info] 118.124.94.110 [error] 118.124.94.173 [error] 118.124.94.173 [error] 118.124.94.27 [error] 118.124.94.75 [error] 118.124.94.29 [info]
八、awk中的控制语句
实例一:if--else语句
#输出错误等级为error的IP地址 awk '{if($3=="[error]") print $5}' log.txt 118.124.94.110 118.124.94.110 118.124.94.110 118.124.94.173 118.124.94.173 118.124.94.27 118.124.94.75
#输出错误等级为error的IP地址,错误等级不为error输出错误等级
awk '{if($3=="[error]")print $5; else print $3}' log.txt
[info]
118.124.94.110
118.124.94.110
[info]
118.124.94.110
118.124.94.173
118.124.94.173
118.124.94.27
118.124.94.75
[info]
实例二:while语句
echo "" | awk -v i=1 '{while(i<10){print(i); i = i + 1}}' 1 2 3 4 5 6 7 8 9
实例三:for语句
echo "" | awk '{for(i=1;i<=3;i++) print i}' 1 2 3
九、awk中的数组
awk '{line[NR] = $5} END{for(i=NR;i>0;i--) print line[i]}' log.txt 118.124.94.29 118.124.94.75 118.124.94.27 118.124.94.173 118.124.94.173 118.124.94.110 118.124.94.110 118.124.94.110 118.124.94.110 118.124.94.110 #数组名[下标] = 值