[Linux] 正则表达式及grep和awk

news2024/11/26 10:42:51

一、正则表达式

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

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

相关文章

交叉编译 和 软硬链接 的初识(面试重点)

目录 交叉编译的初认识Q&A Q1: 编译是什么&#xff1f; Q2: 交叉编译是什么&#xff1f; Q3: 为什么要交叉编译 Q3.1&#xff1a;树莓派相对于C51大得多&#xff0c;可以集成编译器比如gcc&#xff0c;那么树莓派就不需要交叉编译了吗&#xff1f; Q4: 什么是宿主机和…

振南技术干货集:znFAT 硬刚日本的 FATFS 历险记(3)

注解目录 1、znFAT 的起源 1.1 源于论坛 &#xff08;那是一个论坛文化兴盛的年代。网友 DIY SDMP3 播放器激起了我的兴趣。&#xff09; 1.2 硬盘 MP3 推了我一把 &#xff08;“坤哥”的硬盘 MP3 播放器&#xff0c;让我深陷 FAT 文件系统不能自拔。&#xff09; 1.3 我…

【C语言】【选择排序及其优化】

选择排序是指&#xff1a;第一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个元素&#xff0c;存放在序列的起始位置&#xff0c;然后再从剩余的未排序元素中寻找到最小&#xff08;大&#xff09;元素&#xff0c;然后放到已排序的序列的末尾&#xff0…

Golang 设置运行的cpu数与channel管道

介绍&#xff1a;为了充分了利用多cpu的优势&#xff0c;在Golang程序中&#xff0c;设置运行的cpu数目。 func main() {//获取系统当前cpu的数量num : runtime.NumCPU()//这里根据需求来设置整个go程序去使用几个cpuruntime.GOMAXPROCS(num)fmt.Println("num ", nu…

csgo/steam搬砖项目还能不能做,分享玩法思路

饰品市场持续下跌&#xff0c;CSGO搬砖还有搞头吗&#xff1f; CSGO是最具竞争力的第一人称射击游戏。玩这款游戏离不开里面的炫酷配件。Steam搬砖项目是基于CSGO游戏中的配件运动。蒸汽拆砖项目的原理是使用国外Steam平台的充值卡购买国际服务器的配件和设备&#xff0c;然后转…

quasar杂记

Windows下的奇怪错误 Unknown network error occurred 管理员运行powershell&#xff0c;运行&#xff1a; net stop winnat net start winnat

图书管理系统源码,图书管理系统开发,图书借阅系统源码四TuShuManager应用程序MVC控制器Controllers

Asp.net web应用程序MVC之Controllers控制器 Controller在ASP.NET MVC中负责控制所有客户端与服务器端的交互,并且负责协调Model与View之间的数据传递,是ASP.NET MVC的核心。 撰写Controller的基本要求: 1、Controller必须为公开类别; 2、Controller名称必须以Controller结…

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

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

【TinyALSA全解析(四)】扩展篇-从TinyALSA到底层音频驱动的全流程分析

扩展篇-从TinyALSA到底层音频驱动的全流程分析 第一节 本文说明第二节 声卡驱动统一入口进行ops替换过程2.1 tinyalsa到Linux kernel2.2 Linux Kernel中&#xff0c;由主设备号ops分流到次设备号ops 第三节 次设备中file_operations的open函数3.1 本节主要内容3.2 为何次设备的…

Python生成exe文件

Python如何生成exe文件 在终端执行 pip install pyinstaller 在终端执行pyinstaller E:\fund_data\GetFund.py&#xff0c;运行结束后会在D:\Python\Python311\Scripts\dist\目录下生成GetFund.exe文件 3.双击exe文件运行&#xff0c;如果未出现预期结果&#xff0c;可以把e…

深度学习之图像分类(十五)DINAT: Dilated Neighborhood Attention Transformer详解(一)

Dilated Neighborhood Attention Transformer Abstract Transformers 迅速成为跨模态、领域和任务中应用最广泛的深度学习架构之一。在视觉领域&#xff0c;除了对普通Transformer的持续努力外&#xff0c;分层Transformer也因其性能和易于集成到现有框架中而受到重视。这些模…

NAS-DIP: Learning Deep Image Prior with Neural Architecture Search

NAS-DIP: 用神经结构搜索学习深度图像先验 论文链接&#xff1a;https://arxiv.org/abs/2008.11713 项目链接&#xff1a;https://github.com/YunChunChen/NAS-DIP-pytorch Abstract 最近的研究表明&#xff0c;深度卷积神经网络的结构可以用作解决各种逆图像恢复任务的结构…

CGAN原理讲解与源码

1.CGAN原理 生成器&#xff0c;输入的是c和z&#xff0c;z是随机噪声&#xff0c;c是条件&#xff0c;对应MNIST数据集&#xff0c;要求规定生成数字是几。 输出是生成的虚假图片。 判别器的输入是 1.生成器输出的虚假图片x; 2.对应图片的标签c 来自真实数据集&#xff0c;且…

大模型下交互式数据挖掘的探索与发现

在这个数据驱动的时代&#xff0c;数据挖掘已成为解锁信息宝库的关键。过去&#xff0c;我们依赖传统的拖拉拽方式来建模&#xff0c;这种方式在早期的数据探索中起到了作用&#xff0c;但随着数据量的激增和需求的多样化&#xff0c;它的局限性逐渐显露。 >>>> 首…

selenium已知一个元素定位同级别的另一个元素

1.需求与实际情况 看下图来举例 &#xff08;1&#xff09;需求 想点击test22&#xff08;即序号-第9行&#xff09;这一行中右边的“复制”这一按钮 &#xff08;2&#xff09;实际情况 只能通过id或者class定位到文件名这一列的元素&#xff0c;而操作这一列的元素是不…

知识变现的未来:解析知识付费系统的核心

随着数字时代的发展&#xff0c;知识付费系统作为一种新兴的学习和知识分享模式&#xff0c;正逐渐引领着知识变现的未来。本文将深入解析知识付费系统的核心技术&#xff0c;揭示其在知识经济时代的重要性和潜力。 1. 知识付费系统的基本架构 知识付费系统的核心在于其灵活…

为什么要用 Redis 而不用 map/guava 做缓存? Redis为什么这么快 Redis有哪些数据类型 Redis的应用场景

文章目录 为什么要用 Redis 而不用 map/guava 做缓存?Redis为什么这么快Redis有哪些数据类型Redis的应用场景总结一计数器缓存会话缓存全页缓存&#xff08;FPC&#xff09;查找表消息队列(发布/订阅功能)分布式锁实现 总结二 简单的聊聊Redis常见的一些疑问点&#xff1a;具体…

预算削减与经济动荡:2024 年明智且经济地创新

如何在经济衰退周期中保持创新&#xff1f;这篇创新研究提供了实用建议。在经济下行压力下领导者往往会试图降低成本和维持生存。然而&#xff0c;这种二元对立的压力往往会导致领导者做出不够理想的决策&#xff0c;更多地关注生存而不是未来投资。本文提供了一系列实用的建议…

蓝桥杯-平方和(599)

【题目】平方和 【通过测试】代码 import java.util.Scanner; import java.util.ArrayList; import java.util.List; // 1:无需package // 2: 类名必须Main, 不可修改public class Main {public static void main(String[] args) {Scanner scan = new Scanner(System.in);//在…

MATLAB中FFT频谱分析使用详解

文章目录 语法说明语法一&#xff1a;Y fft(X)fft(X)返回X长度的傅里叶变换 语法二&#xff1a;Y fft(X,N)如果 X的长度小于 N&#xff0c;则为 X补上尾零以达到长度 N(FFT插值)双边谱转换为单边谱 如果 X 的长度大于 N&#xff0c;则对 X 进行截断以达到长度 N。 语法三&…