REGEXP: Regular Expressions,由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)不表示字符字面意义,而表示控制或通配的功能,类似于增强版的通配符功能,但与通配符不同,通配符功能是用来处理文件名,而正则表达式是处理文本内容中字符。
vim, less,grep,sed,awk, nginx,mysql 等
基本正则表达式
扩展正则表达式
编程语言支持的高级正则表达式
grep sed默认使用基础正则表达式
grep -E、sed -r、egrep、awk扩展正则表达式
扩展正则表达式 加\
. 匹配任意单个字符,可以是一个汉字
[root@localhost ~]#ls /etc/|grep rc[.0-6]
#此处的点代表字符
rc0.d
rc1.d
rc2.d
rc3.d
rc4.d
rc5.d
rc6.d
rc.d
rc.local
[root@localhost ~]#ls /etc/ | grep 'rc\.'
#点值表示点需要转义
rc.d
rc.local
[root@localhost ~]# ls |grep '[zhou].txt'
#匹配[]中任意一个字符
h.txt
o.txt
u.txt
z.txt
[a-z] 小写字母
[A-Z] 大写字母
[root@localhost ~]# ls |grep '[^a-z].txt'
#显示非小写字母
小技巧: 怎么去记 \{n\} 把斜杠看成转义符
h[abcde] 先去匹配 hello h[abcde] 再去匹配world
匹配 1到5 和9
分组:( ) 将多个字符捆绑在一起,当作一个整体处理,如:(root)+
后向引用:分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名
方式为: \1, \2, \3, ... 分组
\1 表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符
或者:\|
2.1 匹配ccc三次
[root@localhost ~]#echo abccc |grep "abc\{3\}"
abccc
2.2 匹配 abc 三次
[root@localhost ~]#echo abcabcabc |grep "\(abc\)\{3\}"
#分组 匹配abc
2.3 匹配 1或 2abc
[root@localhost ~]#echo 1abc |grep "1\|2abc"
#只匹配了1
1abc
2.4 匹配 1abc 或者 2abc
[root@localhost ~]#echo 1abc |grep "\(1\|2\)abc"
#1abc或者2abc
1abc
2.5 提取ip地址
[root@localhost ~]#ifconfig ens33|grep netmask|grep -o '\([0-9]\{1,3\}\.\)\{3\}[0-9]\{3\}'|head -1
192.168.91.100
grep -E 或者egrep
* 匹配前面字符任意次
? 0或1次
+ 1次或多次
{n} 匹配n次
{m,n} 至少m,至多n次
{,n} #匹配前面的字符至多n次,<=n,n可以为0
{n,} #匹配前面的字符至少n次,<=n,n可以为0
() 分组
分组:() 将多个字符捆绑在一起,当作一个整体处理,如:\(root\)+
后向引用:\1, \2, ...
| 或者
a|b #a或b
C|cat #C或cat
(C|c)at #Cat或cat
[root@localhost ~]#echo "aa940132245" |grep "\b[0-9]\{6,12\}\b"
位置锚定后,像aa940132245这种杂项 就不会被过滤了
这样我们只会过滤 我们想要的 qq号
前后加\b 位置锚定
如 grep name 可能会匹配 hostname
grep "\bname\b" 只会匹配name 前后的\b 相当于符号,电脑可以识别
echo "[email protected]" |grep -E "[[:alnum:]_-]+@[[:alnum:]_]+\.[[:alnum:]_]+"
echo "13705173391"|grep -E "\b1[3456789][0-9]{9}\b"
grep [选项]… 查找条件 目标文件
和正则表达式 \b 用途相似
目录 文件夹!!!!!!
+ 表示1 或多次
[root@localhost yum.repos.d]# ifconfig ens33 |grep -o "[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+"
192.168.91.100
255.255.255.0
192.168.91.255
[root@localhost yum.repos.d]# ifconfig ens33 |grep -o "[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+"|head -1
192.168.91.100
[root@localhost ~]# ss -nta | grep -v '^State' |cut -d" " -f1|sort |uniq -c
[root@localhost ~]#ss -nt |tr -s " "|cut -d " " -f5|cut -d ":" -f1 |sort|uniq -c
sed 即 Stream EDitor,和 vi 不同,sed是行编辑器,读取一行处理一行。
用于大文件,电脑内存不够,vim打不开大于内存大小的文件
sed [option]... 'script;script;...' [input file...]
选项 自身脚本语法 支持标准输入管道
常用选项:
-n 不输出模式空间内容到屏幕,即不自动打印
-e 多点编辑[root@www data]#sed -n -e '/^r/p' -e'/^b/p' /etc/passwd
-f FILE 从指定文件中读取编辑脚本
-r, -E 使用扩展正则表达式
-i.bak 备份文件并原处编辑#说明:
-ir 不支持
-i -r 支持
-ri 支持
-ni 会清空文件
系统自带自动打印
单引号中间需要写脚本;脚本格式如下
'地址+命令'组成
vim不给地址:默认光标当前行
12\/Jan\/2024:04:12:06
这是时间 Jan 和2024 前面的/ 需要转义
1~2 奇数
2~2偶数 sed -n 'n;p'
新内容一定是固定的字符串,不能有通配符
s/pattern/string/修饰符 查找替换,支持使用其它分隔符,可以是其它形式:s@@@,s###
替换修饰符:
g 行内全局替换
p 显示替换成功的行
w /PATH/FILE 将替换成功的行保存至文件中
I,i 忽略大小写
-r, -E 使用扩展正则表达式 \1 是扩展正则表达式,表示第一个括号里的内容
.* 意思 1到正无穷 任意长度字符 约等于+
提取第四行
然后提取(四个0到9的数字)
提取()里的内容
sed 中除了模式空间,还另外还支持保持空间(Hold Space)
利用此空间,可以将模式空间中的数据,临时保存至保持空间,从而后续接着处理,实现更为强大的功能
第一种写法:
#解释: 'n;p'
此处 n 是读取匹配到的行的下一行覆盖至模式空间 p 是打印
先读第一行是 数字1
然后匹配第二行,将第二行覆盖,就是把 数字2 覆盖 数字 1 再输出
这样,第一行,第二行都处理完毕
接下来从第三行开始,以此类推
第二种写法:
这是步进,从第二行开始,隔两行打印一次
第三种写法:
这也是步进 从第一行开始,隔两行删除(删除了奇数行,剩下的就是偶数行)注意次出不要加 -n
第四种写法:
!反选的意思 奇数反选
小p 是打印的意思 大P 指打印模式空间开端至\n内容,并追加到默认输出之前
N 指读取匹配到的行的下一行追加至模式空间
小p 打印
此处N 到模式空间 就是
1
2
大P 是打印 \n 之前的内容,(换行之前的内容) 即 数字 1
依次类推,打印奇数
vim: 是将整个文件加载到内存中 再进行编辑, 受限你的内存
awk(语言): 读取一行处理一行,
在 Linux/UNIX 系统中,awk 是一个功能强大的编辑工具,逐行读取输入文本,默认以空格或tab键作为分隔符作为分隔(并且默认会压缩空格),并按模式或者条件执行编辑命令。而awk比较倾向于将一行分成多个字段然后进行处理。AWK信息的读入也是逐行
指定的匹配模式进行查找,对符合条件的内容进行格式化输出或者过滤处理,可以在无交互
的情况下实现相当复杂的文本操作,被广泛应用于 Shell 脚本,完成各种自动化配置任务。
前面提到 sed 命令常用于一整行的处理,而 awk 比较倾向于将一行分成多个“字段”然后再进行处理,且默认情况下字段的分隔符为空格或 tab 键。awk 执行结果可以通过 print 的功能将字段数据打印显示。
awk [options] 'program' var=value file…
program通常是被放在单引号中,并可以由三种部分组成
BEGIN语句块
模式匹配的通用语句块
END语句块
xxxxxxxxxx1 11 1pattern{action statements;..}
pattern:决定动作语句何时触发及触发事件,比如:BEGIN,END,正则表达式等
action statements:对数据进行处理,放在{}内指明,常见:print, printf
output statements:print,printf
Expressions:算术,比较表达式等
Compound statements:组合语句
Control statements:if, while等
input statements
-F “分隔符” 指明输入时用到的字段分隔符,默认的分隔符是若干个连续空白符
-v var=value 变量赋值
第一步:执行BEGIN{action;… }语句块中的语句
第二步:从文件或标准输入(stdin)读取一行,然后执行pattern{ action;… }语句块,它逐行扫描文件,
从第一行到最后一行重复这个过程,直到文件全部被读取完毕。
第三步:当读至输入流末尾时,执行END{action;…}语句块
BEGIN语句块在awk开始从输入流中读取行之前被执行,这是一个可选的语句块,比如变量初始化、打印输出表格的表头等语句通常可以写在BEGIN语句块中
END语句块在awk从输入流中读取完所有的行之后即被执行,比如打印所有行的分析结果这类信息汇总都是在END语句块中完成,它也是一个可选语句块
pattern语句块中的通用命令是最重要的部分,也是可选的。如果没有提供pattern语句块,则默认执行{ print },即打印每一个读取到的行,awk读取的每一行都会执行该语句块
改变执行顺序,先BEGIN 再print$1
改变执行顺序,先print$1 最后END
passwd 有多少行 hello 打多少行
注意,此处 awk 没有处理的文件对象,所以加一个BEGIN
输出内容默认空格做分隔符
awk方法;
sed 方法:
2p 打印第二行
\1 打印第一个括号的内容
第二种方法:
第三种方法:
#解释
NR!=1 先去掉第一行
a[$1]++ a是数组名 [$1] 第一个位置变量listen 或者estab
a[$1] 就是 a的数组,把isten 或者estab 当做下标且自循环加1(出现一次加1)
end 做完以上结束后,再做下面的动作
for(i in a)print i,a[i] 这是遍历的意思
非0 是真 0是假
#解释: zzz 是数组名 $0 就是把一整行作为参数写进去
++是最后执行, 前面!zzz[$0] 处理完再++
针对aa:
初始 取反 是否打印 打印后++
第一次 为空假 非0真 打印 真+1
第二次 真+1 (真) 假 (0) 不打 0+1
第三次 0+1(真) 假(0) 不打 0+1
第四次 0+1(真) 假(0) 不打 0+1
所以aa 不论有多少行只打印一次,达到去重的效果
第一种方法:awk
第二种方法:cut
第三张方法:sed
方法1:sed
方法2:awk
这边有个小技巧,awk 提取的时候把 uid放第一列
方便我们后续用 sort -n 排序
先提出 内存这一行,用使用内存 除 所有内存
取整 并加 %
awk 选项
-F “分隔符” 指明输入时用到的字段分隔符,默认的分隔符是若干个连续空白符
-v var=value 变量赋值
awk 选项 '模式{print }'
FS :指定每行文本的字段分隔符,缺省默认为空格或制表符(tab)。与 “-F”作用相同 -v "FS=:"
OFS:输出时的分隔符
NF:当前处理的行的字段个数
NR:当前处理的行的行号(序数)
$0:当前处理的行的整行内容
$n:当前处理行的第n个字段(第n列)
FILENAME:被处理的文件名
RS:行分隔符。awk从文件上读取资料时,将根据RS的定义就把资料切割成许多条记录,而awk一次仅读入一条记录进行处理。预设值是\n
二者效果相同
此外,FS 支持bash 变量
显示行号
打印第二行 (固定格式 2个等号)
2 到5行
不要第一行
printf
%s:显示字符串
%d, %i:显示十进制整数
%f:显示为浮点数
%e, %E:显示科学计数法数值
%c:显示字符的ASCII码
%g, %G:以科学计数法或浮点形式显示数值
%u:无符号整数
%%:显示%自身
awk '模式{处理动作}'
PATTERN:根据pattern条件,过滤匹配的行,再做处理
模式"其实就是选择的"条件",awk是逐行处理文本的,也就是说,awk会先处理完当前行,再处理下一行,当不指定任何"条件",awk会一行一行的处理文本中的每一行,如果指定了"条件",只有满足"条件"的行才会被处理,不满足"条件"的行就不会被处理。
sed -nr '/10/,/11/p'
awk '/10/,/11/'
除了第一行都打印
#解释: 第一次循环n=0 所以不打印 数字1
后面循环依次加1 都大于0 所以后面的都打印
都打印
打印奇数
#解释
i 一开始0 所以第一行假,然后取反 是结果真 最后打印
下一行 真取反 假 不打印
打印偶数
注意 括号不同
‘{if(判断条件){执行语句1}else if(判断条件){执行语句}else if(判断条件){执行语句}}’
awk数组特性:
awk的数组是关联数组(即key/value方式的hash数据结构),索引下标可为数值(甚至是负数、小数等),也可为字符串
1. 在内部,awk数组的索引全都是字符串,即使是数值索引在使用时内部也会转换成字符串
2. awk的数组元素的顺序和元素插入时的顺序很可能是不相同的
awk数组支持数组的数组
① 数字1 是关联数组是个符号 不是数字
a为 关联数组的名字 1 是个符号 不是数字
② 遍历数组 遍历出来 顺序不固定
③统计当前主机的连接状态
#解释
NR!=1 先去掉第一行
a[$1]++ a是数组名 [$1] 第一个位置变量listen 或者estab
a[$1] 就是 a的数组,把isten 或者estab 当做下标且自循环加1(出现一次加1)
end 做完以上结束后,再做下面的动作
for(i in a)print i,a[i] 这是遍历的意思
④ 去重
非0 是真 0是假
#解释: zzz 是数组名 $0 就是把一整行作为参数写进去
++是最后执行, 前面!zzz[$0] 处理完再++
针对aa:
初始 取反 是否打印 打印后++
第一次 为空假 非0真 打印 真+1
第二次 真+1 (真) 假 (0) 不打 0+1
第三次 0+1(真) 假(0) 不打 0+1
第四次 0+1(真) 假(0) 不打 0+1
所以aa 不论有多少行只打印一次,达到去重的效果