Linux awk

1. 基础用法

操作粒度更加精细,可以以特殊字符(: = 空格等)分割为列再进一步操作。例如 ps -aux获取到自己的进程后想进一步操作就可以使用awk指令。

awk 'BEGIN {commands} pattern {commands}END{commands}' filename
BEGIN:处理数据前执行的命令
END:处理数据后执行的命令
pattern:模式,每一行都执行的命令
BEGIN和END里的命令只是执行一次
pattern里的命令会匹配每一行去处理
awk '{print $0}' test.txt
* $0为全部行,$1为每行第一个列,$2为第二个列....
awk -F':' 'NR>20' test.txt
* NR在awk中代表行号
* -F指定’:‘为每行中的字段的分隔符。不指定默认为空格或者TAB。
awk -F':' 'NR>20' test.txt
* NR:行号

  • 使用管道配合grep将user的线程提取并输出到test.txt
    在这里插入图片描述
    在这里插入图片描述
awk '{print NF}' test.txt     
awk "{print $NF}' test.txt
* NF:统计每一行总字段数,$NF,输出每一行最后一个字段的值
awk "{print $(NF-1)}' test.txt
* 打印倒数第2个字段
awk -F:  '/root/{print $0)' /etc/passwd
* 以:为分割,打印包含root的全部行;
* 把$0换$1,则会打印首列内容

在这里插入图片描述

2. awk字符获取和筛选

awk -F: 'BEGlIN{print "hello"}{i+=1; print $1}END{print i; print "goodbye"}' passwd
//begin:正式文本处理前执行的
//中间:针对每一行执行的指令,打印第一列,并借助i统计行数
//end:执行完毕后输出的
//begin、end可以省略,直接对每一行执行中间的部分


awk -F:'$4 > $3{print $0}'/etc/passwd
//'$4 > $3是一个限制条件,第四列大于第三列才打印

awk -F: '/bash/{print $0}'  /etc/passwd
//只要行中包含bash则打印

awk -F: '$NF ~/bash/{print $0}'  /etc/passwd
//$NF表示每行的最后一个字段
//每行的最后一个字段是bash则打印
//~表示等于

awk -F '$NF !~ /bash/{print $0}' /etc/passwd
//每行的最后一个字段不是bash则打印

awk -F:'$3+$4>2000 && $3*$4>2000{print $0}'/etc/passwd
//&&表示逻辑与

awk -F: '$3+$4>2000 || $3*$4>2000{print $0}'  /etc/passwd
//||表示逻辑或

awk -F: !($3 + $4>2000){print $0}' /etc/passwd
//!表示逻辑非

awk -F':'  '{(sum+=$4)} END {print sum}' ps.txt
//将第四列内容求和

获取CPU/MEM占用率

如下,第四列代表MEM使用率
在这里插入图片描述

在这里插入图片描述

将awk指令包封脚本

在这里插入图片描述

在这里插入图片描述

再用如下指令调用执行即可
awk -f command.awk passwd

3.awk条件与循环语句

awk -F":" '{if($3 ==0 ){print $1"is super user";}elseif($3>1&&$3<=999) {print $1"is system user"; }else {print $1" iscommon user"}'} passwd
//指令太长,所以写到脚本里面增强可读性,参考下图
//passwd是目标文件

在这里插入图片描述
在这里插入图片描述

awk -F: '{for(i=10;i>0;i--){print $0}}' passwd
//基于for循环每行打印10次

awk -F: '{i=1;while(i<10){print $0, i++}}' passwd
//基于while循环每行打印10次

awk -F:'{if(NR%5==0){print "----------"}print $0}' passwd
//$0打印每一行,每隔5行打印分割符

4.awk调用函数

  • substr:精确提取子字符,有三个参数。如下图所示,$2代表默认使用空格分割的第2列大字符串,4代表大字符串中的第4个字符,2表示从第四个字符开始(包含第4个字符),共计取2个单字符。
  • 指令的含义是从beacon.log中提取第18分钟发生的全部info信息
  • 将$0替换为$2可以打印第2列内容,即具体是18分多少秒的信息
    在这里插入图片描述
    length:获取字符串中单字符的个数
    在这里插入图片描述
  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Arist9612

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值