Linux初学(十二)AWK进阶

一、AWK

1.1 简介

  • AWK是Linux中重要的文本处理工具
  • Linux三剑客只一
  • 处理的对象可以是一个具体的文件,也可以是一个命令的执行结果
  • AWK按行读取文件,将每一行视为一条记录

案例一:获取系统中每个用户的uid

方法一:cat /etc/passwd | awk -F ":" '{print $3}'

方法二:awk -F ":" '{print $3}' /etc/passwd

案例二:显示root用户的家目录

方法一:head -n1 /etc/passwd | awk -F ":" '{print %6}'

方法二:grep "^root\>" /etc/passwd | awk -F ":" '{print $6}'

1.2 awk的基本格式

awk [选项] '模式{动作}' 文件

  • 选项:
    • -F "分隔符" : 用什么字符将这行内容分成一段一段的
  • 模式:在处理一行之前先要判断的条件
    • 如果条件满足,就处理这行,否则,直接开始读取下一行
    • 如果不设置条件,则处理文件中的每一行
  • 动作:模式中的条件在满足的情况下,对这行内容执行的操作

awk用来表示每一段的方法

  • $1:第一个字段
  • $2:第二个字段
  • $3:第三个字段
  • $NF:表示每行的最后一个字段
  • $0:表示一整行

案例

1、获取每行的最后一个字段

awk -F "/" '{print $NF}‘ /etc/passwd’


2、显示系统中的全部用户名

awk -F ":" '{print $1}' /etc/passwd


3、显示系统中的前三个用户
awk -F  ":" 'NR<=3{print $1}' /etc/passwd

  • NR【Number of Record】:awk的内置变量,表示正在读取的是第几条记录
    • 当读取第一行内容的时候,NR的值是1;当读取第二行的时候,NR的值是2,依次类推
    • 每读取一行内容,NR的值自动加1

1.3 概念

  • 记录:文件中的一行就是一条记录
    • awk在工作的时候,每次会读取一条记录
    • 每读取一条,NR值加1
  • 字段:一行被分隔的多个部分,一个部分就是一个字段
  • 分隔符:指定用什么来将这个记录分成一段一段的

案例

1、仅显示/etc/passwd中的第三行内容

awk -F ":" 'NR==3 {print $0}' /etc/passwd


2、输出系统中每个用户的姓名以及对应的shell类型

awk -F ":" '{print $1,"shell is ",$NF}' /etc/passwd

注意:输出多个字段的情况下,多个字段中间用逗号分隔

1.4 变量

  • FS:表示字段分隔符(默认是任何空格)
  • NF:表示字段数(当前这个记录中字段的个数)
  • NR:表示记录数,在执行过程中对应于当前的行号
  • OFS:表示输出域分隔符
  • ORS:表示输出记录分隔符(默认值是一个换行符)
  • RS:表示记录分隔符(默认是一个换行符)

案例:

1、输出3-5行的用户姓名、和shell类型

方法一:awk -F ":" 'NR>=3&&NR<=5{print $1,$NF}' /etc/passwd

方法二:head -n5 /etc/passwd | tail -n3 | awk -F ":" '{print $1,$NF}'

2、获取ens33的IP地址

方法一:ip addr show ens33 | grep "inet\>" | awk -F " " '{print $2}' | awk -F "/" '{print $1}'

方法二:ip addr show ens33 | awk -F " " 'NR==3{print $2}' | awk -F "/" '{print $1}'

方法三:ip addr show ens33 | awk -F "[/ ]+" 'NR==3{print $3}'

3、统计/tmp/a.txt 中每行有多少个单词

awk -F " " '{print "第",NR,"行有",NF,"单词"}' /tmp/a.txt

1.5 awk结合正则表达式

1)在awk中进行搜索操作

  • 格式:awk -F ":" '/过滤的内容/{print xxx}'

案例:显示tom用户的uid

awk -F ":" '/tom '{print $3}' /etc/passwd

2)awk和^的结合使用

案例:/etc/passwd匹配以root为开头的行,打印整条记录

awk -F ":" '/^root\>/{print $0}' /etc/passwd

3)awk和$的结合使用

案例:/etc/passwd匹配以bash为结尾的行,打印整条记录

awk -F ":" '/bash$/{print $0}' passwd

4)awk和.的结合使用

案例:/etc/passwd匹配以r和t之间有两个字符的行,打印整条记录

awk -F ":" '/r..t/{print $0}' /etc/passwd

5)awk和.*的结合使用

案例:/etc/passwd匹配以r和t之间有任意字符的行,打印整条记录

awk -F ":" '/r.*t/{print $0}' /etc/passwd

6)指定多个分隔符

  • 指定单个分割符:-F "xxx"
  • 指定多个分隔符:-F [xxx],分隔符中如果有空格和其他符号同时作为分隔符,那么[ ]中空格必须在最后
  • 指定多个连续的符号作为分隔符,可以用+

awk -F "[/-]+" '{print $1}'  1.txt

1.6 awk练习

1)在passwd文件中,找用户名是以a为开头的行

awk -F ":" '$1~/^a/{print $0}'  /etc/passwd

2)倒数第二列$(NF-1)这一列查找匹配以tom结尾的行

awk -F ":" '$(NF-1)~/tom$/{print NR,$0}' /etc/passwd

3)$3这一列查找匹配以a或b或s开头的行

方法一:awk -F ":" '$3~/^(a|b|s)/{print $0}'  /etc/passwd

方法二:awk -F ":" '$3~/^[abs]/{print $0}'  /etc/passwd

4)取ens33网卡ip地址

方法一:纯grep方法

ip addr show ens33 | grep -oP '(?<=inet\s)\d+(\.\d+){3}'

方法二:grep结合awk
ip addr show ens33 | grep "inet\>" | awk -F " " '{print $2}' | awk -F "/" '{print $1}'

方法三:纯awk
ip addr show ens33 | awk -F "[/ ]+" 'NR==3{print $3}'

ip addr show ens33 | awk -F "[/ ]+"  '/inet\>/{print $3}'

ip addr show ens33 | awk -F "[/ ]+"  '$NF~/ens33$/{print $3}'

5)找出/etc/passwd的第六个字段(以:为分隔符)以/sbin开头的行

awk -F ":" '$6~/^\/sbin/{print $0}' /etc/passwd

6)找出/etc/passwd的第六个字段(以:为分隔符)不是以/sbin开头的行

awk -F ":" '$6!~/^\/sbin/{print $0}' /etc/passwd

1.7 awk的表达式

序号符号含义举例
1<小于【处理数字】NR<7
2>大于【处理数字】NR>5
3==等于【处理数字】NR==3
4!=不等【处理数字】NR!=6
5>=大于等于【处理数字】NR>=3
6<=小于等于【处理数字】NR<=4
~用于进行正则表达式匹配【处理字符串】$3~/^abc/
8!~用于进行正则表达式不匹配【处理字符串】$3!~/^abc/

1.8 awk模块

awk的模块包含两个

BEGIN:

END:

BEGIN模块

  • 用于定义一个动作,用{ }表示要执行的动作
  • 这个动作要在读取文件之前执行
  • 这里的动作大多要用于定义变量,包括内置变量,自定义变量

END模块

  • 用于定义一个动作,用{ }表示要执行的动作
  • 这个动作是awk将文件中的内容读取完成之后,而且处理完成以后,END模块才会执行
  • 这里的动作通常用于输出一个结果

格式:

  • awk 'BEGIN{}END{}' fileName
  • 工作过程
    • step 1:执行BEGIN中的操作,通常是定义变量:内置变量、自定义变量
    • step 2:BEGIN中的操作执行完成以后,读取一行fileName文件中的内容,然后执行一次中间的动作;然后重复读取fileName中的每行内容,并重复执行中间的动作
    • step 3:fileName中的内容全部读取完成后,执行END中的操作,通常是用于输出

案例:

1、输出每个用户的用户名、id、shell

方法一:awk -F ":" '{print $1,$3,$NF}' /etc/passwd

方法二:awk 'BEGIN{FS=":"}{print $1,$3,$NF}' /etc/passwd

2、统计 /etc/passwd 中有多少行

awk 'BEGIN{num=0}{num+=1}END{print num}' /etc/passwd

3、统计a.txt中有多少个单词

方法一:awk 'BEGIN{sum=0}{sum+=NF}END{print sum}' a.txt
方法二:

                cat 1.txt | tr ' ' '\n' >2.txt
                awk '{num+=1}END{print num}' 2.txt

                tr ' ' '\n' 作用每个空格字符替换为换行符


4、统计系统中有多少用户的shell类型是/bin/bash

awk 'BEGIN{FS=":"; sum=0}$NF~/\/bin\/bash$/{sum+=1}END{print sum}' /etc/passwd

5、输出前三个用户的用户名、id、shell
awk 'BEGIN{FS=":"}NR<=3{print $1,$3,$NF}' /etc/passwd

注意:通常每种都有默认值

  • FS默认值就是空格
  • OFS默认值就是空格
  • ORS默认是换行符
  • RS默认是换行符

案例:

1、在读取文件前输出一个提示信息
awk 'BEGIN{print "start to awk process..."}{print $0}' /etc/passwd

2、在读取文件前和后分别输出一个提示信息
awk 'BEGIN{print "start to awk process..."}{print $0}END{print "over....."}'  /etc/passwd

3、统计文件中的空白行的行数

方法一:grep "^$" a.txt | wc -l

方法二:awk 'BEGIN{num=0}/^$/{num+=1}END{print num}' a.txt

方法三:awk '/^$/{num+=1}END{print num}' a.txt


4、统计文件中以#开头的行的行数

awk 'BEGIN{num=0}/^#/{num+=1}END{print num}' a.txt

awk '/^#/{num+=1}END{print num}' a.txt

5、统计系统中uid大于大于499的用户个数

awk 'BEGIN{num=0}$3>499{num+=1}END{print num}' /etc/passwd

6、计算1~100的累加和
seq 100 | awk 'BEGIN{sum=0}{sum+=$0}END{print sum}'


7、将用户信息格式中的密码占位符和描述信息去除掉

awk 'BEGIN{FS=":";OFS=":"}{print $1,$3,$4,$6,$7}' /etc/passwd

1.9 awk 数组

变量:一个变量只能存储一个值

  • name=tom
  • age=20

数组:一组相同数据类型的集合

  • userList = ['tom','jerry','bajie','wukong']
  • 三个概念
    • 数组名
    • 数组的索引
    • 数组的索引对应的值

定义数组:

  • 数组名[索引]=值

案例:

  • 数组名:userList

定义数组元素和值:

  • userList[1]=tom
  • userList[2]=jerry
  • userList[3=bok
  • userList[4]=bajie
  • userInfo["name"]="tom"
  • userInfo["age"]=33
  • userInfo["addr"]="hebei"

获取数组中的值

  • userList[2]
  • userInfo["name"]

数组的索引

  • 数字、数字索引的变号是从0开始
  • 字母
  • 字符串

案例

[root@ansible tmp]# awk 
'BEGIN{stu[0]="tom";stu[1]="jerry";stu[2]="jack";print stu[1]}'
jerry[root@ansible tmp]# awk 
'BEGIN{stu[0]="tom";stu[1]="jerry";stu[2]="jack";print stu[2]}'
jack[root@ansible tmp]# awk 
'BEGIN{stu["name"]="tom";stu["age"]="20";stu["tel"]="1308888123";print stu["age"]}'
20[root@ansible tmp]# awk 
'BEGIN{stu["name"]="tom";stu["age"]="20";stu["tel"]="1301111";print stu["tel"]}'
1301111

1.10 数组的循环遍历

  • 格式:for(变量 in 数组名)
  • 变量中存储的是数组的索引
[root@test ~]# awk
'BEGIN{userList[0]="tom";userList[1]="jerry";userList[2]="jack"}
END{for(var in userList) print "第",var1+1,"个用户是",userList[var]}' mypwd
第 1 个用户是 tom
第 2 个用户是 jerry
第 3 个用户是 jack[root@test ~]# awk
'BEGIN{info["name"]="tom";info["age"]="25";info["addr"]="beijing"}
END(for var in info) print var,"is",info[var]}' mypwd
age is 25
addr is beijing
name is tom[root@test ~]# awk
'BEGIN{info["www.baidu.com"]=5;info["ftp.baidu.com"]=11;info["mail.baidu.com"]=
9;info[cdn.baidu.com"]=23}END(for(var in info) print var,"is",info[var]}' mypwd
ftp.baidu.com is 11
cdn.baidu.com is 23
www.baidu.com is 5
mail.baidu.com is 9
案例:分析httpd的日志文件,对各个域名的访问次数进行排序
http://www.baidu.com/index.html
http://mail.baidu.com/index.html
http://ftp.baidu.com/index.html
http://ftp.baidu.com/index.html
http://www.baidu.com/index.html
http://ftp.baidu.com/index.html
http://mail.baidu.com/index.html
http://mail.baidu.com/index.html
http://www.baidu.com/index.html
http://ftp.baidu.com/index.html
http://www.baidu.com/index.html
http://www.baidu.com/index.html
http://ftp.baidu.com/index.html
http://ftp.baidu.com/index.html
获取每个域名的出去次数
[root@ansible ~]# awk -F "/+" '{list[$2]++}END{for(site in list)print site,
list[site]}' web.log
ftp.baidu.com 6
www.baidu.com 5
mail.baidu.com 3
基于域名的出现次数进行排序
方法一:
[root@ansible ~]# awk -F "/+" '{list[$2]++}END{for(site in list)print
site,list[site]}' web.log | sort -n -k2 -r
ftp.baidu.com 6
www.baidu.com 5
mail.baidu.com 3方法二:
[root@ensible ~]# awk -F "/+" '{print $2}' web.log | sort | uniq -c | sort -k1 -n
3 mail.baidu.com
5 www.baidu.com
6 ftp.baidu.com
案例:分析/var/log/secure日志,显示用户从哪些IP登录系统,并对ip出现次数进行排序
[root@test log]# awk -F "(from|port)" /Accepted password/{ip[$2]+=1}END{
for(var in ip)print var,ip[var]}' log1.txt | sort -t " " -k2 -r -n
192.168.31.100 36
192.168.1.123 24
192.168.1.5 2
192.168.1.100 2
192.168.1.8 1
案例:统计每天产生多少条日志信息
awk '{day[$1,$2]++}END{for(var in day)print var,day[var]}' log1.txt
案例:统计9月13日的每小时产生多少条日志
awk -F "[: ]+" '$2==13(date[$3]++}END{for(var in date)print var,date[var]}' log1.txt
案例:统计9月13日的12点到14点期间,一共产生多少条日志
awk -F "[: ]+" '$2==13&&$3>=12&&$3<=14{sum+=1}END{print sum}' log1.txt
案例:统计9月13日的12点到14点期间,用户登录过多少次
awk -F "[: ]+" '/Accepted password/&&$2==13&&$3>=12&&$3<=14{sum++}END{print sum}' log1.txt
案例:统计9月13日的12点到14点期间,用户通过哪些IP登录过,分别显示登录过多少次
awk -F "[: ]+" '$0~/Accepted password/&&$2==13&&$3>=12&&$3<=14{ip[$3]++}END{for
(var in ip)print var,ip[var]}' log1.txt
192.168.1.123 2
192.168.1.100 5
192.168.1.8 3

sort命令

  • 作用:排序
  • 选项
    • -n:基于数字进行排序
    • -r:逆序排序
    • -k#:根据那个字段进行排序

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/792335.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue3+threejs新手从零开发卡牌游戏(二十五):尾声(附完整源码下载地址)

这个demo到这里就算接近尾声了&#xff0c;大体的游戏框架就算搭建完成了&#xff0c;主要是提供了一下思路&#xff0c;代码也是来来回回修改了好几次&#xff0c;也踩了一些坑&#xff0c;后续可以自行优化一些战斗效果和交互逻辑、UI美化等&#xff0c;这里附上源码下载链接…

CMD 命令行进入到电脑硬盘的某个目录的几种方式

本文介绍几种 cmd 命令行进入到电脑硬盘的某个目录的几种方式。 1、在具体文件目录地址栏输入 cmd 回车 这是最快的、最牛的方式&#xff0c;没有之一。 比如&#xff1a;我想进入一个层级很深的文件目录&#xff0c;直接打开在那个目录&#xff0c;把地址栏信息删除清空&am…

FLink学习(三)-DataStream

一、DataStream 1&#xff0c;支持序列化的类型有 基本类型&#xff0c;即 String、Long、Integer、Boolean、Array复合类型&#xff1a;Tuples、POJOs 和 Scala case classes Tuples Flink 自带有 Tuple0 到 Tuple25 类型 Tuple2<String, Integer> person Tuple2.…

【C++进阶】带你手撕红黑树(红与黑的爱恨厮杀)

&#x1fa90;&#x1fa90;&#x1fa90;欢迎来到程序员餐厅&#x1f4ab;&#x1f4ab;&#x1f4ab; 主厨&#xff1a;邪王真眼 主厨的主页&#xff1a;Chef‘s blog 所属专栏&#xff1a;c大冒险 总有光环在陨落&#xff0c;总有新星在闪烁 引言&#xff1a; 之前我们…

『大模型笔记』LLMs入门:不涉及太多数学和术语的LLMs基本原理通俗讲解

LLMs入门:不涉及太多数学和术语的LLMs基本原理通俗讲解 文章目录 一. 词向量(Word vectors)二. 词义取决于上下文(Word meaning depends on context)三. 将词向量转化为词语预测(Transforming word vectors into word predictions)四. 请问我能吸引你的注意力吗(Can I have yo…

vivado 串行矢量格式 (SVF) 文件编程

串行矢量格式 (SVF) 文件编程 注释 &#xff1a; 串行矢量格式 (SVF) 编程在 Versal ™ 器件上不受支持。 对 FPGA 和配置存储器器件进行编程的另一种方法是通过使用串行矢量格式 (SVF) 文件来执行编程。通过 Vivado Design Suite 和 Vivado Lab Edition 生成的 SVF …

八数码(bfs做法)非常详细,适合新手服用

题目描述&#xff1a; 在一个 33 的网格中&#xff0c;1∼8这 8 个数字和一个 x 恰好不重不漏地分布在这 33 的网格中。 例如&#xff1a; 1 2 3 x 4 6 7 5 8在游戏过程中&#xff0c;可以把 x 与其上、下、左、右四个方向之一的数字交换&#xff08;如果存在&#xff09;。 我…

JS-11A/11时间继电器 板前接线 JOSEF约瑟

系列型号&#xff1a; JS-11A/11集成电路时间继电器&#xff1b;JS-11A/12集成电路时间继电器&#xff1b; JS-11A/13集成电路时间继电器&#xff1b;JS-11A/136集成电路时间继电器&#xff1b; JS-11A/137集成电路时间继电器&#xff1b;JS-11A/22集成电路时间继电器&#…

Folder Icons for Mac v1.8 激活版文件夹个性化图标修改软件

Folder Icons for Mac是一款Mac OS平台上的文件夹图标修改软件&#xff0c;同时也是一款非常有意思的系统美化软件。这款软件的主要功能是可以将Mac的默认文件夹图标更改为非常漂亮有趣的个性化图标。 软件下载&#xff1a;Folder Icons for Mac v1.8 激活版 以下是这款软件的一…

方格画(C/C++)

理解题意 ZZX学长在正因街买了一个白色的方格画板, 他想把画板固定在墙上绘画. 白色画板不能转动, 画板上有nn的网格, ZZX可以选择任意多行及任意多列的格子涂成黑色(选择的整行, 列均需涂成黑色), 所选行数, 列数均可为0. ZZX希望最终的成品上需要有k个黑色格子, 请告诉ZZX共…

day17-分配问题

题目描述 每个孩子最多只能给一块饼干。对每个孩子 i&#xff0c;都有一个胃口值 children[i]&#xff0c;这是能让孩子们满足胃口的饼干的最小尺寸&#xff1b;并且每块饼干 j&#xff0c;都有一个尺寸 cookies[j] 。如果 cookies[j] > children[i]&#xff0c;我们可以将…

亚马逊自动养号软件新手必读:养号过程中的关键注意事项

亚马逊买家号想要养号效果好&#xff0c;需要重点注意以下4点: 1、前期的准备工作:确保账号登陆的环境是安全的&#xff0c;最好就是用的家庭IP。然后是FBA收货 地址&#xff0c;固定的收货地址有利于账号的安全稳定性&#xff0c;还有一个就是确定安全的成交付款方式&#xf…

opencv-python库 cv2边界填充resize图片

文章目录 边界填充改变图片大小 边界填充 在OpenCV中&#xff0c;边界填充&#xff08;Border Padding&#xff09;是指在图像周围添加额外的像素&#xff0c;以扩展图像的尺寸或满足某些算法&#xff08;如卷积&#xff09;的要求。OpenCV提供了cv2.copyMakeBorder()函数来进…

网络协议栈--数据链路层

目录 对比理解“数据链路层”和“网络层”一、认识以太网1.1 以太网帧格式1.2 认识MAC地址1.3 对比理解MAC地址和IP地址1.4 认识MTU1.5 MTU对IP协议的影响1.6 MTU对UDP协议的影响1.7 MTU对于TCP协议的影响1.8 查看硬件地址和MTU 二、ARP协议2.1 ARP协议的作用2.2 ARP协议的工作…

Springboot传参要求

传参的参数名称必须与Set方法的参数名字相同 &#xff0c;不然会报错。

TS小记--

Ts学习 npm init -y -y所有问题都选yes 创建package.json文件 安装ts&#xff1a; npm i typescript -g -g全局安装&#xff0c;保证每个地方都可以使用 创建ts配置文件&#xff1a;tsconfig.json tsc -init 执行ts文件&#xff1a; tsc ./src/index.ts 导入webpac包&am…

MacBook安装使用XMind

MacBook安装使用XMind XMind简介 官方地址: https://www.xmind.cn/ XMind 是一个全功能的思维导图和头脑风暴软件,为激发灵感和创意而生。作为一款有效提升工作和生活效率的生产力工具,受到全球百千万用户的青睐。 XMind 是一款非常实用的商业思维导图软件&#xff0c;应用…

我认识的Git-史上最强的版本控制系统

大家好&#xff01; 欢迎大家来一起交流Git使用心得&#xff0c;相信很多同事对Git都很熟悉了&#xff0c;如果下面说的有错误的“知识点”&#xff0c;欢迎批评指正。 初识Git 我认识Git已经很多年了&#xff08;我在有道云笔记里面“Git”文件夹的创建时间是&#xff1a; …

树莓派部署yolov5实现目标检测(ubuntu22.04.3)

最近两天搞了一下树莓派部署yolov5&#xff0c;有点难搞&#xff08;这个东西有点老&#xff0c;版本冲突有些包废弃了等等&#xff09; 最后换到ubuntu系统弄了&#xff0c;下面是我的整体步骤&#xff1a; 1.烧完ubuntu镜像后&#xff0c;接显示器按系统流程进行系统部署(大于…

qt通过setProperty设置样式表笔记

在一个pushbutton里面嵌套两个label即可&#xff0c;左侧放置图片label&#xff0c;右侧放置文字label&#xff0c;就如上图所示&#xff1b; 但是这时的hover&#xff0c;press的伪状态是没有办法“传递”给里面的控件的&#xff0c;对btn的伪状态样式表的设置&#xff0c;是不…