文章目录
正则表达式(BRE)
基本正则
- 正则表达式一般以行为单位处理的
- 一行为单位,一次处理一行
- 简单 高效 易用
- 在三剑客中使用的就是正则,在普通命令中使用的就是通配符
符号 | 意思 |
---|---|
^ | 查找以…开头的行 |
$ | 查找以… 结尾的行(注意:结尾是否有空格 cat -A) |
^$ | 空行 |
. | 过滤任意单个字符 不匹配空格 |
* | 前一个字符重复0次及0次以上 |
^ .* m | 以任意字符开始到m |
m .* $ | 以m开始到任意字符结束 |
[abc] | 或者 在中括号写啥找啥 特殊字符都会被转移 |
[^abc] | 中括号中^表示取反 |
[a-z] | 或者 匹配序列 |
[^^$] | 这里第一个表示取反,第二个就是普通符号 |
扩展正则(ERE)
符号 | 意思 |
---|---|
+ | 前一个字符匹配1次及1次以上 |
[ ]+ 联合使用 | 或者字符出现1次及1次以上 |
| | 或者 |
{n,m} | 最少出现n次,最多出现m次 |
{n} | 必须出现n次 |
{n, | 最少出现n次 |
{,m} | 最多出现m次 |
正则表达式大坑合集:
第一大坑:
*前一个字符连续出现0次或0次以上
Linux三剑客正则表达式01坑
‘1*’0次以上 1 11 111
‘1*’0次 就会出现所有内容
第二大坑: ^.*m
贪婪匹配到最后一个m
贪婪匹配到最前面的m m.*$
grep 'm.*$' oldboy file
第三大坑:
神奇的[ ] 在括号里的符号 大部分没有特殊的含义 写什么找什么
目前 第一个^ 代表取反
老三 grep
grep 命令用于查找文件里符合条件的字符串
语法格式:
grep ‘字符串’ file
cat file | grep ‘字符串’
参数:
参数 | 意思 |
---|---|
-v | 取反 |
-i | 不区分大小写 |
-r | 递归过滤 |
-n | 显示过滤到内容的行号 |
-E | 扩展正则 |
-o | 显示匹配过程 |
-w | 精确匹配 |
① 直接可以过滤文件的内容
grep '过滤内容' 文件目标 #从文件中过滤出包含root的行
PS:因为别名设置了颜色 所以过滤出来内容有颜色显示
②从其他命令的输出过滤内容 过滤屏幕上的内容
cat passwd | grep 'root'
ll | grep ‘^-’ ^ #以什么开头
③显示过滤到内容的行号
grep -n 'root' passwd.bak
④过滤出文件中包含 # 的行
grep '#' config
⑤对取得的内容进行取反 但可能出现空行
grep -v '#' config
⑥过滤文件中的空行 ^$
grep -v '^$' config | grep -v '#'
⑦扩展 扩展正则
egrep -v '#| ^$' config
grep -Ev '# | ^$' config
案例1:查找以…开头的行
[root@xiaoheng ~]# egrep '^I' 1.txt
I am lizhenya teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
案例2:查找以…结尾的行
[root@xiaoheng ~]# egrep '!$' 1.txt
I am lizhenya teacher!
I like badminton ball ,billiard ball and chinese chess!
此处要注意结尾可能会有空格
[root@xiaoheng ~]# egrep 'm$' 1.txt
[root@xiaoheng ~]# egrep 'm $' 1.txt
my blog is http: blog.51cto.com
our site is http:www.lizhenya.com
案例3:过滤以 . 或者 !结尾的行(注意:.在正则表示所有符号,所以只想要.需要加撬棍)
[root@xiaoheng ~]# egrep '.$' 1.txt
I am lizhenya teacher!
I teach linux.
test
I like badminton ball ,billiard ball and chinese chess!
my blog is http: blog.51cto.com
our site is http:www.lizhenya.com
my qq num is 593528156
aaaa,
not 572891888887.
^^^^^^^^66$$$$$$$^^^$$
lizhenyalizhenyalizhenya
[root@xiaoheng ~]# egrep '\.$' 1.txt
I teach linux.
not 572891888887.
案例4:过滤出所有的空格
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VvufuGcp-1616647829457)(en-resource://database/544:1)]
案例5:过滤出包含$m的行 注意变量问题
[root@xiaoheng ~]# egrep '$m' 1.txt
[root@xiaoheng ~]# egrep '\$m' 1.txt
^^^^^^^^66$$$$$$$^^^$$m
[root@xiaoheng ~]#
案例6:过滤空行
[root@xiaoheng ~]# egrep '^$' 1.txt
[root@xiaoheng ~]#
案例7:过滤任意单个字符
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RQkxlIz5-1616647829460)(en-resource://database/545:1)]
案例面试题:统计文本中单词出现的次数
[root@xiaoheng ~]# egrep '[a-Z0-9]*' 1.txt -o |sort|uniq -c|sort -nr|head -3
3 is
3 I
2 my
扩展命令:
sort # 排序 把相同的放在一起 统计某个单词或者字母 或者IP地址出现的次数
-r 逆序排序
-n 按数字大小排序
-k2 第二列
uniq #统计相邻的 -c
老二 sed
作用:
1、查找过滤文件内容
2、 替换内容 直接替换 免交互****
3、如果内容输出到屏幕 临时替换 屏幕上显示的内容替换 但是不影响源文件
4、如果内容不显示到屏幕 则替换源文件 -i
5、增删改查
语法格式:
sed ‘动作’ 文件
sed ‘模式 动作’ 文件
sed ‘过滤内容 动作’ 文件
sed ‘找谁 干啥’ 文件
sed ‘找老王的媳妇 弄她’ 文件
sed 之查找过滤文件内容
使用sed查找文件的行 可以直接指定行
精确匹配行
语法:
sed ‘np’ file #显示文件中的第n行 n 为数字
-n 取消默认输出
作用:过滤文件中有用的行到新的文件中继续使用 > file.txt
案例1:显示文件第三行
sed -n '3p' file
案例2: 显示文件中最后一行
sed -n '$p' file
案例3:显示文件中的第2行到第5行 用逗号分隔 表示区间
sed -n '2,5p' file
案例4:显示文件的第5行 到 最后一行 连续的行
sed -n '5,$p' file
sed 之模糊匹配
语法: sed ‘/过滤的内容/p’
// # 模式 需要过滤的内容 查找的内容
p # print 打印输出到屏幕
案例:模糊匹配文件中包含 root 的行
sed -n '/root/p' file
案例2:匹配文件中从root到adm区间的行
逗号表示范围 字符串之间的范围 过滤时间段好用
sed -n '/root/,/adm/p' file
root开始匹配到adm 如果下面还有root,会继续从root往下匹配,如果有adm则停止,如果没有则下文全部匹配
sed 之增加内容
动作:
动作 | 源单词 | 解释 |
---|---|---|
a | append | 追加当前行的下一行内容 ‘2a heng’ file 第三行添加 |
i | insert | 插入 2i heng |
c | change | 替换内容 2c |
w | 把内容定向到新文件中 了解 |
- 以上内容只在屏幕上改变,想要改变源文件 需要加 -i
语法:
sed ‘找谁 干啥’ 1.txt
sed ‘2a 内容’ 1.txt # 下一行
sed ‘2i 内容’ 1.txt # 在指定行 其他往下顺延
sed ‘2c 内容’ 1.txt # 把指定行替换掉
案例1:a 在第二行的下面追加内容
sed '2a oldboy' 1.txt
案例2:i 在当前行插入
sed '2i hahahh' 1.txt
案例3:c 把当前行替换掉
操作:将selinx配置文件,第七行改成disable
sed -i '7c SELINUX=disable' /etc/selinux/config
sed 之替换内容
作用:
替换字符串 替换单词
格式:
sed ‘s#找谁#替换成谁#g’ file #临时替换
案例1:临时替换
sed 's#找谁#替换成谁#g' file
案例2:永久替换
sed -i 's#找谁#替换成谁#g' file #永久替换
案例3:结合使用 模式+动作方式
sed -n '3s#xxx#bbb#gp' file
案例4:第三行的nnn替换成sss
sed -n '3s#nnn#sss#gp' file
案例5:第三行到最后一行sss替换成ccc
sed -n '3,$s#sss#ccc#gp' file
案例6:将第三行到第6行开头加上 #
sed -n '3,6s#^#\##gp'
案例7:查询hehe的一行,然后将那一行开头添加#
sed -n '/hehe/s#^#\##gp' 1.txt
vim中的替换:
%s#aaa#bbb#g
%针对所有行
s#aaa#bbb# 替换每一行的第一个过滤的内容
s#aaa#bbb#g 替换每一行中所有过滤的内容
s sub #替换标志
g global # 全局替换
sed 之删除
d 删除动作
格式:
sed ‘3d’ file # 删除第三行
案例:删除第四行
sed '4d' file
案例:删除第2到第三行
sed '2,3d' file
案例: 删除包含oldboy 的行
sed '/root/d' file #删除包含root 的所有行
案例:删除aaa到bbb之前的行
sed '/root/,/old/d' file
sed 后向引用
sed -r 支持扩展正则
语法格式:
想要输出的内容经过正则匹配使用()保护起来
输出的时候\1就是显示第一个()中的内容 \2显示第二个()的内容
sed ‘2s#( )#\1#g’ file
案例1:计算1到10的加法
[root@xiaoheng ~]# echo {1..10}|sed 's# #+#g'|bc
55
案例2:使用seq从1加到100
[root@xiaoheng ~]# seq 100|tr '\n' '+'|sed -r 's#(.*$)#\1\n#g'|sed 's#100+#100#g'
1+2+3+4+5+6+7+8+9+10+11+12+13+14+15+16+17+18+19+20+21+22+23+24+25+26+27+28+29+30+31+32+33+34+35+36+37+38+39+40+41+42+43+44+45+46+47+48+49+50+51+52+53+54+55+56+57+58+59+60+61+62+63+64+65+66+67+68+69+70+71+72+73+74+75+76+77+78+79+80+81+82+83+84+85+86+87+88+89+90+91+92+93+94+95+96+97+98+99+100
[root@xiaoheng ~]# seq 100|tr '\n' '+'|sed -r 's#(.*$)#\1\n#g'|sed 's#100+#100#g'|bc
5050
[root@xiaoheng ~]# seq 100|tr '\n' '+'|sed -r 's#(.*)\+100\+#\1#g'|sed -r 's#(.*)#\1+100\n#g'
1+2+3+4+5+6+7+8+9+10+11+12+13+14+15+16+17+18+19+20+21+22+23+24+25+26+27+28+29+30+31+32+33+34+35+36+37+38+39+40+41+42+43+44+45+46+47+48+49+50+51+52+53+54+55+56+57+58+59+60+61+62+63+64+65+66+67+68+69+70+71+72+73+74+75+76+77+78+79+80+81+82+83+84+85+86+87+88+89+90+91+92+93+94+95+96+97+98+99+100
[root@xiaoheng ~]# seq 100|tr '\n' '+'|sed -r 's#(.*)\+100\+#\1#g'|sed -r 's#(.*)#\1+100\n#g'|bc
5050
案例3:使用后向引用获取IP地址和子网掩码
[root@xiaoheng ~]# ifconfig eth0|sed -n '2p'|sed -r 's#^.*inet(.*) broadc.*$#inet \1#g'
inet 192.168.31.200 netmask 255.255.255.0
[root@xiaoheng ~]# ifconfig eth0|sed -n '2p'|sed -r 's#^.*inet (.*) netmas.*$#\1#g'
192.168.31.200
[root@xiaoheng ~]# ifconfig eth0|sed -n '2p'|sed -r 's#^.*mask (.*) broadc.*$#\1#g'
255.255.255.0
老大 awk
了解awk:
1、编程语言 三个人写的
2、查找匹配文件内容
3、格式化输出结果printf
4、统计数据
5、支持 for while if 数组 等
awk主要对哪些文件进行数据统计 部分统计优于python
1》日志文件(服务日志 SSHD NGINX MySQL 自研发的服务)
2》系统配置文件
3》常规普通文件
4》命令输出的结果
5》数值运算
awk语法格式:
1、模式 匹配查找字符串的过程 找谁 过滤字符串
2、awk的动作 必须在花括号内
3、只有模式没有动作 默认会执行print输出操作 #py print echo shell 编程
4、如果没有模式(找谁)、默认的是对所有行进行操作
awk '模式{动作}' file
awk '找谁{干啥}' file
cat file |awk '模式{动作}'
awk中的变量(类似于操作系统自带的变量 LANG PATH PS1)
1>NR 行号 把文件的所有行按照顺序都会记录到NR变量中
2>$0 $1 表示文件所有和文件的第n列
3> , 都好在awk中表示空格
4> NF 存储了每一行的最后一列的列号
awk取行 NR 行号
awk '管理行{管理列}' 目标文件
-F管理分隔符
==等于 在大部分的命令中一个等号是赋值 变量的意思
!= 不等于
> 大于
< 小于
>= 大于等于
<= 小于等于
&& 并且 两端同时成立
|| 或者
案例1:输出文件中大于3的行
awk 'NR>3' file
案例2:输出文件中的第三行
awk 'NR==3' file
案例3:输出文件中不等于5的行
awk 'NR!==5' file
案例4:输出文件大于等于3的行
awk 'NR>=3' file
案例5:输出文件内容等于2并且大于1的行
awk 'NR==2&&NR>1' file
案例6:查找文件的3-5行
awk 'NR==3,NR==5' file
awk 'NR>2&&NR<6' file
awk取列
变量
$0 awk在执行过程中把每一行都复制给$0 $0表示所有文件内容
$1 文件中的第一列
$2 文件中的第二列
$n 文件中的第n列 n代表数字
默认的列是以tab键或空格来分隔的
案例1:$0 输出文件的所有内容
awk '{print $0}' file
案例2:取文件中的列数
语法格式:
awk ‘{print $n}’ file # 输出文件中的第n列
查找行
awk '模式' file
查找列
awk '{动作}' file #对文件中所有的行都进行动作处理
案例3:输出文件中的第一列
awk '{print $1}' file
案例4:输出文件中的第一列和最后一列 使用逗号分隔 逗号是awk中的变量
awk '{print $1,$NF}' file
案例5:输出文件中的最后一列 变量NF表示每一行最后一列的总列数
awk '{print $NF}' file
PS:awk中的动作都是变量 取消变量使用双引号
awk动作中可以输出任何自己想要的字符串 必须加双引号
awk动作中不在双引号中的字符串都被视为变量
指定分隔符样式
取出/etc/passwd中的第一列
-F 指定分隔符(可指定任意的) 默认以tab键和空格来分隔
①-F的第一种写法 -F":"
awk -F":" '{print $1}' file
②-F的第二种写法 -F:
awk -F: '{print $1}' file
案例1:指定多个分隔符[/.;]
awk -F[./] '{print $1}' file
案例2:指定连续多个分隔符[-=/]+
awk -F[./]+ '{print $1}' file
PS:两个分隔符 在一起的话 中间也是一列
+前一个字符出现1次或1次以上都作为一个分隔符 一刀砍下去
设定多个分隔符
取出passwd中的第六列但是不要 /
awk -F 指定多个分隔符
语法格式:
awk -F “😕”
awk -F “[😕]”
案例1:使用“:/”视为一个整体作为分隔符
awk -F:/ file
案例2:使用“[😕]”或者:或者/作为分隔符
awk -F[:/] file
案例3:使用“[😕]+”
[:/]+ ===> 对中括号中的符号匹配1次及1次以上
awk -F[:/]+ file
问题1:出现连续的分隔符
[/; ]+ 主要是用+
问题2:以单引号或者任意符号作为分隔符
awk -F’ ‘{print $3}’ file 单引号需要加撬棍
任意字符都可以作为分隔符
同时取行和列
输出文件内容的第二行的第六列
语法格式:
awk ‘模式{动作}’ file
第一种
awk ‘NR==2{print $6}’ file
使用模糊匹配
语法格式:
grep ‘过滤的内容’ file
sed -n ‘/匹配的内容/p’ file
awk ‘/ /’ file
awk ‘/ /,/ /’ file
案例1:查找包含root的行
awk '/root/' file
案例2:查找包含root或者nologin的行
awk '/root|nologin/' file
案例3:区间匹配
awk '/root/,/bin/' file
判断
可以是字符串的比对 也可以按照列数判断(数字)
字符串比对
格式1:$1==“root” 等于root说明成功 成功后执行print动作 &&
格式2:$3>100 第三列的每一行的数字都和100进行比较 如果动作默认输出 大于100的所有行
比较符号:
== #字符串使用 == 和 !=
>
<
!=
>=
<=
案例1:将文件第一列含有root的行的第二列匹配出来
awk '$1=="root"{print $2}' file
案例2:将文件第一列大于5的行的第二列匹配出来
awk '$1>5{print $2}' file
三剑客的过滤功能总结以及补充
三剑客过滤内容的区别:
grep ‘过滤的内容’ file
sed -n ‘/过滤的内容/p’ file
awk ‘/过滤的内容/’ file
1、awk按照行来处理文件 文件中多少行就会做多少次print的动作
[root@xiaoheng ~]# awk '{print "o"}' 1.txt
o
o
o
o
o
o
2、
let i++
i++ i的初始值为0 i++ =====> i=i+1
获取变量的i的值
3、BEGIN
作用:在读取文件之前做什么
语法格式:
awk ‘BEGIN{print 1+1}’
[root@xiaoheng ~]# awk 'BEGIN{print "oldboy"}'
oldboy
[root@xiaoheng ~]# awk 'BEGIN{print 1+1}'
2
4、END 执行完文件后做的动作
[root@xiaoheng ~]# awk '{print $2}END{print "好了就到这吧"}' 1.txt
Wu
Liu
Wang
Zi
Li
Lao
好了就到这吧
5、BEGIN END结合使用
语法:
awk ‘BEGIN{开始前的动作}{读取文件的动作}END{读取文件后的动作}’ file
[root@xiaoheng ~]# awk 'BEGIN{print "开始"}{print $1}END{print "结束"}' 1.txt
开始
1
2
3
4
5
6
结束
[root@xiaoheng ~]# awk 'BEGIN{print "准备好了吗"}{print "everybody 跟我一起来"}END{print "好了就到这吧"}' 1.txt
准备好了吗
everybody 跟我一起来
everybody 跟我一起来
everybody 跟我一起来
everybody 跟我一起来
everybody 跟我一起来
everybody 跟我一起来
好了就到这吧
6、匹配规则
正则匹配
awk ‘/^root/’ file
awk ‘/bash$/’ file
awk -F: ‘$30’ file
awk -F: '$1"root"’ file
awk -F: ‘$5 ~ /^root/’ file
awk -F: ‘$5 ~ /1/’ file
awk -F: ‘$5 !~ /2/’ file
统计行数 wc -l
案例:
[root@xiaoheng ~]# awk -F: '{print $2}' /etc/passwd|wc -l
23
if判断格式:
awk ‘{if( ){ }eles if( ){ }eles( ){ }}END{ }’ /etc/passwd