当前位置: 首页 > news >正文

Linux文本三剑客 awk 和 grep

awk 前言

AWK是一种优良的文本处理工具。它不仅是 Linux中也是任何环境中现有的功能最强大的数据处理引擎之一。

 Linux中最常用的文本处理工具有grep,sed,awk。行内将之称为文本三剑客,就功能量和效率来看,awk是当之无愧的文本三剑客之首。

grep主要用于过滤文本,sed用于修改文本,而awk则擅长处理和格式化文本

awk与vim的区别:

  • awk为加载一行处理一行,可以接受比较大的文件处理
  • vim为先加载整个文件到内存中处理,若内存不够大,无法打开大文件

一、awk的工作原理 

逐行读取文本,默认以空格或tab键为分隔符进行分隔,将分隔所得的各个字段保存到内建变量中,并按模式或者条件执行编辑命令。即 读取一行处理一行,可以接受比较大的文件处理。
sed命令常用于一整行的处理,而awk比较倾向于将一行分成多个“字段”然后再进行处理。awk信息的读入也是逐行读取的,执行结果可以通过print的功能将字段数据打印显示。在使用awk命令的过程中,可以使用逻辑操作符“&&”表示“与”、“||”表示“或”、“!”表示“非”;还可以进行简单的数学运算,如+、-、*、/、%、^分别表示加、减、乘、除、取余和乘方。 

二、awk的语法

awk 选项 '模式或条件 {操作}' 文件 1 文件 2 …                   
awk -f 脚本文件 文件 1 文件 2 …                                 

  • 一定要用单引号。 
  • { }外指定条件,{ }内指定操作。
  • 内建变量,不能用双引号括起来,不然系统会把它当成字符串

三、基本打印用法

按行输出文本:

awk '{print}' 1.txt#输出所有内容
awk '{print $0}' 1.txt#输出所有内容
awk 'NR==1,NR==3{print}' 1.txt#输出第 1~3 行内容
awk '(NR>=1)&&(NR<=3){print}' 1.txt#输出第 1~3 行内容
awk 'NR==1||NR==3{print}' 1.txt#输出第1行、第3行内容
awk '(NR%2)==1{print}' 1.txt #输出所有奇数行的内容
awk '(NR%2)==0{print}' 1.txt#输出所有偶数行的内容
awk '/^p/{print}' /opt/2.txt#输出以 p 开头的行
awk '/q$/{print}' /opt/2.txt#输出以 q 结尾的行

awk 'BEGIN {x=0};/\/bin\/bash$/{x++};END {print x}' /etc/passwd        #统计以/bin/bash 结尾的行数,等同于 grep -c "/bin/bash$" /etc/passwd
BEGIN模式表示,在处理指定的文本之前,需要先执行BEGIN模式中指定的动作;awk再处理指定的文本,之后再执行END模式中指定的动作,END{}语句块中,往往会放入打印结果等语句

打印行内容及其行号:

awk '{getlinegetlinegetline;print$0}' 1.txt  #打印偶数行
awk '{print$0;getline}' 1.txt  #打印奇数行

getline 意思是滑倒下一行

一开始print$0是在1 上面  遇到getline 就滑倒下一行 就是2

反之

BEGIN:

awk 'BEGIN {...}; 条件{...}; END {...}' 文件


##BEGIN {...}  #表示处理文件前执行的操作
##条件{...}   #表示对匹配满足指定条件的文件行内容要执行的操作
##END {...}  #表示处理完文件所有行内容后要执行的操作
 
例:
awk 'BEGIN {x=0};/\/bin\/bash$/{x++};END {print x}' /etc/passwd        
#统计以/bin/bash 结尾的行数,等同于 grep -c  "/bin/bash$"  /etc/passwd

  • BEGIN模式表示,在处理指定的文本之前,需要先执行BEGIN模式中指定的动作
  • awk再处理指定的文本,之后再执行END模式中指定的动作,END{}语句块中,往往会放入打印结果等语句.

字段输出:

awk -F: '/q$/{print $1}' /opt/2.txt  #打印以bash结尾行的第一个字段
awk '/q$/{print $1,$3}' /opt/2.txt #输出多个列时,默认空格进行分隔

四、常见的内置变量

内置变量作用
$0当前处理的行的整行内容
$n当前处理行的第n个字段(第n列)
NR当前处理的行的行号(序数)
NF当前处理的行的字段个数。$NF代表最后一个字段
FS列分割符。指定每行文本的字段分隔符,默认为空格或制表位。与"-F"作用相同
OFS输出内容的列分隔符
FILENAME被处理的文件名
RS
行分隔符。awk从文件中读取资料时,将根据RS的定义把资料切割成许多条记录, 而awk一次仅读入一条记录进行处理。预设值是"\n"

NR: 表示行号

关于NF的使用 :表示最后一列
[root@localhost ~]#df |awk '{print $NF}'        ##挂载点[root@localhost ~]#df |awk '{print $(NF-1)}'    ##使用百分比

关于FS的使用:指定每行文本的字段分隔符,默认为空格或制表位
[root@localhost /ceshi]#awk -v "FS=:" '{print $1FS$3}' /etc/passwd
##与 -F":" [root@localhost /ceshi]#awk -F: '{print $1":"$3}' /etc/passwd
##-F和-FS一起使用时-F 的优先级高

关于RS的使用 :为换行符

将冒号作为换行的分隔符 把内容打印出来

五、实际运用

1、提取磁盘的分区利用率

df|awk '{print $5}'

2、提取用户名和uid号

cat /etc/passwd|awk -F: '{print $1,$3}'
##默认用空格分开
[root@localhost ~]#cat /etc/passwd|awk -F: '{print $1":"$3}'
##用冒号分隔开
[root@localhost ~]#cat /etc/passwd|awk -F: '{print $1"\t"$3}'
##用制表符分隔开

3、提取ip地址 
[root@localhost /ceshi]#hostname -I
192.168.20.6 192.168.122.1 
[root@localhost /ceshi]#hostname -I|awk '{print $1}'
192.168.20.6
[root@localhost /ceshi]#ifconfig ens33|sed -n '2p' |awk '{print $2}'
192.168.20.6
4、awk的统计用法
[root@localhost /ceshi]#grep -c "/bin/bash$" /etc/passwd
4
[root@localhost /ceshi]#cat /etc/passwd|awk '{x++}END{print x}'
44
[root@localhost /ceshi]#cat /etc/passwd|wc -l
44
[root@localhost /ceshi]#cat /etc/passwd|awk '/bash$/{x++}END{print x}'
4
5、计算磁盘使用率及空闲率
df | grep -w "/" | awk '{print $5}'                  #磁盘使用率
df | grep -w "/" | awk '{print 100-$5"%"}'     #磁盘空闲率

6、检测本机cpu 15分钟内的平均负载

[root@localhost awk]#uptime|awk '{print $NF}'

      一般超过百七十,就要注意了

grep前言

grep 命令是一个在 Linux/Unix 操作系统中用于查找文本的工具,grep 命令能够对指定的文件或标准输入进行搜索,并输出包含匹配文本的行。

grep 命令是一个非常强大的文本搜索工具,支持基本正则表达式、扩展正则表达式和固定字符串的匹配模式,可以帮助用户快速地定位文件中的关键信息,提高工作效率。

一、 基本用法

grep 命令的基本语法格式为:

grep [参数] 搜索模式 [路径]

例在文件 2.txt中搜索字符串 2q,可以使用以下命令:

grep 2q 2.txt


如果要搜索多个文件,可以指定多个文件名或使用通配符
例搜索所有以 q结尾的字符串,可以使用以下命令:

grep q* 2.txt



二、常用选项

grep 命令常用的选项:

  • -i:忽略大小写;
  • -r:递归搜索子目录;
  • -n:显示匹配行的行号;
  • -c:只显示匹配行的数量;
  • -v:反转匹配,即只显示不匹配的行;
  • -w:只匹配整个单词,不匹配子串;
  • -o :表示只输出匹配部分,而不是整行;
  • -E:使用扩展正则表达式;
  • -F:将模式视为固定字符串而非正则表达式。
  • -h:表示不显示文件名

例 忽略大小写和显示匹配行的行号,可以使用以下命令:

grep -in "P" 2.txt

三. 正则表达式

grep 命令支持基本正则表达式(BRE)、扩展正则表达式(ERE)和固定字符串三种匹配模式。

基本正则表达式
  • .                   :匹配任意一个字符;
  • []                  :匹配括号中的任意一个字符;
  • [^]                :匹配不在括号中的任意一个字符;
  • [:class:]       :匹配指定字符类中的任意一个字符,例如 [:digit:] 表示数字字符。

常用的特殊序列包括:

  • ^         :匹配行首;
  • $         :匹配行尾;
  • \<        :匹配单词首;
  • \>        :匹配单词尾;
  • \n        :匹配换行符。

如要在文件 2.txt 中搜索以  q 开头的行,可以使用以下命令:

grep '^q' 2.txt  #要在文件2 .txt 中搜索以 q开头的行

  • +         :匹配一个或多个前导字符;
  • *          :匹配零个或多个前导字符;
  • ?         :匹配零个或一个前导字符;
  • {n}       :匹配恰好 n 个前导字符;
  • {n,}      :匹配至少 n 个前导字符;
  • {n,m}   :匹配至少 n 个且不超过 m 个前导字符;
  • ()         :分组匹配;
  • |          :或运算符。

 如要在文件 2.txt 中搜索以 hello 开头且后面跟着一个或多个空格的行,可以使用以下命令

grep '^hello[[:space:]]+' 2.txt
 ^与$的运
# 搜索以数字开头的行
grep '^[0-9]' file.txt# 搜索以数字结尾的行
grep '[0-9]$' file.txt# 搜索包含数字的行
grep '[0-9]' file.txt
匹配整个单词

grep 默认会匹配到包含搜索词的所有行,包括单词的一部分。如果需要只匹配完整单词,可以使用 ‘-w’ 选项。

# 搜索包含单词 'hello' 的行
grep 'hello' file.txt# 只搜索包含完整单词 'hello' 的行
grep -w 'hello' file.txt
搜索多个文件

如果需要在多个文件中搜索,可以使用通配符或者正则表达式。

# 搜索多个文件
grep 'hello' file1.txt file2.txt file3.txt# 搜索文件夹下的所有 txt 文件
grep 'hello' *.txt# 搜索文件夹下的所有文件
grep 'hello' *
显示匹配行的上下文

使用 ‘-A’ 和 ‘-B’ 选项可以显示匹配行的上下文。

# 显示匹配行的前 3 行和后 3 行
grep -A 3 -B 3 'hello' file.txt
反向搜索

使用 ‘-v’ 选项可以反向搜索,即只显示不匹配的行。

# 只显示不包含单词 'hello' 的行
grep -v 'hello' file.txt
统计匹配次数

使用 ‘-c’ 选项可以统计匹配次数。

# 统计包含单词 'hello' 的行数
grep -c 'hello' file.txt

总结

' '  单引号内的内容被视为字面字符串
" " 双引号允许变量扩展和命令替换   (如双引号号内有变量可引用变量)

( ) 分组匹配
[ ] 匹配括号中的任意一个字符
{n} 匹配恰好 n 个前导字符

相关文章:

Linux文本三剑客 awk 和 grep

awk 前言 AWK是一种优良的文本处理工具。它不仅是 Linux中也是任何环境中现有的功能最强大的数据处理引擎之一。 Linux中最常用的文本处理工具有grep&#xff0c;sed&#xff0c;awk。行内将之称为文本三剑客&#xff0c;就功能量和效率来看&#xff0c;awk是当之无愧的文本三…...

Python NumPy 库详解

大家好&#xff0c;在当今数据驱动的世界中&#xff0c;处理大规模数据、进行复杂数值计算是科学研究、工程设计以及数据分析的关键任务之一。在Python生态系统中&#xff0c;NumPy&#xff08;Numerical Python&#xff09;库是一款备受推崇的工具&#xff0c;它为我们提供了高…...

React state 执行时机

设置 state 只会为下一次渲染变更 state 的值 一个 state 变量的值永远不会在一次渲染的内部发生变化 React 会使 state 的值始终"固定"在一次渲染的各个事件处理函数内部 React 会等到事件处理函数中的所有代码都运行完毕再处理 state 更新 在一个函数中&#xff0…...

Spring基于注解开发

目录 一. Bean基本注解开发 二. Bean依赖注入注解开发 三. 非自定义Bean注解开发 四. Spring配置类的开发 五. Spring配置其他注解 5.1 Primary 5.2 Profile 六. Spring注入的解析原理 七. Spring注解方式整合第三方框架 一. Bean基本注解开发 Spring除了xml配置文件…...

深度探索:智能家居背后的科技力量与伦理思考

目录 科技力量&#xff1a;创新驱动下的智慧生活引擎 1. 人工智能与机器学习 2. 物联网技术 3. 大数据分析 4. 5G与边缘计算 伦理与隐私&#xff1a;智能家居的双刃剑 1. 隐私侵犯风险 2. 数据安全挑战 3. 算法偏见与决策透明度 应对策略&#xff1a;构建安全、负责任的智能…...

鸿蒙开发:通过startAbilityByType拉起垂类应用

通过startAbilityByType拉起垂类应用 使用场景 开发者可通过特定的业务类型如导航、金融等&#xff0c;调用startAbilityByType接口拉起对应的垂域面板&#xff0c;该面板将展示目标方接入的垂域应用&#xff0c;由用户选择打开指定应用以实现相应的垂类意图。垂域面板为调用…...

docker 更换镜像源

打开对应的配置文件 vi /etc/docker/daemon.json 输入文件内容入下 {"registry-mirrors": ["https://registry.docker-cn.com","http://hub-mirror.c.163.com","https://docker.mirrors.ustc.edu.cn","https://dockerhub.azk8…...

Springboot(若依)国际化配置接口访问后返回????????

最近使用若依的框架进行二次开发&#xff0c;配置了国际化&#xff0c;application.yml配置英文时没问题&#xff0c;但配置中文basename: i18n/messages_zh_CN&#xff0c;访问接口就直接返回的???&#xff0c;如图&#xff1a; 于是检查了I18nConfig文件&#xff0c;没配错…...

java1

在继承中&#xff0c;创建子类对象&#xff0c;访问成员方法的规则&#xff1a; 创建的对象是谁&#xff0c;就优先用谁&#xff0c;没有再向上找 注意&#xff1a;无论是成员变量还是成员方法&#xff0c; 如果没有都是向上找父类&#xff0c;不会向下找子类 继承的特点&#…...

pytest中一个场景测试的demo

注意点1&#xff1a; allure.severity 是一个装饰器&#xff0c;用于设置测试用例的严重性级别。 allure.severity_level.CRITICAL 是Allure提供的严重性级别之一&#xff0c;表示这个测试用例极为重要。allure.severity_level.BLOCKER&#xff1a;阻塞级别的问题&#xff0c…...

windows下安装IntelliJIDEA

windows下安装IntelliJIDEA 步骤1&#xff1a;下载IntelliJ IDEA 打开浏览器并访问IntelliJ IDEA下载页面. https://www.jetbrains.com/idea/download/选择合适的版本&#xff1a; Ultimate&#xff1a;付费版本&#xff0c;包含更多功能&#xff0c;适合专业开发。Community…...

string经典题目(C++)

文章目录 前言一、最长回文子串1.题目解析2.算法原理3.代码编写 二、字符串相乘1.题目解析2.算法原理3.代码编写 总结 前言 一、最长回文子串 1.题目解析 给你一个字符串 s&#xff0c;找到 s 中最长的回文子串。 示例 1&#xff1a; 输入&#xff1a;s “babad” 输出&am…...

三篇卫星切换的论文

目录 一、Energy-Aware Satellite Handover based on Deep Reinforcement Learning 1、题目翻译 2、来源 3、内容 二、A Reliable Handover Strategy with Second Satellite Selection in LEO Satellite Networks 1、题目翻译 2、来源 3、内容 三、User Grouping-Based…...

VUE之重定向redirect

VUE之路由和重定向redirect 这个小知识点是在学习做项目的时候遇到的一个问题&#xff0c;借鉴了一个他人的项目&#xff0c;是一个酒店管理系统&#xff0c;拿到源码之后导到我的vscode里。 参考链接 导的过程比较顺利&#xff0c;正常安装&#xff0c;加依赖&#xff0c;没有…...

服务器时区与数据库时区不一致导致时间bug记录

1、背景 一个活动&#xff0c;需要按照自然月刷新&#xff0c;每月一期&#xff0c;以活动开始当月作为第一期&#xff0c;每期可配置不同数据。问题出现在&#xff1a;活动开始时间为本月&#xff0c;但是查询用户数据发现当前为第二期&#xff0c;反复查看代码&#xff0c;确…...

华为鸿蒙HarmonyOS应用开发者高级认证题库

判断题 1、云函数打包完成后&#xff0c;需要到AppGallery Connect创建对应函数的触发器才可以在端侧中调用 错 2、在column和Row容器组件中&#xff0c;aligntems用于设置子组件在主轴方向上的对齐格式&#xff0c;justifycontent用于设置子组件在交叉轴方向上的对齐格式 错…...

细说MCU串口函数及使用printf函数实现串口发送数据的方法

目录 1、硬件及工程 2、串口相关的库函数 &#xff08;1&#xff09;串口中断服务函数&#xff1a; &#xff08;2&#xff09;串口接收回调函数&#xff1a; &#xff08;3&#xff09;串口接收中断配置函数&#xff1a; &#xff08;4&#xff09;非中断发送&#xff…...

PBox iOS端的应用隐藏、图片视频加密软件

哈喽&#xff0c;大家下午好&#xff01;相信大家的手机中一定存在很多的私密内容&#xff0c;比如软件、照片、视频或者文档文件&#xff0c;很多都是不方便让外人看到的&#xff0c;此时就需要一款隐藏工具&#xff0c;市面上这类软件大部分都是收费的&#xff0c;应大家的需…...

【QT5】<总览五> QT多线程、TCP/UDP

文章目录 前言 一、QThread多线程 二、QT中的TCP编程 1. TCP简介 2. 服务端程序编写 3. 客户端程序编写 4. 服务端与客户端测试 三、QT中的UDP编程 1. UDP简介 2. UDP单播与广播程序 前言 承接【QT5】&#xff1c;总览四&#xff1e; QT常见绘图、图表及动画。若存在…...

fastadmin/thinkPHPQueue消息队列详细教程

thinkphp-queue 是thinkphp 官方提供的一个消息队列服务,它支持消息队列的一些基本特性: 消息的发布,获取,执行,删除,重发,失败处理,延迟执行,超时控制等队列的多队列, 内存限制 ,启动,停止,守护等消息队列可降级为同步执行1、通过composer安装thinkPHP消息队列 …...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案

这个问题我看其他博主也写了&#xff0c;要么要会员、要么写的乱七八糟。这里我整理一下&#xff0c;把问题说清楚并且给出代码&#xff0c;拿去用就行&#xff0c;照着葫芦画瓢。 问题 在继承QWebEngineView后&#xff0c;重写mousePressEvent或event函数无法捕获鼠标按下事…...

代码随想录刷题day30

1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由&#xff1a;大部分的转换软件需要收费&#xff0c;要么功能不齐全&#xff0c;而开会员又用不了几次浪费钱&#xff0c;借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

(一)单例模式

一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...

PHP 8.5 即将发布:管道操作符、强力调试

前不久&#xff0c;PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5&#xff01;作为 PHP 语言的又一次重要迭代&#xff0c;PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是&#xff0c;借助强大的本地开发环境 ServBay&am…...

Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成

一个面向 Java 开发者的 Sring-Ai 示例工程项目&#xff0c;该项目是一个 Spring AI 快速入门的样例工程项目&#xff0c;旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计&#xff0c;每个模块都专注于特定的功能领域&#xff0c;便于学习和…...

CVPR2025重磅突破:AnomalyAny框架实现单样本生成逼真异常数据,破解视觉检测瓶颈!

本文介绍了一种名为AnomalyAny的创新框架&#xff0c;该方法利用Stable Diffusion的强大生成能力&#xff0c;仅需单个正常样本和文本描述&#xff0c;即可生成逼真且多样化的异常样本&#xff0c;有效解决了视觉异常检测中异常样本稀缺的难题&#xff0c;为工业质检、医疗影像…...

恶补电源:1.电桥

一、元器件的选择 搜索并选择电桥&#xff0c;再multisim中选择FWB&#xff0c;就有各种型号的电桥: 电桥是用来干嘛的呢&#xff1f; 它是一个由四个二极管搭成的“桥梁”形状的电路&#xff0c;用来把交流电&#xff08;AC&#xff09;变成直流电&#xff08;DC&#xff09;。…...