[Linux] 正则表达式及grep和awk
一、正则表达式
1.1 什么是正则表达式
正则表达式是一种用于匹配和操作文本的强大工具,它是由一系列字符和特殊字符组成的模式,用于描述要匹配的文本模式。 正则表达式可以在文本中查找、替换、提取和验证特定的模式。
正则表达式和通配符的区别
正则表达式:匹配文章中的字符
通配符:匹配的是文件名
1.2 元字符
| 符号 | 作用 |
| . | 代表任意字符 |
| [] | 代表单个字符 |
| [^] | 代表指定范围外的任意单个字符 |
| [:space:] | 包括空格,制表符(tab键) |
| [:alnum:] | 代表字母和数字 |
| [:alpha:] | 代表任意大小写英文字母 |
.

[a-z]
[^li]

[[:space:]]

[[:alnum:]]和[[:alpha:]]

1.3 表示次数
| 符号 | 作用 |
| * | 0——正无穷次 |
| .* | 任意长度的任意字符,不包括0次 |
| \? | 可有可无,代表一次或0次 |
| \+ | 1——正无穷 |
| \{n\} | 前面的字符出现了n次 |
| \{n,m\} | 前面的字符出现了n-m次 |
| \{3,\} | 前面的字符出现了最少3次 |
| \{,5\} | 前面的字符出现了最多5次 |
实际应用:


\{n\}前面的字符出现了n次

\{3,\}前面的字符出现了最少3次

\{n,m\}前面的字符出现了n-m次

*0——正无穷次
.* 任意长度的任意字符,不包括0次

\? 可有可无,代表一次或0次

\+ 可有可无,代表一次到正无穷次

\{,3\}前面的字符出现了最多3次

1.4 位置锚定
| 符号 | 作用 |
| ^$ | 空行 |
| ^[[:space:]]*$ | 空白行 |
| \<或\b | 字符的开头 |
| \>或\b | 字符的结尾 |
实际应用:
过滤出不是以#号开头的行

过滤出"root"这个字符

\<或\b 字符的开头
1.5 分组或其他
分组用括号将需要组合的字符括起来
实际应用:
分组匹配abc

匹配1abc或2abc
使用分组匹配出ip地址

1.6 扩展正则表达式
grep -E或egrep
| 符号 | 作用 |
| * | 匹配前面字符任意次 |
| ? | 0或1次 |
| + | 1次或多次 |
| {n} | 匹配n次 |
| {m,n} | 至少m,至多n次 |
| {,n} | 匹配前面的字符至多n次,<=n,n可以为0 |
| {n,} | 匹配前面的字符至少n次,<=n,n可以为0 |
| 符号 | 作用 |
| () | 分组 |
| | | 或者 |
| a|b | a或b |
| C|cat | C或cat |
| (C|c)at | Cat或cat |
练习:
1.表示邮箱

2.表示qq号

3.表示手机号码

二、grep
格式:
grep [选项]… 查找条件 目标文件
选项:
-color=auto 对匹配到的文本着色显示
-m # 匹配#次后停止
grep -m 1 root /etc/passwd #多个匹配只取第一个
-v 显示不被pattern匹配到的行,即取反
grep -Ev '^[[:space:]]*#|^$' /etc/fstab
-i 忽略字符大小写
-n 显示匹配的行号
-c 统计匹配的行数
grep -c root /etc/passwd #统计匹配到的行数
-o 仅显示匹配到的字符串
-q 静默模式,不输出任何信息
-A # after, 后#行
grep -A3 root /etc/passwd #匹配到的行后3行业显示出来
-B # before, 前#行
-C # context, 前后各#行
-e 实现多个选项间的逻辑or关系,如:grep –e ‘cat ' -e ‘dog' file
grep -e root -e bash /etc/passwd #包含root或者包含bash 的行
grep -E root|bash /etc/passwd
-w 匹配整个单词
grep -w root /etc/passwd
useradd rooter
-E 使用ERE,相当于egrep
-F 不支持正则表达式,相当于fgrep
-f file 根据模式文件,处理两个文件相同内容 把第一个文件作为匹配条件
-r 递归目录,但不处理软链接
-R 递归目录,但处理软链接
实际应用
过滤非空行

过滤以root开头的行
过滤以bash结尾的行

统计当前主机的连接状态

统计当前连接主机数

三、awk
3.1 什么是awk
AWK 是一款出色的文本处理工具。它是可用于任何环境(不仅仅是 Linux)的最强大的数据处理引擎之一。这种编程和数据处理语言(以其创始人 Alfred Aho、Peter Weinberger 和 Brian Kernighan 的姓氏首字母命名)只会随着知识的积累而变得更好,AWK 提供了强大的功能:样式加载 和流式处理、数学运算符、流程控制语句,甚至内置变量和函数。AWK 可以进行样式加载、流式处理、数学运算符、过程控制语句,甚至内置变量和函数。AWK 几乎拥有完整语言的所有强大功能。事实上,AWK 拥有自己的语言:AWK 编程语言被其三位创建者正式定义为 "样式扫描和处理语言"。可以创建无数的简短程序来读取输入文件、排序数据、处理数据、对输入进行计算、生成报告等。
3.2 awk的工作原理
逐行读取文本,默认以空格或tab键为分隔符进行分隔,将分隔所得的各个字段保存到内建变量中,并按模式或者条件执行编辑命令。
通常awk是将一行数据拆分为多个字段,操作者,可以选取指定的字段对其进行高效率的操作
3.3 awk的基础用法
3.3.1 基本打印用法
格式:
awk 选项 '表达式{处理动作}'
| 符号 | 作用 |
| -F | 指定分隔符 |
| -v | 指定变量 |
实际应用:
再打印一遍


运算

先处理BEGIN 中的式子
连续的空白符
取分区利用率和IP地址



3.4 awk 常见的内置变量
| 内置变量 | 作用 |
| $0 | 当前处理的行的整行内容 |
| $n | 当前处理行的第n个字段(第n列) |
| NR | 当前处理的行的行号(序数) |
| NF | 当前处理的行的字段个数。$NF代表最后一个字段 |
| FS | 列分割符。指定每行文本的字段分隔符,默认为空格或制表位。与"-F"作用相同 |
| OFS | 输出内容的列分隔符 |
| FILENAME | 被处理的文件名 |
| RS | 行分隔符。awk从文件中读取资料时,将根据RS的定义把资料切割成许多条记录, 而awk一次仅读入一条记录进行处理。预设值是"\n" |
3.5 自定义变量
root CXK /opt] awk -v test='hello' 'BEGIN{print test}'
hello
[root CXK /opt]
3.6 打印行内容及其行号
awk '{print NR}' test.txt

awk '{print NR,$0}' test.txt

3.6.1 指定行和指定行范围打印
awk 'NR==3{print}' test.txt awk 'NR==3,NR==5{print}' test.txt awk '(NR>=3)&&(NR<=5){print}' test.txt

3.6.2 奇偶行打印
awk 'NR%2==0{print}' test.txt awk 'NR%2==1{print}' test.txt

3.6.3 文本内容匹配过滤打印
awk '/^root/{print}' /etc/passwd
awk '/bash$/{print}' /etc/passwd

3.7 BEGIN END
BEGIN{}:仅在开始处理文件中的文本之前执行一次
END{}:仅在文本处理完成之后执行一次
应用:

3.8 条件判断打印
正向判断打印:
awk -F: '$3>500{print $0}' /etc/passwd

判断取反打印:
awk -F: '!($3>10){print $0}' /etc/passwd

此之外,甚至可以直接进行if语句判断打印:
awk -F: '{if($3>500){print $0}}' /etc/passwd

3.9 for
计算


3.10 awk结合数组运用
3.10.1 awk中定义数组打印
awk 'BEGIN{a[0]=10 ; a[1]=20 ; a[2]=30;print a[1]} 'awk 'BEGIN{a[0]=10 ; a[1]=20 ; a[2]=30;print a[0]} 'awk 'BEGIN{a[0]=10 ; a[1]=20 ; a[2]=30;print a[2]} '
此外:awk中的数组还能形成遍历
awk 'BEGIN{a[0]=10 ; a[1]=20 ; a[2]=30;for(i in a)print i,a[i]} '定义数组及其元素 变量i读取数组a的下标 输出数组下标及其相对应的元素
3.10.2awk打印文件内容去重统计
去重打印数组
echo ${arry[@]}|awk -v RS=' ' '!a[$1]++'指定分隔符为空格 筛选掉重复的元素awk -v RS=' ' '!a[$1]++' <<< ${arry[@]}表达式中重定向输入将右边的数组作为左边表达式子的处理对象
处理文件去重统计
awk '{a[$1]++};END{for(i in a){print i,a[i]}}' test.txt

题目:统计ssh登录失败的用户及其登录失败(日志:/var/log/secure中有记录)的次数(通常我们会认为失败三次,存在着暴力破解登录的可能,意味该主机存在隐患)解决方案:将其筛选出来就把IP加入到黑名单中 /etc/hosts.deny。
awk筛选统计:
awk '/Failed password/{a[$11]++};END{for(i in a){print i,a[i]}}' /var/log/secure
其他方式:
awk '/Failed password/{print $11}' /var/log/secure |sort -n
awk '/Failed password/{print $11}' /var/log/secure |sort -n |uniq -c
一些题目:
提取字段中的 IP地址和时间
awk '{print $1, $4}' log.txt
提取某一时间段的日志
cat access_log |awk '/2018:11:56:43/,/2018:11:56:44/{print $0}'
提取host.txt主机名后再放回host.txt文件
awk '{print $2}' host.txt >> host.txt
cat host.txt|awk '{print $2}'|awk -F'.' '{print $1}' >> host.txt cat host.txt|awk -F '[ .]' '{print $2}'
统计/etc/fstab文件中每个文件系统类型出现的次数
cat /etc/fstab |awk '{print $3}'|grep -v "^#"|grep -v "^$"|tail -n +4|sort|uniq -c
统计/etc/fstab文件中每个真单词出现的次数
grep -o -w -E '\b[[:alpha:]]+\b' /etc/fstab | sort | uniq -c
提取出字符串Yd$C@M05MB%9&Bdh7dq+YVixp3vpw中的所有数字
echo "Yd$C@M05MB%9&Bdh7dq+YVixp3vpw" | grep -o -E '[0-9]+'
查出/tmp/的权限,以数字方式显示
stat -c %a /tmp/
stat /tmp/|sed -nr '4s/.*\((.*)\/.*\) Uid.*/\1/p'
查出用户UID最大值的用户名、UID及shell类型
awk -F: '{print $1, $3, $7}' /etc/passwd | sort -t" " -k2 -n | tail -n 1
总结:
1. awk是一种对文件输出内容的字段(列),进行操作的工具,多数用来提取重要数据
2. awk 结合数组时可以进行数组定义,数组遍历,以及数组元素的去重统计
3.提取文件数据时,注意每行或列的分隔符,正确借用分隔符能够使提取的数据更加精确
相关文章:
[Linux] 正则表达式及grep和awk
一、正则表达式 1.1 什么是正则表达式 正则表达式是一种用于匹配和操作文本的强大工具,它是由一系列字符和特殊字符组成的模式,用于描述要匹配的文本模式。 正则表达式可以在文本中查找、替换、提取和验证特定的模式。 正则表达式和通配符的区别 正则…...
ssm+java车辆售后维护系统 springboot汽车保养养护管理系统+jsp
以前汽车维修人员只是在汽车运输行业中从事后勤保障工作,随着我国经济的发展,汽车维修行业已经从原来的从属部门发展成了如今的功能齐备的独立企业。这种结构的转变,给私营汽修企业和个体汽修企业的发展带来了契机,私营企业和个体维修企业的加入也带动了整个汽修行业的整体水平…...
HNU练习七 字符串编程题7. 机器人游戏
【问题描述】 有人建造了一些机器人,并且将他们放置在包含n个单元的一维网格上,一个长度为n的字符串s代表了他们的编排方式,字符串中的字符既可以是.,也可以是0~9之间的一个数字字符,字符.表示开始时在相应的单元上无机…...
【Linux】bash 终端指令
bash # 查看当前使用的shell $ echo $SHELL /bin/bash# 查看当前发行版可以使用的shell $ cat /etc/shells 或 chsh -l /bin/sh /bin/bash /sbin/nologin /bin/zsh /bin/tcsh /bin/csh# 切换bash $ chsh -s /bin/bash# 切换zsh $ chsh -s /bin/zsh进程 $ ps aux | grep pwd w…...
基于SpringBoot高校心理教育辅导设计与实现
摘 要 随着Internet技术的发展,心理教育辅导系统应运而生,心理教育辅导系统为用户提供了一个更为便利的心理测试咨询平台。所以,为了充分满足高校学生心理教育辅导的需求,特开发了本高校心理教育辅导系统。 本高校心理教育辅导系统…...
关于电脑提示vcruntime140_1.dll无法继续执行代码的解决办法
vcruntime140_1.dll是Visual C运行时库的一个组成部分,它包含了大量用于支持C应用程序运行时的功能。这个文件通常在开发和使用C程序时被调用,特别是在使用Microsoft Visual Studio进行开发时。vcruntime140_1.dll文件丢失或损坏会导致C程序无法正常运行…...
5. 链表
内存空间是所有程序的公共资源,在一个复杂的系统运行环境下,空闲的内存空间可能散落在内存各处。我们知道,存储数组的内存空间必须是连续的,而当数组非常大时,内存可能无法提供如此大的连续空间。此时链表的灵活性优势…...
OSI七层模型与TCP/IP四层模型的区别(计算机网络)
一、OSI七层网络模型 OSI 网络模型共有 7 层,分别是应用层、表示层、会话层、传输层、网络层、数据链路层和物理层。 应用层,负责给应用程序提供统一的接口;表示层,负责把数据转换成兼容另一个系统能识别的格式;会话…...
Other--什么是 CGI,FastCGI、asp、jsp
文章目录 1. 了解什么是动态网页2. 什么是 CGI2.1 CGI 概念2.2 CGI 功能2.3 CGI 作用2.4 CGI 分类2.5 CGI 程序的工作原理2.6 CGI 程序的特点2.7 CGI 程序的应用领域4. 什么是 FastCGI4.1 FastCGI 概念4.2 FastCGI 程序工作原理4.3 FastCGI 对进程的管理方式4.4 FastCGI 的特点…...
sql关联另一个表,update表的值
sql示例: update student_score ss set ss.names.name from student s where ss.codes.code 最常见的学生成绩表 student_score通过学生student_code关联学生信息表student 学生信息表(student): code name age gender 1001 …...
Python基础:JSON保存结构化数据(详解)
1. JSON概念 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,也易于机器解析和生产。 虽然JSON使用JavaScript语法来描述数据对象,但是JSON仍然独立于语言和平台,JSON解…...
抑郁症日常如何调节?
抑郁症是一种常见的心理障碍,影响患者的情绪、思维和身体健康。以下是一些建议,帮助抑郁症患者进行日常调节: 保持积极心态:积极的心态是应对抑郁症的关键。尝试保持乐观、积极的态度,看待生活中的困难和挑战。尽管抑…...
hive两张表实现like模糊匹配关联
testa表(字段a)aaabbacccddddddaaatestb表(字段b)ab1. 使用likeconcat模糊配对 selecta.a from testa a ,testb b where a like concat(%,b.b,%) group by a.a2. 使用locate函数 selecta.a from testa a ,testb b where locate(b.b,a.a)>0 group by a.a3. 使用instr函数 sel…...
【高效开发工具系列】Hutool DateUtil工具类
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
基于springcloud openfein 使用示例,包含代码和 maven 依赖配置
使用 Spring Cloud 和 OpenFeign 可以轻松实现微服务之间的通信。以下是一个简单的示例,演示如何在Spring Boot应用中使用Spring Cloud OpenFeign。 首先,确保您的项目中添加了 Spring Cloud 和 OpenFeign 的依赖。这里提供 Maven 依赖配置:…...
彰显营销硬实力!皓量科技连续四年入选《中国数字营销生态图》
11月28日,中国商务广告协会数字营销专业委员会、虎啸奖组委会、秒针营销科学院共同发布了《中国数字营销生态图(2023版)》(以下简称生态图)。凭借多年在广告营销领域的精耕细作,皓量科技从2020年开始连续4年…...
web静态网页设计与制作-基于HTML+CSS+JS实现旅游摄影网站
web静态网页设计与制作,基于HTMLCSSJS实现精美的旅游摄影网站,拥有极简的设计风格,丰富的交互动效,让人眼前一亮,享受视觉上的体验。 我使用了基本的HTML结构来构建网页,并使用CSS样式进行美化设计…...
每日一题:LeetCode-1089. 复写零
每日一题系列(day 09) 前言: 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🔎…...
React Native环境搭建及Hello World
写这篇博客的目的就是想说,react native 挺简单,但是大部分初级前端会被环境搭建给难住,从而放弃. 环境搭建 环境搭建其实说简单也挺简单的,有经验的前端直接翻看react native中文文档就行,直接按上面来肯定没错 以下以安卓开发,windows配置环境为例,来演示一遍 首先 电脑…...
VS2017 C++ Qt工程打包软件
在Debug模式下或者Release模式下编译成功,会在工程的Debug文件夹和Release文件夹生成exe执行文件,以Debug为例,将Debug模式下的exe复制到新的文件夹路径下,然后打开Qt中的MSVC 2017 64-bit 打开后然后在命令窗口cd到exe的路径下&…...
基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...
深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...
三分算法与DeepSeek辅助证明是单峰函数
前置 单峰函数有唯一的最大值,最大值左侧的数值严格单调递增,最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值,最小值左侧的数值严格单调递减,最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...
Git常用命令完全指南:从入门到精通
Git常用命令完全指南:从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...
