Shell编程之正则表达式与文本处理器

一,正则表达式

1:正则表达式概述

1.正则表达式的定义

正则表达式(Regular Expression,RegEx)是一种高度灵活的文本处理工具,它结合了字符序列、特殊控制字符(称为元字符)、以及特定的构造规则,形成一种模式描述语言。这种模式能够精准地匹配、查找、替换或提取文本中的特定字符串或模式。正则表达式的核心价值在于其强大的模式描述能力,使得开发者能够以简洁的表达式来应对复杂的文本处理需求。

2.正则表达式的用途

正则表达式广泛应用于多种场合,简化了字符串处理任务,主要用途包括:

  • 搜索匹配:快速在文本中查找符合特定规则的字符串,比如查找所有网址或邮箱地址。
  • 数据验证:确保用户输入的数据格式正确,比如检查是否输入了合法的电话号码或日期格式。
  • 文本替换:批量替换文本中的某种模式,例如将所有电子邮件地址替换为"[邮箱]"。
  • 信息提取:从复杂的文本中提取有用信息,如从网页中提取所有链接。
  • 文本分隔:依据特定规则将文本切分成多个部分,用于数据分析或预处理。

2:基础正则表达

1.基础正则表达式示例

(1)查找特定字符

示例 :在log.txt中查找含有"ERROR"关键词的行。

  • 命令grep 'ERROR' log.txt
  • 说明:直接匹配字符串"ERROR",适用于快速定位错误信息。
(2)利用中括号"[]"匹配集合字符

示例:查找所有以数字或小写字母开头的行。

  • 命令grep '^[0-9a-z]' data.txt
  • 说明[0-9a-z]匹配数字0-9和小写字母a-z中的任意一个,^确保匹配的是行首字符。
(3)行首"^"与行尾"$"的应用

示例:查找所有以".conf"为文件扩展名的行。

  • 命令ls | grep '\.conf$'
  • 说明\.用于匹配实际的点字符,$确保".conf"位于行尾,从而精确匹配文件扩展名。
(4)任意字符"."与重复字符"*"的组合

示例:查找所有以任何形式的"email"出现的行。

  • 命令grep -E 'email.*' messages.log
  • 说明.匹配任意字符(除了换行符),*表示前面的元素可以重复零次或多次,所以email.*匹配以"email"开始的任何文本。
(5)连续字符范围"{}"的精确定位

示例:查找所有长度为6的密码。

  • 命令grep -E '\b\w{6}\b' passwords.txt
  • 说明\w{6}匹配正好六个单词字符(字母、数字或下划线),\b确保匹配的是完整单词。

2. 元字符总结

  • .:转义点字符,用于匹配实际的"."字符。
  • ^ 和 $ :分别匹配字符串的开始和结束,注意在方括号[]内时失去特殊含义。
  • :定义字符集,如[abc]匹配"a"、"b"或"c"。
  • $$:分组,用于捕获匹配或应用量词于整个组。
  • | :逻辑或,匹配左右两边的任一模式,如cat|dog匹配"cat"或"dog"。
  • {n,m} :指定匹配次数的范围,如\d{3,5}匹配3到5位数字。
  • ?、*、+:分别代表前面的元素可以重复0次、0次或多次、1次或多次。
  • \w、\d、\s:预定义字符类,分别匹配字母数字、数字、空白字符。
  • \W、\D、\S:与上述相反,匹配非字母数字、非数字、非空白字符。
  • 反向引用 :通过\n引用之前分组的内容,如(\w+)\s+\1匹配重复的单词。
  • 忽略大小写 :在某些命令中(如grep)使用-i选项,如grep -i 'error'
  • 多行模式 :在某些情况下,使用-z(如在grep中)处理多行文本作为一个整体。

二,文本处理器

1:sed工具

1.sed命令常见用法

-n :使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到终端上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。

-e :直接在命令列模式上进行 sed 的动作编辑;

-f :直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的 sed 动作;

-r :sed 的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法)

-i :直接修改读取的文件内容,而不是输出到终端。

2.用法示例

  • 输出符合条件的文本(p)

    • 示例sed '/pattern/p' filename
      会在匹配到pattern的行后面直接再输出该行,相当于打印匹配到的行。
  • 删除符合条件的文本(d)

    • 示例sed '/pattern/d' filename
      删除所有匹配到pattern的行。
  • 替换符合条件的文本

    • 示例sed 's/old/new/g' filename
      将文件中所有匹配到old的字符串替换为newg标志表示全局替换。
  • 迁移符合条件的文本

    • 示例sed '/pattern/{h;d};G' filename
      匹配到pattern的行会被暂存(h命令),然后删除(d命令),接着在每个非匹配行后追加暂存的行(G命令)。
  • 使用脚本编辑文件

    • 示例 :创建一个sed脚本script.sed,内容为s/pattern/replacement/,然后执行sed -f script.sed filename
  • sed直接操作文件示例

    • 示例sed -i 's/old/new/g' filename
      直接在原文件中进行替换,-i选项表示就地编辑。

2:awk工具

1.awk常见用法

$0 表示整个当前行

$1 每行第一个字段

NF 字段数量变量

NR 每行的记录号,多文件记录递增

FNR 与NR类似,不过多文件记录不递增,每个文件都从1开始

\t 制表符

\n 换行符

FS BEGIN时定义分隔符

RS 输入的记录分隔符, 默认为换行符(即文本是按一行一行输入)

~ 匹配,与==相比不是精确比较

!~ 不匹配,不精确比较

== 等于,必须全部相等,精确比较

!= 不等于,精确比较

&& 逻辑与

|| 逻辑或

  • 匹配时表示1个或1个以上

/[0-9][0-9]+/ 两个或两个以上数字

/[0-9][0-9]*/ 一个或一个以上数字

FILENAME 文件名

OFS 输出字段分隔符, 默认也是空格,可以改为制表符等

ORS 输出的记录分隔符,默认为换行符,即处理结果也是一行一行输出到屏幕

-F'[:#/]' 定义三个分隔符

2.用法示例

(1):按行输出文本

awk -F":" '{print}' /etc/passwd //输出所有

awk -F":" '{print $0}' /etc/passwd //输出所有

awk -F: 'NR==3,NR==6{print}' /etc/passwd //显示第3行到第6行

awk -F: 'NR>=3&&NR<=6{print}' /etc/passwd //显示第3行到第6行

awk -F: 'NR==3||NR==6{print}' /etc/passwd //显示第3行和第6行

awk '(NR%2)==1{print}' /etc/passwd //显示奇数行

awk '(NR%2)==0{print}' /etc/passwd //显示偶数行

awk '/^root/{print}' /etc/passwd //显示以root开头的行

awk '/nologin$/{print}' /etc/passwd //显示以nologin结尾的行

awk 'BEGIN {x=0};/\/bin\/bash$/{x++};END {print x}' /etc/passwd //统计以/bin/bash结尾的行数

awk 'BEGIN{RS=""};END{print NR}' /etc/ssh/sshd_config //统计以空行分隔的文本段落数

awk '{print NR,$0}' /etc/passwd //输出每行的行号

awk -F: '{print NR,NF,$NF,"\t",$0}' /etc/passwd //依次打印行号,字段数,最后字段值,制表符,每行内容

awk -F: 'NR==5{print}' /etc/passwd //显示第5行

route -n|awk 'NR!=1{print}' //不显示第一行

awk -F: '{print NF}' /etc/passwd //显示每行有多少字段

awk -F: '{print $NF}' /etc/passwd //将每行第NF个字段的值打印出来

awk -F: 'NF==4 {print }' /etc/passwd //显示只有4个字段的行

awk -F: 'NF>2{print $0}' /etc/passwd //显示每行字段数量大于2的行

(2):按字段输出文本

awk -F":" '{print $3}' /etc/passwd //显示第三列

awk -F":" '{print $1 $3}' /etc/passwd //$1与$3相连输出,无空格,

awk -F":" '{print $1,$3}' /etc/passwd //多了一个逗号,输出第1和第3个字段,有空格

awk -F: '$2=="!!" {print}' /etc/shadow //统计密码为空的shadow记录

awk 'BEGIN {FS=":"}; $2=="!!" {print}' /etc/shadow ##显示密码为空的用户的shadow信息

awk -F ":" '$7~"/bash" {print $1}' /etc/passwd ##显示第七个字段为/bash的行的第一个字段

awk -F: 'NR==5{print}' /etc/passwd //显示第5行

awk -F":" '{print $1 " " $3}' /etc/passwd //$1与$3之间手动添加空格分隔

(3):通过管道,双引号调用Shell命令

awk -F: '/bash$/{print | "wc -l"}' /etc/passwd ##统计bash用户的个数

awk 'BEGIN {while ("w" | getline) n++ ; {print n-2}}' ##统计在线用户的数量

awk 'BEGIN {"hostname" | getline;print $0}' ##输出当前主机名

awk -F: '$1~/mail/ && $3>6 {print }' /etc/passwd //逻辑与,$1匹配mail,并且$3>6

awk -F: '{if($1~/mail/ && $3>8) print }' /etc/passwd

awk -F: '$1~/mail/ || $3>1000 {print }' /etc/passwd //逻辑或,统计以mail开头或第3列大于1000的行

awk -F: '{if($1~/mail/ || $3>1000) print }' /etc/passwd

相关推荐
BeanInJ1 小时前
JAVA字符串与正则表达式
java·正则表达式
林深的林2 小时前
正则表达式(2)匹配规则
正则表达式
叶域7 小时前
正则表达式(复习)
大数据·python·正则表达式
运维小贺2 天前
Nginx常用的模块
运维·nginx·正则表达式
Viooocc3 天前
正则表达式
正则表达式
vvilkim3 天前
开发中常用的正则表达式规则与应用
正则表达式
林深的林4 天前
正则表达式(1)
正则表达式
ThisIsClark5 天前
【玩转正则表达式】正则表达式常用语法汇总
正则表达式
ThisIsClark5 天前
【玩转正则表达式】替换与正则表达式的结合
正则表达式
浪九天6 天前
Java常用正则表达式(身份证号、邮箱、手机号)格式校验
java·开发语言·正则表达式