一,正则表达式
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
的字符串替换为new
,g
标志表示全局替换。
- 示例 :
-
迁移符合条件的文本
- 示例 :
sed '/pattern/{h;d};G' filename
匹配到pattern
的行会被暂存(h
命令),然后删除(d
命令),接着在每个非匹配行后追加暂存的行(G
命令)。
- 示例 :
-
使用脚本编辑文件
- 示例 :创建一个sed脚本
script.sed
,内容为s/pattern/replacement/
,然后执行sed -f script.sed filename
。
- 示例 :创建一个sed脚本
-
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