首页 > 其他分享 >awk进阶

awk进阶

时间:2024-02-20 23:12:39浏览次数:21  
标签:bin sbin 进阶 awk home root bash

awk模式种类

awk的模式分为这几种

正则表达式
基本正则
扩展正则
比较表达式
范围表达式
特殊模式
BEGIN
END

awk比较运算符(语法)

正则表达式语法(awk模式)

经典语法图解

awk正则练习/etc/passwd

创建测试数据

创建用户
[242-yuchao-class01 root ~]#for i in `seq 10`;do useradd t${i};done

删除用户
for i in `seq 10`;do userdel -rf t${i};done

awk提取出/etc/passwd 中root用户行

简写
[242-yuchao-class01 root ~]#awk -F ':' '/^root/' /etc/passwd
root:x:0:0:root:/root:/bin/bash

或者写全了动作
[242-yuchao-class01 root ~]#awk -F ':' '/^root/{print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash

提取root用户、以及它的登录解释器信息
[242-yuchao-class01 root ~]#awk -F ':' '/^root/{print $1,$NF}' /etc/passwd
root /bin/bash

awk提取出允许登录的用户行

[242-yuchao-class01 root ~]#awk -F ':' '/bash$/' /etc/passwd
root:x:0:0:root:/root:/bin/bash
t1:x:1001:1001::/home/t1:/bin/bash
t2:x:1002:1002::/home/t2:/bin/bash
t3:x:1003:1003::/home/t3:/bin/bash
t4:x:1004:1004::/home/t4:/bin/bash
t5:x:1005:1005::/home/t5:/bin/bash
t6:x:1006:1006::/home/t6:/bin/bash
t7:x:1007:1007::/home/t7:/bin/bash
t8:x:1008:1008::/home/t8:/bin/bash
t9:x:1009:1009::/home/t9:/bin/bash
t10:x:1010:1010::/home/t10:/bin/bash

awk提取出用户名以t开头的行

方法1
[242-yuchao-class01 root ~]#awk -F ':' '/^t/' /etc/passwd
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
t1:x:1001:1001::/home/t1:/bin/bash
t2:x:1002:1002::/home/t2:/bin/bash
t3:x:1003:1003::/home/t3:/bin/bash
t4:x:1004:1004::/home/t4:/bin/bash
t5:x:1005:1005::/home/t5:/bin/bash
t6:x:1006:1006::/home/t6:/bin/bash
t7:x:1007:1007::/home/t7:/bin/bash
t8:x:1008:1008::/home/t8:/bin/bash
t9:x:1009:1009::/home/t9:/bin/bash
t10:x:1010:1010::/home/t10:/bin/bash


方法2
[242-yuchao-class01 root ~]#awk -F ':' '/^t.*/' /etc/passwd

提取出由用户自己创建的用户

(uid大于1000)
[242-yuchao-class01 root ~]#awk -F ':' '$3>=1000{print $0}' /etc/passwd
www:x:1000:1000::/home/www:/sbin/nologin
t1:x:1001:1001::/home/t1:/bin/bash
t2:x:1002:1002::/home/t2:/bin/bash
t3:x:1003:1003::/home/t3:/bin/bash
t4:x:1004:1004::/home/t4:/bin/bash
t5:x:1005:1005::/home/t5:/bin/bash
t6:x:1006:1006::/home/t6:/bin/bash
t7:x:1007:1007::/home/t7:/bin/bash
t8:x:1008:1008::/home/t8:/bin/bash
t9:x:1009:1009::/home/t9:/bin/bash
t10:x:1010:1010::/home/t10:/bin/bash


(家目录在/home下的用户)
[242-yuchao-class01 root ~]#awk '/\/home.*/' /etc/passwd
www:x:1000:1000::/home/www:/sbin/nologin
t1:x:1001:1001::/home/t1:/bin/bash
t2:x:1002:1002::/home/t2:/bin/bash
t3:x:1003:1003::/home/t3:/bin/bash
t4:x:1004:1004::/home/t4:/bin/bash
t5:x:1005:1005::/home/t5:/bin/bash
t6:x:1006:1006::/home/t6:/bin/bash
t7:x:1007:1007::/home/t7:/bin/bash
t8:x:1008:1008::/home/t8:/bin/bash
t9:x:1009:1009::/home/t9:/bin/bash
t10:x:1010:1010::/home/t10:/bin/bash

提取出禁止登录的用户

对bash的解释器行,结果取反

对最后一个字段进行正则匹配
awk -F ':' '$NF!~/bash$/{print $0}' /etc/passwd

对所有字段正则匹配
awk -F ':' '$0!~/bash$/{print $0}' /etc/passwd


指定找出nologin的行
[242-yuchao-class01 root ~]#awk -F ':' '/nologin/{print $0}' /etc/passwd

awk正则提取ip

1.指定行号,提取ip
[242-yuchao-class01 root ~]#ifconfig ens33 | awk 'NR==2{print $2}'
192.168.0.242

2.指定分隔符提取ip
[242-yuchao-class01 root ~]#ifconfig ens33 | awk -F 'inet|netmask' 'NR==2{print $2}'
 192.168.0.242

判断常用服务端口是否存活

提取出http和ssh服务的端口

方法1,指定对第四列字段进行正则匹配,是否存在22或80端口
[242-yuchao-class01 root ~]#netstat -tunlp|awk '$4~/22|80/{print $0}'
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      7040/nginx: master
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      900/sshd
tcp6       0      0 :::80                   :::*                    LISTEN      7040/nginx: master
tcp6       0      0 :::22                   :::*                    LISTEN      900/sshd


方法2,整行匹配,偷懒写法
[242-yuchao-class01 root ~]#netstat -tunlp|awk '/22|80/'
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      7040/nginx: master
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      900/sshd
tcp6       0      0 :::80                   :::*                    LISTEN      7040/nginx: master
tcp6       0      0 :::22                   :::*                    LISTEN      900/sshd

提取/etc/passwd的10~20行
要求且显示行号

[242-yuchao-class01 root ~]#awk 'NR>=10&&NR<=20{print NR,$0}' /etc/passwd
10 operator:x:11:0:operator:/root:/sbin/nologin
11 games:x:12:100:games:/usr/games:/sbin/nologin
12 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
13 nobody:x:99:99:Nobody:/:/sbin/nologin
14 systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
15 dbus:x:81:81:System message bus:/:/sbin/nologin
16 polkitd:x:999:998:User for polkitd:/:/sbin/nologin
17 tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
18 sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
19 postfix:x:89:89::/var/spool/postfix:/sbin/nologin
20 nginx:x:998:996:Nginx web server:/var/lib/nginx:/sbin/nologin

awk范围模式

可以用到正则
可以用到比较运算符
范围模式就是从某一行到某一行,均是符合条件的行。

语法
awk '/regex1/,/regex2/{action}' yuchao.log

显示root行到mail用户的行
处理/etc/passwd
且显示行号

[242-yuchao-class01 root ~]#awk '/^root/,/^mail/{print NR,$0}' /etc/passwd
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8 halt:x:7:0:halt:/sbin:/sbin/halt
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

显示bin用户到第五行
且显示行号

[242-yuchao-class01 root ~]#awk '/^bin/,NR==5{print NR,$0}' /etc/passwd
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

awk特殊模式BEGIN和END

BEGIN模式

BEGIN模式作用是在awk开始读取文件行数据、之前就先执行,一般用于预定义一些操作,比如数据的表头格式化等。
BEGIN后面必须跟上action动作
BEGIN打印
显示/etc/passwd前五行,且打印BEGIN动作

[242-yuchao-class01 root ~]#awk 'BEGIN{print "于超老师正在带你学习awk"}NR<=5{print $0}' /etc/passwd
于超老师正在带你学习awk
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

awk格式化打印/etc/passwd
提取root、mail、nobody三个用户信息
名字
家目录
登录解释器
且设置好表头(格式化打印)

[242-yuchao-class01 root ~]#awk -F ':' 'BEGIN{print "用户名","家目录","解释器"}$1~/(root|mail|nobody|t5)/{print $1,$6,$NF}' /etc/passwd |column -t
用户名  家目录           解释器
root    /root            /bin/bash
mail    /var/spool/mail  /sbin/nologin
nobody  /                /sbin/nologin
t5      /home/t5         /bin/bash

BEGIN简单玩法
只打印
处理数据之前的动作

[242-yuchao-class01 root ~]#awk 'BEGIN{print "于超老师带你学linux"}'
于超老师带你学linux

计算器

[242-yuchao-class01 root ~]#awk 'BEGIN{print 10/3}'
3.33333

[242-yuchao-class01 root ~]#awk 'BEGIN{print 10/3+2*3}'
9.33333

awk自定义变量
数值变量

[242-yuchao-class01 root ~]#awk 'BEGIN{x=3;y=8;print x*y}'
24

字符串变量

[242-yuchao-class01 root ~]#awk 'BEGIN{name="于超";print name,"正在教你学linux"}'
于超 正在教你学linux

END模式

和BEGIN相反,END就是awk结束后的操作
END是awk读取完所有的文件后,再执行END模块,一般用来总结、格式化打印一个结果

END仅会在awk所有行数据处理完毕后,执行END动作。

[242-yuchao-class01 root ~]#awk -F ':' 'BEGIN{print "超哥带你学linux"}NR<=5{print NR,$0}END{print "学完了,讲的不错"}' /etc/passwd
超哥带你学linux
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
学完了,讲的不错

计算/etc/passwd行数
示/etc/passwd的用户名、登录解释器、且在结尾显示行数

[242-yuchao-class01 root ~]#awk -F ':' '{print $1,$NF}END{print "总行数:",NR}' /etc/passwd
root /bin/bash
bin /sbin/nologin
daemon /sbin/nologin
adm /sbin/nologin
lp /sbin/nologin
sync /bin/sync
shutdown /sbin/shutdown
halt /sbin/halt
mail /sbin/nologin
operator /sbin/nologin
games /sbin/nologin
ftp /sbin/nologin
nobody /sbin/nologin
systemd-network /sbin/nologin
dbus /sbin/nologin
polkitd /sbin/nologin
tss /sbin/nologin
sshd /sbin/nologin
postfix /sbin/nologin
nginx /sbin/nologin
www /sbin/nologin
t1 /bin/bash
t2 /bin/bash
t3 /bin/bash
t4 /bin/bash
t5 /bin/bash
t6 /bin/bash
t7 /bin/bash
t8 /bin/bash
t9 /bin/bash
t10 /bin/bash
总行数: 31

统计如下数据,有多少空行
测试数据

[242-yuchao-class01 root ~]#cat t1.log -n
     1    I am teacher yuchao.
     2    I teach linux,python!
     3
     4    I like english
     5
     6    My website is http://yuchaoit.cn
     7    Our school site is https://apecome.com
     8    My qq num is 877348180
     9
    10
    11
    12
    13    #my qq num is not  87777773333344444888811188880000
    14    #
    15    #Goog good study , day day up!

awk变量计数器

变量用法
num+=1 
意思是 num=1 ; num=num+1
定义num变量,当做计数器,awk每处理一行,计数器就加一
[242-yuchao-class01 root ~]#awk '{num+=1;print "num的值是",num}' t1.log
num的值是 1
num的值是 2
num的值是 3
num的值是 4
num的值是 5
num的值是 6
num的值是 7
num的值是 8
num的值是 9
num的值是 10
num的值是 11
num的值是 12
num的值是 13
num的值是 14
num的值是 15

统计空行数(END总结)

[242-yuchao-class01 root ~]#awk '/^$/{num+=1;print $0}END{print "文件空行数是:",num}' t1.log






文件空行数是: 6

可以省去打印的动作、直接统计

[242-yuchao-class01 root ~]#awk '/^$/{num+=1}END{print "文件空行数是:",num}' t1.log
文件空行数是: 6

END计算器

面试题,用awk计算 1+2+3+...+50

[242-yuchao-class01 root ~]#seq 1 50 | awk '{i+=$0}END{print "1到50叠加总和是:",i}'
1到50叠加总和是: 1275

标签:bin,sbin,进阶,awk,home,root,bash
From: https://www.cnblogs.com/btcm409181423/p/18024246

相关文章

  • awk
    awk是什么awk是一个强大的linux命令,有强大的文本格式化的能力,好比将一些文本数据格式化成专业的excel表的样式。awk早期在Unix上实现,我们用的awk是gawk,是GUNawk的意思如何学awkawk的语法格式awk指令是由模式,动作,或者模式和动作的组合组成.模式即pattern,可以类似理解......
  • 日志分析中的 awk、sort、uniq 和 grep 应用
    awk简介  awk是一种强大的文本处理工具,其功能与sed和grep相似,但更加灵活。它使用类似C语言的语法,并且适用于处理结构化文本数据,如表格数据。awk是一种模式扫描和处理语言,可以轻松提取、操作和格式化文本数据,特别是适用于处理日志文件中的结构化信息。sort简介  sort用于对......
  • ARL分析与进阶使用
    在使用ARL(AssetReconnaissanceLighthouse资产侦察灯塔系统,项目地址地址为https://github.com/TophantTechnology/ARL)的时候,有两个问题比较困扰我:1.ARL使用Fofa导入数据的时候怎么降重?2.如何自己手动编写Poc?在网上查阅了一些相关资料后,我发现并没有有师傅写的很清晰,于是诞生......
  • 轻松掌握 Linux 文本处理三剑客:grep、awk 和 sed 实战演练
     Shell脚本语言编程有哪些优势呢?Shell脚本语言的优势在于能够以最轻量级最快捷的速度处理Linux操作系统偏底层的业务。比如软件的自动化安装、更新版本,监控报警,日志分析等。虽然其他高级编程语言如PHP、Python、Ruby等语言也能做到,但是效率和开发成本上会大打折扣,所谓“......
  • RK3568驱动指南|驱动基础进阶篇-进阶5 自定义实现insmod命令实验
    瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和MaliG522EE图形处理器。RK3568支持4K解码和1080P编码,支持SATA/PCIE/USB3.0外围接口。RK3568内置独立NPU,可用于轻量级人工智能应用。RK3568支持安卓11和linux系统,主要面向......
  • BEVDet的进阶BEVPoolv2:A Cutting-edge Implementation of BEVDet Toward Deployment
    论文地址:https://arxiv.org/pdf/2211.17111.pdf​arxiv.org/pdf/2211.17111.pdf代码地址:GitHub-HuangJunJie2017/BEVDet:OfficialcodebaseoftheBEVDetseries.​github.com/HuangJunJie2017/BEVDet/tree/dev2.0整体思想:作者从工程优化的角度考虑优化BEVDet,提出了B......
  • 03 进阶篇-高阶数据类型BitMaps、HyperLogLogs
    BitMaps介绍BitMaps的基本概念,它是一种通过位来表示数据的方法,能高效地处理大量布尔值。展示BitMaps在用户在线状态、统计等方面的应用示例。介绍相关的命令,如SETBIT,GETBIT,BITCOUNT,BITOP等。BitMaps的基本概念BitMaps,或称为位图,是Redis中用于高效处理大量布尔值的......
  • 前端知识回顾概览--ES进阶
    了解ES新增特性并熟悉1. ES6规范详解ECMAScript规范发展简介ES6新增API解析&&ESNext规范中的API解析generator/asyncawait简介函数进阶(箭头函数、默认参数)模板字符串对象和数组的扩展用法Proxy、Reflect、Map、Set、Symbolfor...of、迭代器模式、生成......
  • 从零开始的 dbt 入门教程 (dbt core 开发进阶篇)
    引在上一篇文章中,我们花了专门的篇幅介绍了dbt更多实用的命令,那么我们继续按照之前的约定来聊dbt中你可能会遇到的疑惑以及有用的概念,如果你是dbt初学者,我相信如下知识点一定会对你有极大的帮助:了解dbt_project配置文件,以及不同字符的作用了解dbt工程化,为dev以及......
  • RK3568驱动指南|驱动基础进阶篇-进阶6 内核运行ko文件实验——系统调用
    瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和MaliG522EE图形处理器。RK3568支持4K解码和1080P编码,支持SATA/PCIE/USB3.0外围接口。RK3568内置独立NPU,可用于轻量级人工智能应用。RK3568支持安卓11和linux系统,主要面向......