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%),写成函数库,以定时任务的方式每天早上十点整执行,

函数库调用实现

相关推荐
watermelonoops5 分钟前
Windows安装Ubuntu,Deepin三系统启动问题(XXX has invalid signature 您需要先加载内核)
linux·运维·ubuntu·deepin
不惑_9 分钟前
小白入门 · 腾讯云轻量服务器部署 Hadoop 3.3.6
服务器·hadoop·腾讯云
阿甘知识库28 分钟前
宝塔面板跨服务器数据同步教程:双机备份零停机
android·运维·服务器·备份·同步·宝塔面板·建站
滴水之功1 小时前
VMware OpenWrt怎么桥接模式联网
linux·openwrt
saynaihe1 小时前
安全地使用 Docker 和 Systemctl 部署 Kafka 的综合指南
运维·安全·docker·容器·kafka
ldinvicible1 小时前
How to run Flutter on an Embedded Device
linux
YRr YRr2 小时前
解决Ubuntu 20.04上编译OpenCV 3.2时遇到的stdlib.h缺失错误
linux·opencv·ubuntu
认真学习的小雅兰.2 小时前
如何在Ubuntu上利用Docker和Cpolar实现Excalidraw公网访问高效绘图——“cpolar内网穿透”
linux·ubuntu·docker
zhou周大哥2 小时前
linux 安装 ffmpeg 视频转换
linux·运维·服务器
不想起昵称9293 小时前
Linux SHELL脚本中的变量与运算
linux