shell脚本之正则表达式和文本三剑客

2023年 8月 15日 60.7k 0

一.正则表达式

1.定义

通常用来判断语句中,用来检查某一字符串是否满足某一格式。

2.组成

正则表达式是由普通字符与元字符组成

普通字符:包括大小写字母、数字、标点符号及一些其它符号。

元字符:是指在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前的字符表达式)在目标对象中的出现模式。

3.常见的基础正则表达式元字符:(支持工具:grep、egrep、sed、awk)

微信截图_20230811145220.png

举例:^匹配开头,$匹配结尾

微信截图_20230811150352.png

微信截图_20230811150451.png

微信截图_20230811152050.png

举例: . 和 *

微信截图_20230811153002.png

二.文本三剑客之grep

1.简介:

grep是Linux中用来过滤文本文件内容的命令,使用该命令能够高效的从文本信息中过滤出符合条件的文件行。

grep 与 awk 、sed并称为linux下文本处理三剑客,grep用于过滤文本信息,sed用于动态编辑文本,awk用于格式化输出文本。

grep [选项]… 查找条件 目标文件

  • -i:查找时忽略大小写
  • -v:反向查找,输出与查找条件不相符的行
  • -o 只显示匹配项
  • -f 对比两个文件的相同行
  • -c 匹配的行数

微信截图_20230811160818.png

举例:

shell脚本之正则表达式和文本三剑客-1

微信截图_20230811161345.png

微信截图_20230811161649.png

微信截图_20230811161921.png

三.文本三剑客之sed

1.概述

sed 即 Stream EDitor,和 vi 不同,sed是行编辑器。

  • sed编辑器时一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。
  • sed编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要存储在一个命令文本文件中。

sed工作流程

  • sed 的工作流程主要包括读取、执行和显示三个过程:

  • 读取:sed 从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space)。

  • 执行:默认情况下,所有的sed 命令都在模式空间中顺序地执行,除非指定了行的地址,否则sed 命令 将会在所有的行上依次执行。

  • 显示font> :发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。

注意:

  • 在所有的文件内容都被处理完之前,上述过程重复执行,知道所有内容被处理完。

  • 默认情况下所有的sed命令都是在模式空间内执行的,因此输入的文件并不会

  • 发生任何变化,除非是用重定向存储输出。

    常用选项:

微信截图_20230811163126.png

四.文本三剑客之awk

1.概述。

  • AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。
  • 之所以叫 AWK 是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。

2.awk工作原理

  • 逐行读取文本,默认以空格或TAB键为分隔符进行分割,将分割所得的各个字段保存到内建变量中,并按照或条件进行编辑命令。
  • sed命令常用于一整行的处理,而awk比较倾向于将一行分成多个"字段"然后再进行处理。awk信息的读入也是逐行读取的,执行结果通过print的功能将字段数据打印显示。
  • 在使用awk命令过程中,可以使用逻辑操作符“&&”表示“与”、“||”示“或”、“!”表示“非”还可以进行简单的数学运算。如+、-、*、/、%、^分别表示加、减、乘、除、取余、和乘方。

3.awk命令格式

awk 选项 '模式模式条件 {操作}' 文件1 文件2 ...
awk -f 脚本文件 文件1 文件2 ...

4.awk常见的内建变量(可直接使用)与选项

微信截图_20230811165538.png

awk 常用选项:

-F 指定输入文件折分隔符。
-v 赋值一个用户定义变量。
-f 从脚本文件中读取awk命令。

5.awk的基础用法

5.1输出所有内容。逐行读取,$0表示当前行的整行内容。

微信截图_20230811165836.png

微信截图_20230811170008.png

微信截图_20230811170311.png

5.2 NR表示当前处理的行的行号(序数)

微信截图_20230811170557.png

shell脚本之正则表达式和文本三剑客-2

微信截图_20230811170930.png

5.3 $n 表示当前处理行的第n个字段

微信截图_20230811171232.png

5.4 通过文本模式(匹配字符串)过滤出行

shell脚本之正则表达式和文本三剑客-3

微信截图_20230811171725.png

5.5 按字段(列)输出内容

注:指定列分隔符的两种方式:使用-F 或 使用内建变量FS。

微信截图_20230811172031.png

微信截图_20230811172245.png

微信截图_20230811172500.png

5.6 使用if语句时,内部条件要加( ),外面要加{ }。

将{ }整条语句当作一个操作命令,相当于嵌套。

微信截图_20230811172713.png

5.7 字符串作用

$NF 代表最后一个字段  

~ 表示包含,

!~ 表示不包含,

== 表示等于,

!= 表示不等于  

$n> < ==     用于对比数值  

$n~"字符串"   代表第n个字段 包含 某个字符串的作用  

$n!~"字符串"   代表第n个字段 不包含 某个字符串的作用

$n=="字符串"   代表第n个字段 为 某个字符串的作用  

$n!="字符串"   代表第n个字段 不为 某个字符串的作用

6.awk的高级用法

6.1 RS 指定行分隔符

awk从文件中读取资料时,将根据RS的定义把资料切割成许多条记录, 而awk一次仅读入一条记录进行处理,内置变量RS的预设值是"n"。

微信截图_20230814161800.png

6.2 通过管道符处理其他命令的结果

举例:

微信截图_20230814162056.png

6.3 使用awk去重(awk数组特性)

在awk中可以定义数组,数组元素的下标值可以是字符串,元素值如果是字符串也要加引号。

相关文章

服务器端口转发,带你了解服务器端口转发
服务器开放端口,服务器开放端口的步骤
产品推荐:7月受欢迎AI容器镜像来了,有Qwen系列大模型镜像
如何使用 WinGet 下载 Microsoft Store 应用
百度搜索:蓝易云 – 熟悉ubuntu apt-get命令详解
百度搜索:蓝易云 – 域名解析成功但ping不通解决方案

发布评论