正则表达式

  • Linux文件中每行都有一个$结尾,空行也有,一般看不见这个$

基本-BRE

符号 释义
^ 尖角号,用于模式的最左侧,如“^oldboy”,匹配以oldboy单词开头的行
$ 美元符,用于模式的最右侧,如”oldboy$”,表示以oldboy单词结尾的行
^$ 组合符,表示空行
. 匹配任意一个且只有一个字符,不能匹配空行
\ 转义字符,让特殊含义的字符,现出原形,还原本意,例如\.代表小数点
* 匹配前一个字符(连续出现)0次或1次以上,重复0次代表空,即匹配所有内容
.* 组合符,匹配所有内容
^.* 组合符,匹配任意多个字符开头的内容
.*$ 组合符,匹配以任意多个字符结尾的内容
[abc] 匹配集合内的任意一个字符,a或b或c,可以写[a-c]
[^abc] 匹配除了^后面的任意字符,a或b或c,^表示对[abc]的取反

扩展-ERE

符号 释义
+ 匹配前一个宁符1次或多次
[:/]+ 匹配括号内的”∵:”或者”/“字符1次或多次
? 匹配前一个字符0次或1次
| 表示或者,同时过滤大哥字符串
() 分组过滤,被括起来的内容表示一个整体
a{n,m} 匹配前一个字符最少n次,最多m次
a{n,} 匹配前一个字符最少n次
a{n} 匹配前一个字符正好n次
a{,m} 匹配前一个字符最多m次

grep-对文本内容进行过滤,筛选

参数 释义
-v 排除匹配结果
-n 显示匹配行与行号
-i 不区分大小写
-c 只统计匹配的行数
-E 使用egrep命令(加这个参数可以使用扩展ERE)
–color=auto 为grep过滤结果添加颜色
-w 只匹配过滤的单词
-o 只输出匹配的内容

grep语法

1
grep $参数 $匹配模式 $file

sed-对文件或是数据流进行加工处理

  • 注意sed和awk使用单引号,双引号有特殊解释
  • sed是Stream Editor(字符流编辑器)的缩写,简称流编辑器。
  • sed是操作、过滤和转换文本内容的强大工具。

sed参数

参数 解释
-n 取消默认sed的输出,常与sed内置命令p一起用
-i 直接将修改结果写入文件,不用-i, sed修改的是内存数据
-e 多次编辑,不需要管道符了
-r 支持正则扩展

sed内置命令字符

sed的内置命令字符 解释
a append,对文本追加,在指定行后面添加一行/多行文本
d Delete,删除匹配行
i insert,表示插入文本,在指定行前添加一行/多行文本
p Print ,打印匹配行的内容,通常p与-n一起用
s/正则/替换内容/g 匹配正则内容,然后替换内容(支持正则),结尾g代表全局匹配

sed语法

1
grep $参数 $内置命令字符 $file

sed增删改查操作

1
2
3
4
5
6
7
[root@localhost ~]# cat aaa.txt
My screen name is linlink
My hobby is sleeping
I love Linux
Learn kubernetes
I'm not a networker
My qq is 1234568789

输出文件第二到三行

1
2
3
4
5
6
7
8
9
[root@localhost ~]# sed '2,3p' aaa.txt
My screen name is linlink
My hobby is sleeping
My hobby is sleeping
I love Linux
I love Linux
Learn kubernetes
I'm not a networker
My qq is 1234568789
1
2
3
[root@localhost ~]# sed '2,3p' aaa.txt -n
My hobby is sleeping
I love Linux

输出文件第二及下面三行

1
2
3
4
5
[root@localhost ~]# sed '2,+3p' aaa.txt -n
My hobby is sleeping
I love Linux
Learn kubernetes
I'm not a networker
1
2
3
4
5
6
7
8
9
10
11
[root@localhost ~]# sed '2,+3p' aaa.txt
My screen name is linlink
My hobby is sleeping
My hobby is sleeping
I love Linux
I love Linux
Learn kubernetes
Learn kubernetes
I'm not a networker
I'm not a networker
My qq is 1234568789

匹配qq所在的行并打印

1
2
[root@localhost ~]# sed '/qq/p' aaa.txt -n #-n去掉其它行
My qq is 1234568789
1
2
3
4
5
6
7
8
[root@localhost ~]# sed '/qq/p' aaa.txt
My screen name is linlink
My hobby is sleeping
I love Linux
Learn kubernetes
I'm not a networker
My qq is 1234568789
My qq is 1234568789

第二行下面增加一行数据

1
sed -i "2a ************" aaa.txt         #-i增加到文件里

第二行上面增加一行数据

1
sed -i "2i ************" aaa.txt         #-i增加到文件里

a空模式匹配

1
sed -i "a -------------" aaa.txt         #-i增加到文件里

My全部改为I

1
sed -i 's/My/I/g' aaa.txt              #修改文件里的数据
1
sed 's/My/I/g' aaa.txt              #修改内存里的数据

多次编辑规则

1
sed -e 's/My/I/g' -e 's/qq/wx/g' aaa.txt 

匹配qq所在的一行并删除

1
sed '/qq/d' aaa.txt -i                #删除文件里的数据
1
2
3
4
5
6
[root@localhost ~]# sed '/qq/d' aaa.txt   #删除的是内存的数据
My screen name is linlink
My hobby is sleeping
I love Linux
Learn kubernetes
I'm not a networker

匹配第3行到最后一行并删除

1
sed "3,/&/d" aaa.txt  -i                  #删除文件里的数据
1
sed "3,/&/d" aaa.txt                       #删除的是内存的数据

删除第二行到第三行

1
sed "2,3d" aaa.txt  -i                  #删除文件里的数据
1
sed "2,3d" aaa.txt                       #删除的是内存的数据

awk

参数 解释
-F 指定分割字段符
-v 定义或修改一个awk内部的变量
-f 从脚本文件中读取awk命令
内置变量 解释
FS 输入字段分隔符,默认为空白字符
oFS 输出字段分隔符,默认为空白字符
RS 输入记录分隔符(输入换行符),指定输入时的换行符
ORS 输出记录分隔符(输出换行符),输出时用指定符号代替换行符
NF NF: number of Field,当前行的字段的个数(即当前行被分割成了几列),字段数量
NR NR:行号,当前处理的文本行的行号。
FNR FNR:各文件分别计数的行号
FILENAME FILENAME:当前文件名
ARGC ARGC:命令行参数的个数
ARGV ARGV:数组,保存的是命令行所给定的各参数

真寄霸多、学尼玛、放弃了