Linux文本三剑客---awk

AWK是什么

Linux文本三剑客之一(grep,sed,awk),功能最强大的文本工具。

逐行读取输入的文本内容,默认以空格和tab键作为分隔符。但是多个空格或者tab键的空格,会自动压缩成一个,然后按照指定的模式和条件执行编辑命令

可以在免交互的情况下,实现复杂的文本操作。完成自动化配置。

awk格式

awk '操作符 action' file

操作符:想干啥

action:怎么做

file:处理对象

例如:

awk 'BEGIN{x=1};{x++};END{处理动作}' 文件名

awk '操作符 {处理动作}' 文件名

{}外部表示定义条件

{}内指定操作

BEGIN对条件做初始化操作

for ((i=1;i<=10;i++))

awk常用选项

-F:指定分隔符,如果是空格,tab键,可以不加

-v:变量赋值,awk无法从外部获取变量

awk的内置变量:

NR:需要处理行号

FS:列分隔符 和F作用一致,如果用FS,则 FS=":"

OFS:输出内容的列分隔符

NF:表示最后一个字段

$n:内置变量

awk '{print NR}' /etc/passwd

显示行号

awk '{print NR $0}' /etc/passwd

显示行号和内容

awk 'NR==3,NR==5{print}' /etc/passwd

第三行和第五行

awk 'NR==3;NR==5{print}' /etc/passwd

第三行到第五行

awk '(NR>=3)&&(NR<=5){print}' test.txt

第三行到第五行

awk 'NR%2==0{print}' test.txt

打印偶数行

awk 'NR%2==1{print}' test.txt

打印奇数行

awk的运算--求幂运算

[root@hj ~]# awk 'BEGIN{print 2^3}'

8

[root@hj ~]# awk 'BEGIN{print 2**3}'

8

awk按行取列(最重要)

bash 复制代码
awk -F: '{print $2,$NF}' /etc/passwd

大写的NF为最后一列

$x:第几列

表示打印第二列和最后一列

AWK的精确筛选

$n (> < ==);进行数值对比

$n~"字符串" 代表这个字段包含某个字符串

$n!~"字符串" 代表这个字段不包含某个字符串

$n=="字符串" 代表这个字段要和字符串相同

$n!="字符串" 取反,不为某个字段

$NF:代表最后一个字段

下面举几个例子方便大家理解:

1./etc/passwd 输出最后一个字段中包含bash所在行的第一个字段和最后一个字

bash 复制代码
awk -F: '$NF~"bash" {print $1,$NF}' /etc/passwd

2./etc/passwd 只有第一列是root的行,才打印他的第六行

bash 复制代码
awk -F: '$1=="root" {print $6}' /etc/passwd

3.输出最后一个字段,不包含bash,打印第一列和第六列

bash 复制代码
awk -F: '$NF~"bash" {print $1,$6}' /etc/passwd

需要注意:

~:是包含的意思

==:为"是"的意思

二者有很大区别

4.指定第6个字段为/home/hj 而且最后一个字段为/bin/bash 满足条件的输出第一列和最后一列

bash 复制代码
awk -F: '($6=="/home/hj")&&($NF=="/bin/bash") {print $1.$NF}' /etc/passwd

条件判断打印

结合if语句使用

if $3>500 打印所有

AWK三元表达式

awk三元表达式继承了java,格式和Java也一样

awk '{条件表达式1 ? A表达式或者值:B表达式或者值}' 文件名

awk -F: '{max=(3\>=4)?3:4;{print max $0}}' /etc/passwd

?:

if else

if [ 3\>=4 ]

then

echo $3

else

echo $4

fi

文本内容匹配打印

打印/etc/passwd中以root开头的行

bash 复制代码
awk '/^root/{print}' /etc/passwd

getline函数:getline和管道符以及重定向符号在一块的时候,才有特殊功效

重定向:<> 把其中一个文件的内容传给另外一个

| :输出指定内容,先到定义的变量,再由getline调用变量当中的内容,最后打印出结果。

getline函数运行之后,会改变awk的内置变量,读取的行数也会发生变化,getline在前,就是第一行跳过,打印第二行

getline在后,从第一行开始,跳过第二行,打印的就是奇数

-v给变量赋值

BEGIN模式

对变量初始化。需要初始化变量的时候才会使用

格式

awk 'BEGIN{x=1};{x++};{print x}' test.txt

对行数计算

awk和数组结合使用

awk中如何定义数组

原理:索引的下标是唯一的

a是遍历了所有数组,把结果赋值给i,i在下面继续

本章结束,

下面有几个实例可供参考:

1.日志分割:

free 内存监控

df -h 磁盘监控

top 动态进程监控

top -b -n 1静态

监控内存的百分比(不超过90%,超过警报),磁盘(不超过80%),进程(75%),写成函数库,以定时任务的方式每天早上十点整执行,

函数库调用实现

相关推荐
xuanzdhc2 小时前
Linux 基础IO
linux·运维·服务器
愚润求学2 小时前
【Linux】网络基础
linux·运维·网络
bantinghy2 小时前
Linux进程单例模式运行
linux·服务器·单例模式
小和尚同志3 小时前
29.4k!使用 1Panel 来管理你的服务器吧
linux·运维
帽儿山的枪手3 小时前
为什么Linux需要3种NAT地址转换?一探究竟
linux·网络协议·安全
shadon1789 天前
回答 如何通过inode client的SSLVPN登录之后,访问需要通过域名才能打开的服务
linux
AWS官方合作商9 天前
AWS ACM 重磅上线:公有 SSL/TLS 证书现可导出,突破 AWS 边界! (突出新功能的重要性和突破性)
服务器·https·ssl·aws
小米里的大麦9 天前
014 Linux 2.6内核进程调度队列(了解)
linux·运维·驱动开发
程序员的世界你不懂9 天前
Appium+python自动化(三十)yaml配置数据隔离
运维·appium·自动化
算法练习生9 天前
Linux文件元信息完全指南:权限、链接与时间属性
linux·运维·服务器