[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|ba或b
C|catC或cat
(C|c)atCat或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.提取文件数据时,注意每行或列的分隔符,正确借用分隔符能够使提取的数据更加精确

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

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

相关文章

Docker 概述与安装

文章目录 1. Docker简介2. 传统虚拟机和容器3. Docker运行速度快的原因4. Docker软件4.1 Docker镜像4.2 Docker容器4.3 Docker仓库 5. Docker架构6. CentOS安装Docker6.1 卸载旧版本6.2 配置yum资源库6.3 安装Docker引擎6.4 启动docker引擎6.5 设置开机自启 7. 卸载Docker8. 运…

OpenCV完结篇——计算机视觉(人脸识别 || 车牌识别)

文章目录 Haar人脸识别方法Haar识别眼鼻口HaarTesseract进行车牌识别深度学习基础知识dnn实现图像分类 Haar人脸识别方法 scaleFactor调整哈尔级联器的人脸选框使其能框住人脸 官方教程指路 每个特征都是通过从黑色矩形下的像素总和减去白色矩形下的像素总和获得的单个值 级…

代理IP可以用于哪些实际场景?遇到问题如何解决

随着互联网的普及和网络应用的广泛使用&#xff0c;代理IP已成为许多人工作和生活中不可或缺的一部分。代理IP可以用于多种实际场景&#xff0c;并在遇到问题时提供有效的解决方案。下面将详细介绍代理IP的实际应用场景及遇到问题时的解决方法。 一、代理IP的实际应用场景 1. 网…

开源运维监控系统-Nightingale(-夜莺)应用实践(未完)

一、前言 某业务系统因OS改造,原先的Zabbix监控系统推倒后未重建,本来计划用外部企业内其他监控系统接入,后又通知需要自建才能对接,考虑之前zabbix的一些不便,本次计划采用一个类Prometheus的监控系统,镜调研后发现Nightingale兼容Prometheus,又有一些其他功能增强,又…

Docker Compose;docker-compose;docker compose

(一) Docker Compose | 菜鸟教程 --> --> --> -->

ESP32-Web-Server编程-建立第一个网页

ESP32-Web-Server编程-建立第一个网页 HTTP 简述 可能你每天都要刷几个短视频&#xff0c;打开几个网页来娱乐一番。当你打开一个网络上的视频或者图片时&#xff0c;其实际发生了下面的流程&#xff1a; 其中客户端就是你的浏览器啦&#xff0c;服务器就是远程一个存放视频或…

【JAVA学习笔记】72 - 满汉楼 - 餐饮管理系统

项目代码 https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter26 一、需求说明 满汉楼项目功能多&#xff0c;界面复杂&#xff0c;涉及到复杂的awt和swing技术和事件编程&#xff0c;做如下调整: 1.去掉界面和事件处理(工作中使用很少)&#xff0c;使…

如何在VS2022上的MFC项目中操作Excel(VS2010、VS2012、VS2015、VS2017、VS2019使用方法一样)

先决条件 本机安装office2003、2007、2010、2016及以后版本&#xff0c;总之必须安装office导入Excel库文件&#xff0c;导入方式可参考&#xff1a; 如何在vs2017及以前版本(vs2010、vs2015)上添加 添加类型库中的MFC类如何在vs2019及以后版本(如vs2022)上添加 添加ActiveX控…

flutter布局详解及代码示例(上)

布局 基本布局 Row&#xff08;水平布局&#xff09;&#xff1a;在水平&#xff08;X轴&#xff09;方向上排列子widget的列表。Column&#xff08;垂直布局&#xff09;&#xff1a;在垂直&#xff08;Y轴&#xff09;方向上排列子widget的列表。Stack&#xff08;可重叠布…

有一种浪漫,叫接触Linux

大家好&#xff0c;我是五月。 嵌入式开发 嵌入式开发产品必须依赖硬件和软件。 硬件一般使用51单片机&#xff0c;STM32、ARM&#xff0c;做成的产品以平板&#xff0c;手机&#xff0c;智能机器人&#xff0c;智能小车居多。 软件用的当然是以linux系统为蓝本&#xff0c…

顺子日期(14)

顺着日期 public class Main {public static void main(String[] args) {int res 0;//2022年int[] days new int[] {31,28,31,30,31,30,31,31,30,31,30,31};//31,28,31,30,31,30,31,31,30,31,30,31//一三五七八十腊//构造2022年每一天的日期yyyymmddStringBuffer date new…

【计算机网络笔记】ARP协议

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…

3D点云目标检测:VoxelNex解读(带源码/未完)

VoxelNext 通用vsVoxelNext一、3D稀疏卷积模块1.1、额外的两次下采样1.2、稀疏体素删减 二、高度压缩三、稀疏池化四、head五、waymo数据集训练六、训练自己的数据集bug修改 通用vsVoxelNext 一、3D稀疏卷积模块 1.1、额外的两次下采样 使用通用的3D sparse conv&#xff0c;…

window关于下载anaconda 2023年以后的版本,jupyter notebook闪退,没有内核的问题

这种问题的解决办法&#xff1a; 下载anaconda较早版本&#xff0c;比如我下载的是&#xff1a;2022年5月的版本。 下载之后&#xff0c;打开jupyter好像也会没有内核和闪退。 下面解决步骤&#xff1a; 1.注意&#xff1a;打开anaconda powershell prompt 2.重点来了&#xf…

【GO】k8s 管理系统项目16[前端部分--项目初始化]-学习记录

学习链接 https://blog.csdn.net/qq_29974229/article/details/129119279?spm1001.2014.3001.5502 nvm use v16.15.0 npm install vue -g npm install -g vue/clivue create k8s-plantform-fe选择 Default cd k8s-plantform-fe npm run servecd ./src mkdir views mkdir r…

Java-认识异常

本章重点&#xff1a; 1. 异常概念与体系结构 2. 异常的处理方式 3. 异常的处理流程 4. 自定义异常类 1. 异常的概念与体系结构 1.1 异常的概念 在Java中&#xff0c;将程序执行过程中发生的不正常行为称为异常。比如之前写代码时经常遇到的&#xff1a; 1. 算术异常 2. 数组…

Python网络爬虫练习

爬取历年中国大学排名(前20名)&#xff0c;并随机选取一所高校画图展示其历年总分变化,并计算平均分&#xff0c;在图上展示该平均分直线&#xff1a; 代码如下&#xff1a; import matplotlib.pyplot as plt import pandas as pd import requests import randomdef main(yea…

普乐蛙绵阳科博会一场VR科普航天科学盛宴科普知识

普乐蛙绵阳科普展&#xff1a;一场科学盛宴&#xff0c;点燃孩子探索欲望的火花! 普乐蛙绵阳科普展正在如火如荼地进行中&#xff0c;吸引了无数孩子和家长的热情参与。这场科普盛宴以独特的内外视角&#xff0c;让人们感受到科学的魅力&#xff0c;激发了孩子们对知识的渴望和…

【挑战业余一周拿证】二、在云中计算 - 第 3 节 - Amazon EC2 定价

目录 第 3 节 - Amazon EC2 定价 一、按需 适用场景 二、Savings Plans 适用场景 三、预留实例 三种付款模式 四、Spot 实例 适用场景 五、专用主机 适用场景 关注订阅号 首页&#xff1a;【挑战业余一周拿证】AWS 认证云从业者 - 基础 课程目录&#xff1a;【挑…

【阅读记录】《联邦学习》杨强

第2章 隐私、安全及机器学习 2.3 威胁与安全模型 2.3.1 隐私威胁模型 对机器学习系统的攻击可能在任何阶段发生&#xff0c;包括数据发布、模型训练和模型推理。 模型训练阶段&#xff1a;重构攻击&#xff08;避免使用寻存储显式特征值的模型&#xff0c;SVM KNN等&…