[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.mfbz.cn/a/194224.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

继承JsonSerializer+注解实现自定义数据脱敏方案

1、数据脱敏 数据脱敏是一种保护隐私数据的技术&#xff0c;通过将敏感信息转化为非敏感信息来实现对数据的保护&#xff0c;以保护敏感隐私数据的可靠性和安全性。 数据脱敏可以分为可恢复和不可恢复两类: 可恢复类可以通过一定的方式恢复成原来的敏感数据。不可恢复类则无…

计算机基础知识59

MySQL的卸载流程 1、先停止MySQL服务&#xff1a;右键“此电脑”&#xff0c;选择“管理”&#xff0c;之后选择“服务和应用程序”--“服务”&#xff0c;在服务中找到“MySQL”&#xff0c;右键选择“停止”。 2、找到“控制面板”--“程序和功能”&#xff0c;找到MySQL&…

C++二分查找视频教程:两数之和

作者推荐 利用广度优先或模拟解决米诺骨牌 本文涉及的基础知识点 二分查找算法合集 题目 给你一个下标从 1 开始的整数数组 numbers &#xff0c;该数组已按 非递减顺序排列 &#xff0c;请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 n…

Find My键盘|苹果Find My技术与键盘结合,智能防丢,全球定位

键盘是最常用也是最主要的输入设备&#xff0c;通过键盘可以将英文字母、汉字、数字、标点符号等输入到计算机中&#xff0c;从而向计算机发出命令、输入数据等。还有一些带有各种快捷键的键盘。随着时间的推移&#xff0c;渐渐的市场上也出现独立的具有各种快捷功能的产品单独…

STK Components 二次开发- StarLink

1.星链数据下载 CelesTrak: Current GP Element Sets 下载二根数就可以。 2.处理数据 下载下来的数据是这样&#xff0c;要将字符串转为 二根数对象 TwoLineElementSet tle new TwoLineElementSet(tleString); Sgp4Propagator propagator new Sgp4Propagator(tle); 3.批量…

linux task_struct中进程调度相关的变量记录

参考文章&#xff1a; Linux进程调度分析记录&#xff0c;进程优先级&#xff0c;隔离处理器&#xff0c;isolcpus - 知乎

js的数组去重方法

目录 es6数组中对象去重 1. filter()用法 2. findIndex()用法 3. 去重 其他方法&#xff1a; 方法二&#xff1a;reduce()去重 1. reduce()用法 1.1 找出字符长度最长的数组成员。 1.2 扁平化二维数组 1.3 扁平化多维数组 三、总结方案&#xff1a; 使用Set&#xf…

AT89S52单片机------中断系统

目录 单片机的内部结构 中断请求标志寄存器 (1)TCON寄存器 (2)SCON寄存器 (3)定时器2的控制寄存器T2CON 中断允许与中断优先级的控制寄存器 中断允许寄存器IE 中断优先级寄存器IP 响应中断请求的条件 外部中断响应时间 外部中断的触发方式选择 中断请求的撤销 1.定…

[极客大挑战2023] Crypto/PWN/Reverse

这个网站真辛苦&#xff0c;每次都要回到all&#xff0c;屏幕随时卡。界面有待进步老远。也不提示结束&#xff0c;结果现在才听说结束了&#xff0c;才开始记录一下。 还跟往常一样&#xff0c;WM不作&#xff0c;其它也AK不了&#xff0c;总是差点。 Crypto SignIn 53594…

AI - Steering behaviors(转向系统)

游戏AI角色的转向系统&#xff08;Steering behaviors&#xff09;实现 一些向量的接口是cocos2dx的。但从名字上应该能理解做了什么向量操作 Seek&#xff1a; 获取当前位置指向目标点的向量&#xff0c;转化为单位向量后再乘以速度值&#xff0c;即为所需速度desired velo…

Centos 如何判断分区是mbr还是gpt格式

1 介绍 MBR 自20世纪80年代初以来的标准分区表格式每个驱动器最多支持四个主分区最多可以划分2TB的磁盘 GPT GPT是MBR分区表格式的后续每个驱动器最多支持128个分区可以将一个磁盘分区到最大到18艾字节 对小于2TB的磁盘使用MBR对大于2TB的磁盘使用GTP 2 查询方式 2.1 fdis…

uniapp页面使用多个echarts出现数据渲染错乱问题解决

首先&#xff0c;uniapp当中使用echarts是在通过使用renderjs的script模板的前提下实现的&#xff0c;在官方提供的案例当中&#xff0c;核心代码是这一部分&#xff1a; 但如果将其封装为组件&#xff0c;并在一个页面当中引用多次来生成多个charts图标&#xff0c;那么这个时…

化学仿制药参比制剂目录-参比制剂查询网站

2015年以前&#xff0c;参比制剂对于仿制药的研究无关紧要&#xff0c;但推出了’仿制药一致性评价’后&#xff0c;参比制剂的选择成为了决定仿制药成功与否的关键因素&#xff0c;如今在进行仿制药研究时&#xff0c;首要任务就是确定仿制目标&#xff0c;也就是参比制剂。 …

C++之算术生成算法

C之算术生成算法 accumulate #include<iostream> using namespace std; #include<vector> #include<numeric>void test() {vector<int> v;for (int i 0; i < 10; i){v.push_back(i);}int total accumulate(v.begin(), v.end(),0);cout << t…

TIME_WAIT状态套接字重新使用

《TIME_WAIT相关知识》里边有相关理论知识。 《TIME_WAIT状态TCP连接导致套接字无法重用实验》有相关实验。 现代Linux的TCP协议栈已经做了许多升级&#xff0c;所以可以让我们直接重用TIME_WAIT状态套接字而不会引起问题。下边是优化的内容&#xff1a; 1.新连接的SYN告知序列…

Java - Stream Filter 多条件筛选过滤

Java Stream流中Filter用于通过设置的条件过滤出元素 &#xff0c;示例如下&#xff1a; List strings Arrays.asList(“abc”, “”, “bc”, “efg”, “abcd”,"", “jkl”);List filtered strings.stream().filter(string -> !string.isEmpty()).collect(C…

基于ssm框架的公寓租房系统设计与实现

基于ssm框架的公寓租房系统的设计与实现 摘要&#xff1a;在互联网技术的不断发展壮大的背景下,人们生活水平及经济水平也随之得到提上&#xff0c;许多商家都纷纷吧自己的业务重心偏移到网络这个大蛋糕上&#xff0c;为了迎合时代的发展&#xff0c;房屋的出租业务也应该将重…

血的教训--redis被入侵之漏洞利用复现--总览

血的教训–redis被入侵之漏洞利用复现–总览 相信大家对于自己的服务器被入侵&#xff0c;还是比较憎恨的&#xff0c;我的就被攻击了一次&#xff0c;总结经验&#xff0c;自己也是整理了这一个系列&#xff0c;从最基础到最后面的自己总结被攻破的步骤&#xff0c;非常清晰的…

【腾讯云云上实验室】探索向量数据库背后的安全监控机制

当今数字化时代&#xff0c;数据安全成为了企业和个人最为关注的重要议题之一。随着数据规模的不断增长和数据应用的广泛普及&#xff0c;如何保护数据的安全性和隐私性成为了迫切的需求。 今天&#xff0c;我将带领大家一起探索腾讯云云上实验室所推出的向量数据库&#xff0c…

抽象类的使用—模板设计模式 Java

模板设计模式 一、引入二、改进 一、引入 需求 ① 有多个类&#xff0c;完成不同的任务 job ② 要求统计得到各自完成任务的时间 ③ 请编程实现 >最容易想到的方法&#xff0c;写类&#xff0c;统计时间 AA BB中的 job 方法中是有重复的。 >改进1&#xff1a;每个类中&…
最新文章