shell文本三剑客 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 个前导字符

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

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

相关文章

强化学习-tutorial

强化学习 当你发现收集有标注的数据困难&#xff0c;正确答案人类也不知道是什么的时候&#xff0c;往往是考虑使用RL的时候。尽管机器不知道答案是什么&#xff0c;但是机器会知道什么好&#xff0c;什么不好&#xff0c;通过与环境互动获得奖励。 过程 演算法解RL问题&…

【C++进阶】模板进阶与仿函数:C++编程中的泛型与函数式编程思想

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;C “ 登神长阶 ” &#x1f921;往期回顾&#x1f921;&#xff1a;栈和队列相关知识 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀模板进阶 &#x1f9e9;<&…

C语言概述与历史

引言 C语言是一门历史悠久且影响深远的编程语言。它不仅为后继的许多编程语言奠定了基础&#xff0c;同时因其高效性和灵活性在系统编程和嵌入式开发领域得到了广泛应用。本篇文章将全面介绍C语言的起源与发展、设计目标与理念&#xff0c;以及C语言的标准演化历程&#xff0c;…

MySQL Online DDL原理解读

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f4a5;&#x1f4a5;个人主页&#xff1a;奋斗的小羊 &#x1f4a5;&#x1f4a5;所属专栏&#xff1a;C语言 &#x1f680;本系列文章为个人学习…

boost asio异步服务器(3)增加发送队列实现全双工通信

增加发送节点 构造发送节点&#xff0c;管理发送数据。发送节点的类如下。 这个发送节点用于保证发送和接收数据的有效性。 增加发送队列 前边实现的是一个简单的echo服务器&#xff0c;也就是服务器将收到的内容发送给对应的客户端。但是在实际的服务器设计中&#xff0c;服务…

APP各种抓包教程

APP各种抓包教程 9/100 发布文章 wananxuexihu 未选择任何文件 new 前言 每当遇到一些 APP 渗透测试项目的时候&#xff0c;抓不了包的问题令人有点难受&#xff0c;但是抓不了包并不能代表目标系统很安全&#xff0c;那么接下来我会整理一下目前我所了解到的一些抓包方法 **声…

MySQL数据库管理(一)

目录 1.MySQL数据库管理 1.1 常用的数据类型​编辑 1.2 char和varchar区别 2. 增删改查命令操作 2.1 查看数据库结构 2.2 SQL语言 2.3 创建及删除数据库和表 2.4 管理表中的数据记录 2.5 修改表名和表结构 3.MySQL的6大约束属性 1.MySQL数据库管理 1.1 常用的数据类…

使用CSS常见问题解答卡片

常见问题解答卡片 效果展示 CSS 知识点 CSS 选择器的使用background 渐变背景色运用CSS 综合知识运用 页面整体布局 <div class"container"><h1>经常问的问题</h1><!-- 这里只是展示一个项目 --><div class"tab"><in…

Qwen-Agent:Qwen2加持,强大的多代理框架 - 函数调用、代码解释器以及 RAG!

✨点击这里✨&#xff1a;&#x1f680;原文链接&#xff1a;&#xff08;更好排版、视频播放、社群交流、最新AI开源项目、AI工具分享都在这个公众号&#xff01;&#xff09; Qwen-Agent&#xff1a;Qwen2加持&#xff0c;强大的多代理框架 - 函数调用、代码解释器以及 RAG&…

学会python——显示进度条(python实例五)

目录 1、认识Python 2、环境与工具 2.1 python环境 2.2 Visual Studio Code编译 3、进度条显示 3.1 代码构思 3.2 代码示例 3.3 运行结果 4、总结 1、认识Python Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python 的设计具有很强的可读…

QT QFileDialog文件选择对话框

QT QFileDialog文件选择对话框 选择txt或者cpp文件&#xff0c;读取内容并显示 参考&#xff1a; QT写入文件与读取文件内容_qt往一个文件写东西-CSDN博客 #include "QtFilePreview.h" #include "qfiledialog.h" #include "qfile.h" #includ…

制作自己的 @OnClick、@OnLongClick(告别 setOnClickListener,使用注解、反射和动态代理)

前言 前面我们说过 ButterKnife 这个库&#xff0c;这个库实现不仅实现了 View 的绑定&#xff0c;而且还提供了大量的注解如 BindView、OnClick、OnLongClick 等来简化开发过程中事件绑定。而这些功能的实现是通过 APT 也就是注解处理器&#xff0c;在编译期间生成 Java 代码…

MyBatis 的注解式开发

1. MyBatis 的注解式开发 文章目录 1. MyBatis 的注解式开发2. 准备工作3. Insert 插入/添加4. Delete 删除5. Update 更新/修改6. Select 查询7. 总结&#xff1a;8. 最后&#xff1a; MyBatis 中也提供了注解式开发方式&#xff0c;采用注解可以减少Sql映射文件的配置。 当然…

【React】useMemo

什么是 useMemo&#xff1f; useMemo 是 React 中的一个 Hook&#xff0c;它可以用来缓存计算结果&#xff0c;并在后续的渲染中重复利用这些计算结果。useMemo 接收两个参数&#xff1a;一个函数和一个依赖数组。当依赖数组中的任何一个值发生变化时&#xff0c;useMemo 会重新…

redis设计与实现(五)RDB与AOF持久化

RDB持久化 因为Redis是内存数据库&#xff0c;它将自己的数据库状态储存在内存里面&#xff0c;所以如果不想办法将储存在内存中的数据库状态保存到磁盘里面&#xff0c;那么一旦服务器进程退出&#xff0c;服务器中的数据库状态也会消失不见。 为了解决这个问题&#xff0c;…

如何定位检查不到的元素

光标离开输入框时&#xff0c;输入框立刻消失&#xff0c;导致无法查看该元素的html标签属性&#xff0c;如何定位这种元素呢&#xff1f;有两种方法&#xff0c;一种是通过事件监听器&#xff0c;另一种是通过网络接口抓包 1、首先定位到搜索按钮 这个搜索的按钮&#xff0c;当…

鸿蒙低代码开发的局限性

在版本是DevEco Studio 3.1.1 Release&#xff0c;SDK是3.1.0(API9) 的基础上。 1、低代码插件没有WebView组件。 2、低代码插件没有空白的自定义组件&#xff0c;当前提供的所谓自定义组件&#xff0c;只能用列表中提供的组件来拼接新的组件。 3、使用ets代码自定义的组件&…

PyTorch 张量数据类型

【数据类型】Python 与 PyTorch 常见数据类型对应&#xff1a; 用 a.type() 获取数据类型&#xff0c;用 isinstance(a, 目标类型) 进行类型合法化检测 >>> import torch >>> a torch.randn(2,3) >>> a tensor([[-1.7818, -0.2472, -2.0684],[ 0.…

(Javascript)AI数字人mp4转canvas播放并去除背景绿幕

1、需求介绍 H5页面嵌入AI数字人播报&#xff0c;但生成的数字人是mp4格式且有绿幕背景&#xff0c;需要转成canvas并去除背景&#xff1b; 2、效果&#xff1a; 去除前&#xff1a; 去除后&#xff1a; 3、代码 <!DOCTYPE html> <html lang"en"><…

上位机能不能替代PLC实现控制?为什么一定要学上位机?

上位机是一个广泛用于自动化控制系统的术语&#xff0c;它通常指的是在自动化控制系统中&#xff0c;用于监控和控制下位机&#xff08;通常是嵌入式系统或者是PLC等&#xff09;的计算机系统。上位机可以通过各种通信协议&#xff08;如RS232、RS485、以太网等&#xff09;与下…