shell文本三剑客 awk 和 grep

news2024/11/17 7:27:16

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.coloradmin.cn/o/1818017.html

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

相关文章

取模软件测试版生成的有斜线,但测试字库的功能是好用无限制。只需要自己开发一个字库生成软件。IDA工具,如何搜中文

IDA工具&#xff0c;如何搜中文 在 IDA (Interactive Disassembler) 中搜索中文字符串&#xff0c;可以按照以下步骤操作&#xff1a; 方法一&#xff1a;使用“搜索文本”功能 打开 IDA 并加载目标文件&#xff1a;启动 IDA 并打开你需要分析的二进制文件。打开搜索文本对话…

厨房燃气安全新保障:红外点式可燃气体报警器的作用

在现代家庭生活中&#xff0c;厨房的安全问题日益受到人们的关注。其中&#xff0c;燃气泄漏和火灾是厨房安全的主要隐患。 据统计&#xff0c;90%的火灾源于燃气泄漏&#xff0c;而厨房又是燃气使用最为频繁的区域。因此&#xff0c;一款高效、可靠的可燃气体报警器对于保障家…

原生JS如何实现可配置DM码

原生JS如何实现可配置DM码 一、 DM码简介 1、 Data Matrix码 Data Matrix码是一种二维条形码,简称DM码,由美国公司International Data Matrix, Inc.(I.D. Matrix)在1994年发明,Data Matrix码中的行数和列数随二维码中存储的信息量而增加,信息限值是2335个字母数字字符…

LangChain 与 Elastic 合作为 RAG 添加向量数据库和语义重排序

作者&#xff1a;来自 Elastic Max Jakob 在过去的一年中&#xff0c;我们看到了生成式人工智能领域的许多进展。许多新服务和库应运而生。LangChain 已成为使用大型语言模型 (LLM) 构建应用程序的最受欢迎的库&#xff0c;例如检索增强生成 (RAG) 系统。该库使原型设计和试验不…

汇凯金业:黄金5g工艺是什么意思

黄金5g工艺是一种新型黄金饰品工艺&#xff0c;它在生产加工过程中&#xff0c;通过在黄金中添加一定量的稀有元素&#xff0c;使得黄金的分子结构更加紧密。这种创新工艺不仅提升了黄金的纯度&#xff0c;还改善了其物理特性&#xff0c;使其成为市场上一种备受关注的黄金饰品…

到底要不要报考“通信工程”?(2024版)

又到了高考季。为了方便广大考生全面了解“通信工程”专业&#xff0c;小枣君特此更新了这篇经典文章。 █ “通信工程”的基本介绍 通信工程&#xff0c;英文全称叫做Communication Engineering&#xff0c;是一门重要的工学基础学科。 根据教育部《学位授予和人才培养学科目录…

LLM主要类别架构

LLM主要类别架构介绍 LLM主要类别 LLM本身基于transformer架构。自2017年&#xff0c;attention is all you need诞生起&#xff0c;transformer模型为不同领域的模型提供了灵感和启发。基于原始的Transformer框架&#xff0c;衍生出了一系列模型&#xff0c;一些模型仅仅使用…

Java版电子招标采购系统源码:实现企业采购战略与流程的数字化革新

随着企业的发展&#xff0c;内部采购管理面临着日益增长的挑战。为了提升采购效率&#xff0c;确保采购过程的透明性和公正性&#xff0c;企业需要一个高效、规范的电子招标采购系统。鸿鹄电子招投标系统正是为此而设计&#xff0c;它采用Java技术&#xff0c;结合先进的微服务…

5.冒泡+选择+插入+希尔

一、排序算法 排序基础 1.排序算法的稳定性 2.何为原地排序算法 1.冒泡排序 从下面第一个元素开始往上冒泡&#xff0c;一轮冒泡下来&#xff0c;最大的元素就去了最上面了 步骤&#xff1a;无序数组 每次冒泡都可以将最大的元素放到最右边去 第一轮比较了5次&#xff1a;…

3D数字化营销——电商行业提升转化率,降低退货率的杀手锏!

随着3D、AR等前沿技术的蓬勃发展&#xff0c;电商行业正迎来一场3D数字化营销的革命。这种创新的营销方式不仅极大地丰富了商品的展现形式&#xff0c;还成功弥补了传统电商在临场感和体验感方面的不足&#xff0c;从而显著提升了消费者的购物体验。 51建模网为电商行业提供3D…

C++:十大排序

目录 时间复杂度分析 选择排序 引言 算法思想 动图展示 代码实现 (升序) 优化 代码实现 分析 冒泡排序 引言 算法思想 动图展示 代码实现 插入排序 引言 算法思想 动图展示 代码实现 计数排序 引言 算法思想 动图展示 代码实现 桶排序 引言 算法思…

python学习—合并多个Excel工作簿表格文件

系列文章目录 python学习—合并TXT文本文件 python学习—统计嵌套文件夹内的文件数量并建立索引表格 python学习—查找指定目录下的指定类型文件 python学习—年会不能停&#xff0c;游戏抽签抽奖 python学习—循环语句-控制流 文章目录 系列文章目录功能说明1 准备工作&#…

Python内存管理与垃圾回收机制

目录 一、引言 二、Python内存管理概述 三、引用计数机制 四、垃圾回收机制 标记-清除&#xff08;Mark-and-Sweep&#xff09; 分代收集&#xff08;Generational Collection&#xff09; 五、内存泄漏与优化 六、总结 一、引言 Python作为一门高级编程语言&#xff…

基于Java技术的ERP管理系统:企业资源规划的先进解决方案

在当前数字化转型的趋势下&#xff0c;企业对于高效、稳定且具备扩展性的管理系统的需求日益增加。为了满足这一需求&#xff0c;我们开发了一款基于Java技术的鸿鹄ERP&#xff08;企业资源规划&#xff09;管理系统。该系统采用了Spring Cloud Alibaba、Spring Boot、MybatisP…

ArrayList浅析

目录 一、ArrayList源码1.1 迭代器1.1.1 Itr源码浅析1.1.2 ListItr源码浅析 1.2 常用方法1.3 System.arraycopy1.4 ArrayList 的创建方式 二、引申问题2.1 ArrayList的大小是如何增加的&#xff1f;2.2 什么情况下你会使用ArrayList2.3 在索引中ArrayList的增加或者删除某个对象…

JVM 一些常见问题QA

GC Roots 虚拟机栈中引用的对象&#xff1b; 本地方法栈中JNI引用的对象&#xff1b; 方法区中类静态变量引用的对象&#xff1b; 方法区中常量引用的对象&#xff1b; Full GC是Minor GCMajor GC吗&#xff1f; Minor GC&#xff1a;回收年轻代&#xff1b; Major GC&…

比特币私钥公钥地址生成

比特币私钥公钥地址生成算法 原理 实现 #!coding:utf8#author:yqq #date:2019/3/4 0004 14:35 #description: 比特币地址生成算法import hashlib import ecdsa import os#2019-05-15 添加私钥限制范围 g_b58 123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz#g…

写个代码扫描插件,再也不怕 log4j 等问题

引言 关于静态代码扫描&#xff0c;大家想必都非常熟悉了&#xff0c;比如 lint、detekt 等&#xff0c;这些也都是常用的扫描工具。但随着隐私合规在国内越来越趋于常态&#xff0c;我们经常需要考虑某些危险api的调用排查等等&#xff0c;此时上述的工具往往不容易实现现有的…

PHP开发的爱情盲盒交友系统网站源码

源码介绍 PHP开发的爱情盲盒交友系统网站源码 独立后台 源码截图 源码下载 PHP开发的爱情盲盒交友系统网站源码

TCPListen客户端和TCPListen服务器

创建项目 TCPListen服务器 public Form1() {InitializeComponent();//TcpListener 搭建tcp服务器的类&#xff0c;基于socket套接字通信的//1创建服务器对象TcpListener server new TcpListener(IPAddress.Parse("192.168.107.83"), 3000);//2 开启服务器 设置最大…