Shell脚本文本三剑客之awk编辑器(人类从不掩饰探索星空的愿望)

news2025/1/21 12:03:41

文章目录

  • 一、awk简介
  • 二、awk工作原理
  • 三、awk命令格式
  • 四、awk命令的使用
    • 1.print操作按行输出文本
    • 2.print操作按字段截取输出文本
    • 3.使用BEGIN和END指定操作
    • 5.使用操作getline
    • 6.使用操作OFS
    • 7.配合数组使用

一、awk简介

awk是linux的一个强大的命令,具备强大的文本格式化能力,比如对一堆看起来没有什么规律的日志文件,文本文件等,通过awk命令格式化输出为专业的可以做为应用级数据分析的样式。

二、awk工作原理

逐行读取文本,默认以空格或制表符为分隔符进行分隔,将分隔所得的各个字段保存到内建变量中,并按模式或者条件执行编辑命令。

sed命令常用于一整行的处理,而awk比较倾向于将一行分成多个“字段”,然后再进行处理。awk信息的读入也是逐行读取的,执行结果可以通过print的功能将字段数据打印显示。

在使用awk命令的过程中,可以使用逻辑操作符"&&“表示"与”、“||“表示"或”、”!“表示"非”,还可以进行简单的数学运算,如+、-、*、/、%、^分别表示加、减、乘、除、取余和乘方

三、awk命令格式

awk [选项] ‘模式或条件 {操作表达式}’ 文件名…

awk常用选项

在这里插入图片描述

awk常见内建变量

在这里插入图片描述

四、awk命令的使用

1.print操作按行输出文本

//1.输出所有内容
[root@localhost1 ~]#awk '{print}' numfile
one
two
three
four
five
six
seven
eight
nine
ten
[root@localhost1 ~]#awk '{print $0}' numfile    #$0代表匹配到的整行
one
two
three
four
five
six
seven
eight
nine
ten
 
//2.指定行,输出1~3行内容
[root@localhost1 ~]#awk 'NR==1,NR==3 {print}' numfile
one
two
three
[root@localhost1 ~]#awk '(NR>=1)&&(NR<=3) {print}' numfile
one
two
three
 
//3.指定的几行,输出第1、3行
[root@localhost1 ~]#awk 'NR==1||NR==3 {print}' numfile
one
three
 
 
//4.输出奇偶行
[root@localhost1 ~]#awk '(NR%2)==0 {print}' numfile
two
four
six
eight
ten
[root@localhost1 ~]#awk '(NR%2)==1 {print}' numfile
one
three
five
seven
nine
 
//5.输出行号
[root@localhost1 ~]#awk '{print NR,$0}' file1
1 one two three
2 four five six
3 seven eight nine
4 ten eleven twelve
 
//6.指定第1行包含o的行。输出行号和内容
[root@localhost1 ~]#awk '$1~"o" {print NR,$0}' file1
1 one two three
2 four five six
 
//7.指定输出包含指定字符串的行
[root@localhost1 ~]#awk '/root/ {print}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
 
//8.指定输出包含指定正则表达式的行
[root@localhost1 ~]#awk '/^root.*bash$/ {print}' /etc/passwd
root:x:0:0:root:/root:/bin/bash

2.print操作按字段截取输出文本

//1.指定字段分隔符":",输出每行1,3字段
[root@localhost1 ~]#awk -F ':' '{print $1,$3}' /etc/passwd
root 0
bin 1
daemon 2
adm 3
lp 4
sync 5
shutdown 6
halt 7
mail 8
...
avahi 70
postfix 89
tcpdump 72
hx 1000
apache 48
zhangsan 1001
lisi 1002
zhaoliu 1003
wangwu 1004
qianqi 1005
zhuba 1006
 
//2.在第1条基础上,限定行范围,第3个字段值小于1000的行,输出每行1,3字段
[root@localhost1 ~]#awk -F ':' '$3>1000 {print $1,$3}' /etc/passwd
nfsnobody 65534
zhangsan 1001
lisi 1002
zhaoliu 1003
wangwu 1004
qianqi 1005
zhuba 1006
 
//3.指定最后一个字段包含sbin的行,输出第1和最后一个字段
[root@localhost1 ~]#awk -F ':' '$NF~"sbin" {print $1,$NF}' /etc/passwd
bin /sbin/nologin
daemon /sbin/nologin
adm /sbin/nologin
lp /sbin/nologin
shutdown /sbin/shutdown
halt /sbin/halt
mail /sbin/nologin
operator /sbin/nologin
games /sbin/nologin
...
rpcuser /sbin/nologin
nfsnobody /sbin/nologin
gnome-initial-setup /sbin/nologin
sshd /sbin/nologin
avahi /sbin/nologin
postfix /sbin/nologin
tcpdump /sbin/nologin
apache /sbin/nologin
named /sbin/nologin
dhcpd /sbin/nologin
 
//4.输出最后一个字段既不是/sbin/nologin也不是/bin/bash的行
[root@localhost1 ~]#awk -F ':' '($NF!="/sbin/nologin")&&($NF!="/bin/bash") {print $1,$NF}' /etc/passwd
sync /bin/sync
shutdown /sbin/shutdown
halt /sbin/halt
 
 

3.使用BEGIN和END指定操作

awk [选项] ‘BEGIN {表达式}; [条件] {操作表达式}; END {表达式}’ 文件名…

  • BEGIN {操作1} awk在读取文件之前执行的操作
  • [条件] {操作2} awk 逐行读取文件时执行的操作
  • END {操作3} awk在处理完文件所有行之后执行的操作
//1.输出结尾为nologin的行,并为每行计数显示行号,最后输出总行数
[root@localhost1 ~]#awk 'BEGIN {a=0}; /nologin$/ {a++; print a,$0}; END {print " 共有"a"行"}' /\etc/passwd
1 bin:x:1:1:bin:/bin:/sbin/nologin
2 daemon:x:2:2:daemon:/sbin:/sbin/nologin
3 adm:x:3:4:adm:/var/adm:/sbin/nologin
4 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
5 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
...
34 nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
35 gnome-initial-setup:x:988:982::/run/gnome-initial-setup/:/sbin/nologin
36 sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
37 avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
38 postfix:x:89:89::/var/spool/postfix:/sbin/nologin
39 tcpdump:x:72:72::/:/sbin/nologin
40 apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
41 named:x:25:25:Named:/var/named:/sbin/nologin
42 dhcpd:x:177:177:DHCP server:/:/sbin/nologin
共有42行
//1.输出以:分割的第1和3个字段
[root@localhost1 ~]#echo $PATH |awk 'BEGIN {FS=":"}; {print $1,$3}'
/usr/local/sbin /usr/sbin
 
//2.输出$PATH的每个文件
[root@localhost1 ~]#echo $PATH |awk 'BEGIN {RS=":"}; {print NR,$0} END {print "共有"NR"行"}'
1 /usr/local/sbin
2 /usr/local/bin
3 /usr/sbin
4 /usr/bin
5 /root/bin
共有5行
 
//3.输出ens33网卡的ip和mac地址
[root@localhost1 ~]#ifconfig ens33
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.116.10  netmask 255.255.255.0  broadcast 192.168.116.255
        inet6 fe80::7791:1d06:d2da:af8e  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:3b:4b:c3  txqueuelen 1000  (Ethernet)
        RX packets 19934  bytes 1547296 (1.4 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 8225  bytes 867536 (847.2 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
 
[root@localhost1 ~]#ifconfig ens33 |awk 'NR==2 {print $2}'
192.168.116.10
 
[root@localhost1 ~]#ifconfig ens33 |awk '/ether/ {print $2}'
00:0c:29:3b:4b:c3
 
//4.内存占用多少MB
[root@localhost1 ~]#free -m
              total        used        free      shared  buff/cache   available
Mem:           1819         563         849          14         406        1080
Swap:          8191           0        8191
 
[root@localhost1 ~]#free -m | awk 'NR==2 {print $3}'
563
[root@localhost1 ~]#free -m | awk '/Mem/ {print $3}'
563
 
//5.内存占用率
[root@localhost1 ~]#free -m
              total        used        free      shared  buff/cache   available
Mem:           1819         563         848          14         406        1080
Swap:          8191           0        8191
 
[root@localhost1 ~]#free -m | awk '/Mem/ {print ($4/$2*100)"%"}'
46.619%
[root@localhost1 ~]#free -m | awk '/Mem/ {print int($4/$2*100)"%"}'
46%
 
//6.CPU空闲率
[root@localhost1 ~]#top -b -n1 |awk -F "," '/Cpu/ {print $4}' |awk '{print $1"%"}'
98.5%
 
//7.计算开机时间
[root@localhost1 ~]#date -d "$(awk '{print $1}' /proc/uptime) second ago" +"%Y%m%d %H:%M:%S"
20220905 21:28:50
[root@localhost1 ~]#date -d "-$(awk '{print $1}' /proc/uptime) second" +"%Y%m%d %H:%M:%S"
20220907 08:32:41

5.使用操作getline

  • 当getline左右无重定向符“<”或“|”时,awk首先读取到了第一行,就是1,然后getline,就得到了1下面的第二行,就是2,因为getline之后,awk会改变对应的NF,NR,FNR和$0等内部变量,所以此时的$0的值就不再是1,而是2了,然后将它打印出来。
  • 当getline左右有重定向符“<”或“|”时,getline则作用于定向输入文件,由于该文件是刚打开,并没有被awk读入一行,只是getline读入,那么getline返回的是该文件的第一行,而不是隔行。
//1.利用getline输出奇偶行
[root@localhost1 ~]#seq 10 |awk '{getline;print $0}'
2
4
6
8
10
[root@localhost1 ~]#seq 10 |awk '{print $0;getline}'
1
3
5
7
9
 
//2.利用getline输出主机名
[root@localhost1 ~]#awk 'BEGIN {"hostname" |getline ;{print $0} }'
localhost1
 
//3.利用getline读取w命令显示的行数,统计出在线用户数(减去前2个无关行)
[root@localhost1 ~]#w
 14:56:47 up  6:24,  1 user,  load average: 0.00, 0.01, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    192.168.116.1    14:17    7.00s  0.14s  0.02s w
[root@localhost1 ~]#w |awk 'NR>2 {print $0 | "wc -l"}'
1
 

6.使用操作OFS

//1.利用OFS输出第1和3个字段,并用:作为输出的分隔符
[root@localhost1 ~]#echo "A B C D" |awk '{OFS=":";print $1,$3}'
A:C
 
//2.利用OFS指定分割符输出整行内容时,需要使用$1=$1刷新整行内容
[root@localhost1 ~]#echo "A B C D" |awk '{OFS=":";$1=$1;print $0}'
A:B:C:D

7.配合数组使用

//1.输出指定数组值
[root@localhost1 ~]#awk 'BEGIN {a[0]=10;a[1]=20;print a[1]}'
20
[root@localhost1 ~]#awk 'BEGIN {a[0]=10;a[1]=20;print a[0]}'
10
 
//2.使用字符串作为数组索引,输出指定数组值
[root@localhost1 ~]#awk 'BEGIN {a["abc"]=10;a["xyz"]=20;print a["abc"]}'
10
//数组值也可以为字符串
[root@localhost1 ~]#awk 'BEGIN {a["abc"]="aa";a["xyz"]="xx";print a["abc"]}'
aa
 
//3.遍历数组
[root@localhost1 ~]#awk 'BEGIN {a[0]=10;a[1]=20;a[2]=30; for(i in a) {print i,a[i]}}'            0 10
1 20
2 30

利用数组做统计
awk 根据指定字段读取每行的字段内容,使用字段内容作为数组的索引,如果出现相同内容的行,则用这个行内容做的数组的值自增1;END{ for(i in arr) {print arr[i],i} awk 读取完所有行内容后,使用for循环遍历这个数组的下标,打印每个下标出现的次数和下标的值。

awk ‘{arr{$n}++}; END{ for(i in arr) {print arr[i],i}’ 文件名…

//1.利用数组统计,输出文件中各行出现的次数并排序
[root@localhost1 ~]#cat test.txt | awk '{arr[$1]++}; END{for(i in arr) {print arr[i],i}}' test.txt |sort -rn
4 aaa
3 bbb
1 ccc
 
//2.利用数组统计,过滤输入密码超过3次的主机ip
[root@localhost1 /]#awk '/Failed password/ {a[$13]++};END{for(i in arr) {print arr[i],i}}' /var/log/secure |awk '$1>3 {print $2}'
192.168.116.1
192.168.116.10

利用数组做去重

awk ‘1’ 就是 awk ‘1{print}’ ,允许打印读入的行内容,例:echo 123 | awk ‘1’
awk ‘0’ 就是 awk ‘0{print}’ ,不允许打印读入的行内容,例:echo 123 | awk ‘0’
var++ 的形式:先读取 var 变量值,再对 var 值 +1
awk 处理第一行时:先读取 a[$1] 值再自增,a[$1] 即 a[1] 值为空(即0),即为 awk ‘!0’,即为 awk ‘1’,即为 awk’1{print}’
awk 处理第二行时:先读取 a[$1] 值再自增,a[$1] 即 a[1] 值为 1,即为 awk ‘!1’,即为 awk ‘0’,即为 awk ‘0{print}’

//使用!arr[$1]++实现禁止重复读取到的内容输出
[root@localhost1 ~]#arr=(1 2 3 4 3 4 5 3 5 2 3 1)
[root@localhost1 ~]#echo ${arr[@]} |awk 'BEGIN{RS=" "}; !arr[$1]++'
1
2
3
4
5

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

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

相关文章

puppeteer-不需重构,无痛加强vue单页面应用的SEO,提升百度收录排名

背景 最近产品觉得我们网站在百度收录上排名太靠后了&#xff0c;又不肯花钱&#xff0c;就让我们想办法提升网站的SEO。由于项目是用vue3写的&#xff0c;并且已经迭代多个版本了&#xff0c;用nuxt实在不适宜&#xff0c;当然俺的开发水平也不够&#xff0c;周期也会拉得很长…

字典翻译EasyTrans简单使用分享

前言 最近太忙了&#xff0c;一直按在项目上摩擦&#xff0c;都没有时间写分享了。今天终于市把所有负责的模块都写完了&#xff0c;本次迭代引入了字典翻译&#xff0c;借这个机会顺便分享下。 一、什么是字典翻译 所谓的字典翻译其实简单理解就是一些不常更新的有键值对属性的…

什么是 Java 的内存模型?如何保证安全

Java 的内存模型定义了多线程程序中&#xff0c;不同线程之间如何共享和访问共享变量的规则。Java 内存模型的设计旨在保证线程安全和可见性&#xff0c;同时保证程序的性能。本文将介绍 Java 内存模型的基本概念、线程安全的实现方法以及如何使用 synchronized 和 volatile 关…

yolo 训练

这里写目录标题 分配训练集&Validation数量数据集读取读取全部文件夹替换路径 loss weightNMSBBox_IOUEIou Optimizer 分配训练集&Validation数量 validation_size training_size * validation_ratio / (1 - validation_ratio)training_size 219 validation_ratio …

基于Java+SpringMVC+vue+element实现前后端分离校园失物招领系统详细设计

基于JavaSpringMVCvueelement实现前后端分离校园失物招领系统详细设计 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获…

单轴丝杠平台实现搬运功能

1. 功能说明 本文示例将实现R279样机单轴丝杠平台搬运的功能。 该机构是由一个丝杠模组和一个 舵机关节模组 组合而成&#xff0c;关节模组上安装了一个电磁铁。 注意限位开关【①触碰传感器、②近红外传感器】的安装位置&#xff1a; 2. 丝杠传动机构原理 丝杠传动机构是一个将…

基于海思Hi3531 ARM+K7 FPGA高性能综合视频图像处理平台

板卡概述 XM703是自主研制的一款基于PCIE总线架构的高性能综合视频图像处理平台&#xff0c;该平台采用Xilinx的高性能Kintex UltraScale系列FPGA加上华为海思的高性能视频处理器来实现。 华为海思的HI3531DV200是一款集成了ARM A53四核处理器性能强大的神经网络引擎&#xff…

最新域名查询-中文域名注册到期查询软件

最新域名查询 最新域名查询指的是查询最新注册的域名或者快速确认某个域名是否被注册等相关信息的工具。以下是一些常用的最新域名查询工具&#xff1a; 域名Whois查询工具&#xff1a;Whois查询是一种查询域名注册信息的方式&#xff0c;可以查询已经注册的域名的所有信息&am…

http/https

http 基本概念 超文本传输协议&#xff0c;是互联网应用最广泛的协议之一&#xff0c;用于从 WWW 服务器传输超文本到本地浏览器的传输协议&#xff0c;它可以使浏览器更加高效&#xff0c;使网络传输减少。 https 基本概念 HTTPS是HTTP over SSL的简称&#xff0c;即工作…

LTI连续线性时不变系统能控性证明(格拉姆判据、秩判据)

一、能控性和能达性 1.1、能控性和能达性的定义 能控性&#xff1a;如果在一个有限的时间间隔内&#xff0c;可以用幅值没有限制的输入作用&#xff0c;使偏离系统平衡状态的某个初始状态回复到平衡状态&#xff0c;就称这个初始状态是能控的。 能达性&#xff1a;系统在外控…

【网红营销】海外网红营销怎么做?及注意事项?

随着互联网的发展和全球化的进程&#xff0c;海外网红营销逐渐成为企业推广产品和服务的重要途径。海外网红可以借助其社交媒体平台上的影响力&#xff0c;帮助企业扩大品牌知名度、提升销售业绩。然而&#xff0c;海外网红营销存在着一定的挑战和风险&#xff0c;企业需要制定…

探索将大语言模型用作推荐系统

编者按&#xff1a;目前大语言模型主要问答、对话等场景&#xff0c;进行被动回答。是否可以将大模型应用于推荐系统&#xff0c;进行主动推送呢&#xff1f; 这篇文章回顾了可以将大模型作为推荐系统的理论基础&#xff0c;并重点描述了基于英文和阿拉伯语的购物数据集微调T5-…

菜鸟健身-新手使用哑铃锻炼手臂的动作与注意事项

目录 一、前言 二、哑铃锻炼手臂的好处 三、哑铃锻炼手臂的注意事项 四、哑铃锻炼手臂的基本动作 1. 哑铃弯举 2. 哑铃推举 3. 哑铃飞鸟 五、哑铃锻炼手臂的进阶动作 1. 哑铃侧平举 2. 哑铃俯身划船 六、哑铃锻炼手臂的训练计划 七、总结 一、前言 哑铃是一种非常…

2023年5月天津/南京/成都/深圳CDGA/CDGP数据治理认证报名

6月18日DAMA-CDGA/CDGP数据治理认证考试开放报名中&#xff01; 考试开放地区&#xff1a;北京、上海、广州、深圳、长沙、呼和浩特、杭州、南京、济南、成都、西安。其他地区凑人数中… DAMA-CDGA/CDGP数据治理认证班进行中&#xff0c;报名从速&#xff01; DAMA认证为数据管…

MySQL 日志管理与恢复

MySQL日志管理 MySQL的默认日志保存位置为/usr/local/mysql/data 日志开启方式有两种&#xff1a;通过配置文件或者是通过命令 通过命令修改开启的日志是临时的&#xff0c;关闭或重启服务后就会关闭 MySQL日志管理 日志的分类 1.错误日志 用来记录当MySQL启动、停止或运行时…

畅购商城4.0

畅购商城4.0 1.走进电商 1.1电商行业分析 近年来&#xff0c;世界经济正向数字化转型&#xff0c;大力发展数字经济成为全球共识。党的十九大报告明确提出要建设“数字中国”“网络强国”&#xff0c;我国数字经济发展进入新阶段&#xff0c;市场规模位居全球第二&#xff0c;数…

DC-DC直流隔离升压电源模块高压稳压可调输出12v24v48v转60V80V110V150V200V220V250V300V400V500V

特点 效率高达 80%以上1*2英寸标准封装单电压输出价格低稳压输出工作温度: -40℃~85℃阻燃封装&#xff0c;满足UL94-V0 要求温度特性好可直接焊在PCB 上 应用 HRB W2~40W 系列模块电源是一种DC-DC升压变换器。该模块电源的输入电压分为&#xff1a;4.5~9V、9~18V、及18~36V、…

我们拆了一款将ChatGPT“落地”的AI语音交互机器人,八核A7全志R58主控

视频版本拆机&#xff1a;【60块钱&#xff0c;垃圾佬的第一台机器人&#xff0c;国产8核CPU全志R58】 https://www.bilibili.com/video/BV1Qk4y177ja/?share_sourcecopy_web&vd_source6ec797f0de1d275e996fb7de54dea06b 公子小白是一对由狗尾草智能科技推出的人工智能机…

Pytorch代码——持续更新

1 连续两个argsort 返回张量中每个元素对应的排名 torch.argsort(torch.argsort(pred, dim1, descendingTrue),dim1,descendingFalse) 例子 使用一个argsort后得到的是张量中按列降序排序后的索引&#xff0c; 再使用一个argsort后是张量中每一个元素的排名。 例如第2行中…

港联证券|股票分批技巧是什么?分批买进的手续费如何计算?

股票分批是股市中常用操作&#xff0c;根基股票的波动不同&#xff0c;将资金分批投资在不同股价还在时间上。那么股票分批技巧是什么&#xff1f;分批买进的手续费如何计算&#xff1f;下面就由港联证券为大家分析&#xff1a; 股票分批技巧是什么&#xff1f; 1、补仓股票选…