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

#数组名[下标]  = 值

 

  

  

 

posted @ 2020-02-14 18:30  风之老凌  阅读(2863)  评论(0编辑  收藏  举报