shell脚本:文本三剑客awk

news2024/10/5 14:00:27

awk-命令讲解:

awk-命令讲解

  • 一、awk:
    • 1.定义:
    • 2.格式:
    • 3.工作过程:
    • 4.工作原理:
    • 5.常用选项:
  • 二、内置函数:
    • 1.getline的工作过程:
    • 2.打印:
    • 3.文件内容匹配过滤打印:
    • 4.BEGIN,END模式:
    • 5.条件判断打印:
  • 三、awk的三元表达式:
    • 1.格式:
    • 2.awk的精确筛选:
    • 3.数组:
  • 四、扩展补充:
    • 1.实例:

一、awk:

1.定义:

(1)在 Linux/UNIX 系统中,awk 是一个功能强大的编辑工具,逐行读取输入文本,默认以空格或tab键作为分隔符作为分隔。并按模式或者条件执行编辑命令。AMK信息的读入也是逐行指定的匹配模式进行查找,对符合条件的内容进行格式化输出或者过滤处理。

(2)可以在无交互的情况下实现相当复杂的文本操作,被广泛应用于 Shell脚本,完成各种自动化配置任务。

(3)总结:按命令找到指定行然后打印,awk默认操作是打印。

2.格式:

awk ‘(操作符) (怎么做)’ (处理对象)

3.工作过程:

(1)执行BEGIN{action;…}语句块中的语句。

(2)从文件或标准输入(stdin)中读取一行,然后执行{action;…}语句块,逐行扫描文件,从第一行到最后一行重复执行,直到文件全部读取完成。

(3)当读至输入流末尾时,执行END{action;…}语句块,BEGIN语句块在awk开始从输入流中读取行之前被执行,这是一个可选的语句块,比如变量初始化、打印输出表格的表头等语句通常可以写在BEGIN语句块中。END语句块在awk从输入流中读取完所有的行之后即被执行,比如打印所有行的分析结果这类信息汇总都是在END语句块中完成,它也是一个可选语句块。pattern语句块中的通用命令是最重要的部分,也是可选的。如果没有提供pattern语句块,则默认执行{ print },即打印每一个读取到的行,awk读取的每一行都会执行该语句块。

(4)总结:先看BEGIN{action},这个模块读取操作,读文件的所有行,所有读取完毕后,一次执行。END{action}打印输出结果,对前面的结果作条件判断,还可用代码操作。

4.工作原理:

sed命令常用于一整行的处理,而awk比较倾向于将一行分成多个“字段”然后再进行处理,且默认情况下字段的分隔符为空格或 tab 键。awk 执行结果可以通过 print 的功能将字段数据打印显示。

5.常用选项:

(1)常用:

选项作用
-F “分隔符”指明输入时用到的字段分隔符,默认是若干个连续的空白符
-v变量赋值

(2)常用符号:

选项作用
‘’‘模式或条件{操作}’,{}外指定条件,{}内指定条件
,指定连续的行
||指定不连续的行
&&表示且

(3)内置变量(不能用双引号,否则会被系统识别成字符串):

选项作用
$0打印当前处理行的所有内容
$n对当前处理行的第n个字段(第n列)
NR当前处理行的行号(序数)
NF当前处理行的n个字段
FS列分隔符,指定每行文本的字段分隔符,输入内容的分隔符,默认为空格或制表位。与"-F"作用相同 用-F可以不加单引号 -F:,用FS必须用=“”
OFS输出内容的列分隔符
RS行分隔符。awk从文件中读取资料时,将根据RS的定义把资料切割成许多条记录,而awk一次仅读入一条记录进行处理。预设值是"\n"
Fillname被处理的文件名

(4)基本打印用法:

1.[root@test1 opt]# awk '0{print}' test.txt  # 0和1放置{ }前,能够起到限制打印内容的作用(默认为"1"),如果为0,就不打印内容
[root@test1 opt]# awk '1{print}' test.txt 
bk
pp
chanyeol
baekhyun
2. [root@test1 opt]# awk '{print $0}' test.txt #$0,代表整行内容;awk是逐行读取处理,配合$0,就是打印所有内容
$1只取第一列,可以对行切片,输出列
bk
pp
chanyeol
baekhyun
[root@test1 opt]# awk '{print NR}' test.txt #打印行号
1
2
3
4
[root@test1 opt]# awk '{print NR,$0}' test.txt #打印行号和内容
1 bk
2 pp
3 chanyeol
4 baekhyun
3. [root@test1 opt]# awk 'NR==3{print}' test.txt #指定打印第三行
chanyeol
[root@test1 opt]# awk 'NR==2,NR==4{print}' test.txt #指定打印2-4行
pp
chanyeol
baekhyun
[root@test1 opt]# awk 'NR==2;NR==4{print}' test.txt #指定打印第二行,第四行
pp
baekhyun
[root@test1 opt]# awk '(NR>=2)&&(NR<=4){print}' test.txt #用正则表达式打印2-4行
pp
chanyeol
baekhyun

(2)奇偶行打印:

[root@test1 opt]# awk 'NR%2==0{print}' test.txt #偶数行打印
pp
baekhyun
[root@test1 opt]# awk 'NR%2==1{print}' test.txt #奇数行打印
bk
chanyeol

(3)运算:

[root@test1 ~]# awk 'BEGIN{print 100+200}'
300
[root@test1 ~]# awk 'BEGIN{print 10.2*5.5}'
56.1
[root@test1 ~]# awk 'BEGIN{print 10.2/5.5}'
1.85455
[root@test1 ~]# awk 'BEGIN{print 2^5}'
32

二、内置函数:

1.getline的工作过程:

(1)当getline左右无重定向符号(“<”,“>”)或者管道符号(“|”)时,awk首先读取的是第一行,而getline获取的是光标跳转至下一行的内容(也就是第二行)。

(2)当getline左右有管道符号或重定向符时,getline则作用定向输入文件,由于文件是刚打开,并没有被awk读入一行,而只是getline读入,所以getline返回的是文件的第一行,而不是跳转至一行输入。

2.打印:

(1)基本运用:

[root@test1 opt]# awk '{print $0;getline}' test.txt #打印奇数行
bk
chanyeol
[root@test1 opt]# awk '{getline;print $0}' test.txt #打印偶数行
pp
baekhyun

(2)总结:

  • getline是awk的内置函数。
  • 没有重定向,管道符,就打印奇偶行。
  • 重定向从指定文件获取内容,管道符相当于赋值变量。

3.文件内容匹配过滤打印:

(1)基础打印:

1.[root@test1 opt]# awk '/^root/{print}' /etc/passwd #只匹配以root开头的行
root:x:0:0:root:/root:/bin/bash
2.[root@test1 opt]# awk '/root/{print}' /etc/passwd #只匹配包含root的行
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
3.[root@test1 opt]# awk '/bash$/{print}' /etc/passwd #只匹配以bash结尾的行
root:x:0:0:root:/root:/bin/bash
wang:x:1000:1000:wang:/home/wang:/bin/bash
billkin:x:1001:1001::/home/billkin:/bin/bash
pp:x:1002:1002::/home/pp:/bin/bash
chanyeol:x:1003:1003::/home/chanyeol:/bin/bash
baekhyun:x:1004:1004::/home/baekhyun:/bin/bash
chanbaek:x:1005:1005::/home/chanbaek:/bin/bash
suho:x:1006:1006::/home/suho:/bin/bash

4.BEGIN,END模式:

(1)BEGIN打印模式:

  • 格式:awk ‘BEGIN{…};{…};END{…}’ 文件
  • 处理过程:在awk处理指定的文本之前,需要先执行BEGIN{…}模式里的命令操作。中间的{…} 是真正用于处理文件的命令操作,在awk处理完文件后才会执行END{…}模式里的命令操作。END{ }语句块中,往往会放入打印结果等语句。
  • 固定格式:awk ‘BEGIN{X=1}(初始条件);{x++}(命令操作);END{print x}(打印结果)’ 文件名

(2)运用:

1. [root@test1 opt]# awk 'BEGIN{x=1};{x++};END{print x}' test1.txt
5
2.[root@test1 opt]# head -n5 /etc/passwd |awk  -F: '{print $1}' #以冒号为分割,打印第一列
root
root
bin
daemon
adm
lp

(3)-v 变量赋值:

1. [root@test1 opt]# fs=":";awk -v FS=$fs -v OFS="+" '{print $1,$3}' /etc/passwd 
root+0 # fs的列分隔符是:,然后使用-v给FS赋值=:,输入的时候FS是:,-v给OFS赋值输出的时候变量为+,然后打印第一列和第三列
bin+1
daemon+2
adm+3
lp+4
sync+5
shutdown+6
2. [root@test1 opt]# echo $PATH | awk -v RS=':' '{print $1}' #换行输出
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/root/bin

5.条件判断打印:

(1)指定区间打印:

[root@test1 opt]# awk -F : '$3>500{print $0}' /etc/passwd #uid大于500的
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
libstoragemgmt:x:998:996:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin
colord:x:997:995:User for colord:/var/lib/colord:/sbin/nologin

(2)取反打印:

[root@test1 opt]# awk -F : '!$3<=10{print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin

(3)用if做条件判断来打印:

[root@test1 opt]# awk -F : '{if($3>10){print $0}}' /etc/passwd
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin #使用了if语句,内部条件(),外部条件{},整个加{}作为一条语句执行,相当于嵌套语法

三、awk的三元表达式:

1.格式:

(1)awk ‘(条件表达式)?(A表达式或者值):(B表达式或者值)’

(2)运用:

[root@test1 opt]# awk -F: '{max=($3>=$4)?$3:$4;{print max,$0}}' /etc/passwd|sed -n '1,6p'

在这里插入图片描述

2.awk的精确筛选:

(1)常用选项:

选项作用
$n(> < ==)用于对比数值
$n~“字符串”代表第n个字段包含某个字符串
$n!~“字符串”代表第n个字段不包含某个字符串
$n==“字符串”代表第n个字段为某个字符串
$n!=“字符串”代表第n个字段不为某个字符串
$NF代表最后一个字段

(2)基础运用:

1. [root@test1 opt]# awk -F: '$7~"bash" {print $1,$NF}' /etc/passwd 
root /bin/bash # 输出第七个字段包含“bash”所在行的第一个字段和最后一个字段
wang /bin/bash
billkin /bin/bash
pp /bin/bash
chanyeol /bin/bash
baekhyun /bin/bash
chanbaek /bin/bash
suho /bin/bash
2.[root@test1 opt]# awk -F: '$7!~"nologin" {print $1,$NF}' /etc/passwd
root /bin/bash # 输出第七个字段不包含“nologin”所在行的第一个字段和最后一个字段
sync /bin/sync
shutdown /sbin/shutdown
halt /sbin/halt
wang /bin/bash
billkin /bin/bash
pp /bin/bash
chanyeol /bin/bash
baekhyun /bin/bash
chanbaek /bin/bash
suho /bin/bash
3.[root@test1 opt]# awk -F: '($6=="/home/wang")&&($7=="/bin/bash"){print $1,$NF}' /etc/passwd
wang /bin/bash指定第六个字段为/home/wang,第七个字段为/bin/bash,输出满足这些条件所在行的第一个和最后一个字段

3.数组:

(1)基础运用:

1.[root@test1 opt]# awk 'BEGIN{a[0]=1;a[1]=2;a[2]=3;print a[1]}' 
2
2.[root@test1 opt]# 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

(2)去重:

[root@test1 opt]# awk '{a[$1]++};END{for(i in a){print i,a[i]}}' test1.txt  
baekhyun 1
chanyeol 1
pp 3
bk 3

四、扩展补充:

1.实例:

(1)日志分割:
[root@test1 opt]# awk '{print $1, $7, $9}' /var/log/messages #只取日志的第1,7,9字段

这里是引用

[root@test1 opt]# awk 'NR<=2{print $1, $4}' /var/log/messages #只分割日志前两行内容的第一个和第四个字段

这里是引用

(2)取小数点几位和取整数:

1.[root@test1 opt]# result=$(awk 'BEGIN{printf "%.2f", 2.331*2.542}') #取小数点2位
[root@test1 opt]# echo $result 
5.93
2.[root@test1 opt]# result=$(awk 'BEGIN{printf "%.F", 2.331*2.542}')  # 不取小数点,只取整数
[root@test1 opt]# echo $result 
6

(3)提取test.txt主机名后再放回test1.txt文件:

在这里插入图片描述

[root@test1 opt]# cat test.txt | awk -F '[ .]+' '{print $2}' >> test1.txt
[root@test1 opt]# cat test1.txt 
www
mail
ftp
linux
blog

(4)统计磁盘可用容量:

[root@test1 opt]# df | tail -n +2 | grep -v tmpfs | awk '{sum+=$4} END{print "磁盘可用容量:"sum/1024/1024"G"}'
磁盘可用容量:47.1945G

(5)统计/etc下文件总大小:

[root@test1 opt]# ls -l /etc | awk '/^-/{sum+=$5} END{print "文件总大小:"sum/1024"M"}'
文件总大小:975.716M

(6)统计CPU使用率:

[root@test1 opt]# sum=$(top -b -n 1 | grep -w st |awk '{print $2+$4}')
[root@test1 opt]# echo $sum
11.8

(7)统计内存:

[root@test1 opt]# free -h | awk -F " " 'NR==2 {print "总内存:"$2};{print "已用内存:"$3};{print "空闲内存:"$4}'
已用内存:free
空闲内存:shared
总内存:1.9G
已用内存:719M
空闲内存:540M
已用内存:0B
空闲内存:4.0G

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

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

相关文章

软考A计划-系统架构师-学习笔记-第四弹

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff…

信道编码的基本概念

本专栏包含信息论与编码的核心知识&#xff0c;按知识点组织&#xff0c;可作为教学或学习的参考。markdown版本已归档至【Github仓库&#xff1a;https://github.com/timerring/information-theory 】或者公众号【AIShareLab】回复 信息论 获取。 文章目录 信道编码信道编码的…

[迁移学习]预训练和微调

一、概述 一般的有监督迁移学习分为以下三种&#xff1a; ①将训练好的模型作为特征抽取模块&#xff08;例如以resnet进行特征提取&#xff09; ②在一个相关的任务中训练后直接后直接使用(例如gpt) ③在训练好的模型基础上进行微调 此外还有无监督学习的方式 zero-shot&#…

jmeter004:察看结果树

元件添加路径&#xff1a;线程组>监听器>察看结果树 取样器结果&#xff1a; ps&#xff1a;取样器是可以显示变量所对应的值的 Thread Name&#xff1a;线程组名称 Sample Start&#xff1a;运行的开始时间 Load time&#xff1a;加载的时间、持续的时间 Connect Time&a…

从零玩转系列之微信支付开篇

一、前言 halo各位大佬很久没更新了最近在搞微信支付,因商户号审核了我半个月和小程序认证也找了资料并且将商户号和小程序进行关联,至此微信支付Native支付完成.此篇文章过长我将分几个阶段的文章发布(项目源码都有,小程序和PC端) 二、演示 微信支付Native案例 微信支付JSAPI案…

【MySQL】数据表的基本操作

目录 1. 创建表 2. 创建表案例 2.1 创建一个users表 2.2 查看表结构 2.3 修改表 3. 删除表 MySQL&#x1f337; 1. 创建表 语法&#xff1a; CREATE TABLE table_name (field1 datatype,field2 datatype,field3 datatype ) character set 字符集 collate 校验规则 engine 存储…

Blogger空闲短域名搜索代码

Blogger是一个由Google提供的&#xff08;收购的公司&#xff09;免费博客平台&#xff0c;旨在使个人博客创建变得容易。用户可以使用Blogger创建自己的博客并将其托管在Google的服务器上。它不需要任何费用&#xff0c;并提供简单易用的编辑器和主题来帮助用户轻松地创建博客…

网络安全学术顶会——SP 2023 议题清单、摘要与总结(下)

注&#xff1a;本文由ChatGPT与Claude联合生成 121、QueryX: Symbolic Query on Decompiled Code for Finding Bugs in COTS Binaries 可扩展的静态检查工具&#xff0c;如Sys和CodeQL&#xff0c;成功地发现了源代码中的错误。这些工具允许分析人员编写应用程序特定的规则&…

虚拟机角度下的线程

虚拟机角度下的线程 jvm与线程 一个 Java 应用程序通常只包含一个 JVM 进程&#xff08;Java Virtual Machine&#xff0c;Java虚拟机&#xff09;&#xff0c;但在某些情况下可能会有多个 JVM 进程。 一个 Java 应用通常是一个进程&#xff0c;这个进程就是jvm&#xff0c;编…

从Cookie到Session: Servlet API中的会话管理详解

文章目录 一. Cookie与Session1. Cookie与Session2. Servlet会话管理操作 二. 登录逻辑的实现 一. Cookie与Session 1. Cookie与Session 首先, 在学习过 HTTP 协议的基础上, 我们需要知道 Cookie 是 HTTP 请求报头中的一个关键字段, 本质上是浏览器在本地存储数据的一种机制,…

基本类型转换和引用类型转换

文章目录 前言基本类型转换自动数据类型转换强制数据类型转换 引用数据类型转换向上转型向下转型 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; Java 中的类型转换可以分为基本类型转换和引用类型转换两种。 基本类型转换指的是将一种基本数据类型转换…

Koa学习3:用户添加、错误处理

模型 在src目录下创建model目录&#xff0c;用来存放模型 创建用户模型 user.model.js 注意&#xff1a; UUID类型是无法自增的&#xff0c;将id设置为UUID类型时只需要为其指定默认值即可 // 数据类型 const { DataTypes } require(sequelize); // 导入已经连接了数据库…

集合导题、刷题、考试全套完整流程,专业强大的功能,提高刷题学习效率和企业的培训效率

土著刷题微信小程序v1.15&#xff0c;主要是迭代了考试模块的进阶功能&#xff0c;对考试模块进行了一次升级改造。 由于在v1.15开发期间&#xff0c;收到了违规内容整改的通告&#xff0c;为了遵守相关法律法规&#xff0c;让小程序能够平稳安全地运营下去&#xff0c;我们特此…

我说用count(*)统计行数,面试官让我回去等消息...

前言 1 count&#xff08;*&#xff09;为什么性能差&#xff1f; 2 如何优化count&#xff08;*&#xff09;性能&#xff1f; 2.1 增加redis缓存 2.2 加二级缓存 2.3 多线程执行 2.4 减少join的表 2.5 改成ClickHouse 3 count的各种用法性能对比 前言 最近我在公司优…

Consul单机集群

一、准备工作 1、下载consul consul各版本下载地址&#xff0c;点击如下连接前往&#xff1a; Consul Versions | HashiCorp Releases 本案例使用版本&#xff1a;Consul v1.15.0 &#xff1b;下载的文件解压皆可&#xff0c;consul为可执行文件。 2、创建目录&#xff1a…

移动安全app渗透测试之渗透流程、方案及测试要点讲解

被产品经理分到了个app测试的活&#xff0c;&#xff08;话说为啥是产品经理给派活&#xff0c;我不是归技术总监管么&#xff09;&#xff0c;包含安卓端的和ios端的&#xff0c;有点懵逼&#xff0c;说好的web渗透测试和服务器端渗透测试呢&#xff0c;虽然懵逼&#xff0c;不…

【V4L2】v4l2框架分析之video_device

文章目录 &#x1f53a;一、video_device分析&#xff08;1-1&#xff09;struct video_device结构&#xff08;1-2&#xff09;struct v4l2_ioctl_ops结构&#xff08;1-3&#xff09;v4l2_file_operations结构 &#x1f53a;二、注册video设备&#x1f53a;三、卸载清除video…

华为OD机试真题B卷 JavaScript 实现【自守数】,附详细解题思路

一、题目描述 自守数是指一个数的平方的尾数等于该数自身的自然数。例如&#xff1a;25^2 625&#xff0c;76^2 5776&#xff0c;9376^2 87909376。请求出n(包括n)以内的自守数的个数。 数据范围&#xff1a; 1≤n≤10000 二、输入描述 int型整数。 三、输出描述 n以内…

Maven了解及使用

套用一下常用的what, why, how 对maven进行了解。 首先&#xff0c;what&#xff1f; maven是什么&#xff1f; 1、Maven是一个项目管理工具&#xff0c;它包含了一个项目对象模型 (Project Object Model)&#xff0c;一组标准集合&#xff0c;一个项目生命周期(Project Lifecy…

《C# 教程》菜鸟教程学习笔记

学习地址 ######C#有用的网站 C# Programming Guide - 介绍了有关关键的 C# 语言特征以及如何通过 .NET 框架访问 C# 的详细信息。Visual Studio - 下载作为 C# 集成开发环境的 Visual Studio 的最新版本。Go Mono - Mono 是一个允许开发人员简单地创建跨平台应用程序的软件平台…