关于正则表达式和三剑客:
1、什么是正则表达式?
作用和特殊字符一样。
正则表达式是为处理大量的字符串及文字而定义的一套规则和方法。
2、linux三剑客的正则表达式有如下几个特点:
(1)为处理大量文本及字符串而定义的一套规则和方法。
(2)其工作时以行为单位进行,即一次处理一行。
(3)通过正则表达式可以将复杂的处理任务化繁为简。
(4)仅被三剑客(grep、sed、awk)命令支持,其他命令无法使用。
3、提高效率,快速获取到想要的内容。
4、适用于三剑客命令grep、sed、awk以行为单位处理。
(1)进行一下别名的配置:
alias grep ='grep --color=auto'
alias egrep='agrep --color=auto' #<==配置后会把匹配上的内容用红色显示
(2)注意LC_ALL环境变量的设置,建议为:
export LC_ALL=C #<==配置后操作时不会出现异常匹配情况。
完整的处理命令为:
cat >>/etc/profile<<EOF #<==注意EOF后面不要有多余的空格
alias grep ='grep --color=auto'
alias egrep='agrep --color=auto'
export LC_ALL=C
EOF #<==注意EOF后面不要有多余的空格或者其他符号
source /etc/profile #<==使修改的内容生效。
5、正则表达式的分类:
linux三剑客的正则表达式可以分为两类:
(1)基本正则表达式
(2)扩展正则表达式
^尖角号,以...开头.^linux 以linux开头
-----------------------------------------------------------------
$美元符 以...结尾。linux$,以linux结尾
-----------------------------------------------------------------
^$ 空行
------------------------------------------------------------------
. 匹配任意一个且只有一个字符,和通配符? 一样
-------------------------------------------------------------------
\ 让有意义的字符 脱掉马甲,还原本义
-----------------------------------------------------------------
* 重复前面字符0次或多次
-----------------------------------------------------------------
.*表示所有内容
-----------------------------------------------------------------
^.* 组合符 匹配以任意0个多个字符开头的内容
ifconfig eth0|sed -rn '2s#^.*addr(.*)Bc.*$#\1#gp'
-----------------------------------------------------------------
.*$ 以任意0个或者多个字符结尾
-----------------------------------------------------------------
[abc]匹配[]集合内的任意一个字符a或b或c;[abc]也可以写成[a-c]
--------------------------------------------------------------------------
^[abc]匹配不包含^后的任意字符a或b或c
(3)扩展正则(ERE):
+ 匹配前一个字符1次或者多次
-----------------------------------------------------------------
[:/]+ 匹配括号内的:或 /字符1次或1次以上
-----------------------------------------------------------------
? 匹配前一个字符0次或者1次
-----------------------------------------------------------------
| 或者 同时过滤多个字符串
-----------------------------------------------------------------
() 分组过滤被括号起来的东西表示一个整体
-----------------------------------------------------------------
\n 引用前面()小括号里的内容,例如:(aa)\1,匹配aaa
-----------------------------------------------------------------
a{n,m} 匹配前一个字符最少n次,最多m次
-----------------------------------------------------------------
a{n,} 匹配前一个字符最少n次
-----------------------------------------------------------------
a{n} 匹配前一个字符正好n次
-----------------------------------------------------------------
a{,m} 匹配前一个字符最多m次
-----------------------------------------------------------------
es? 匹配e es
-----------------------------------------------------------------
es* 匹配e es ess esss es...
(4)特殊中括号:
[:dight:] 匹配任意一个数字字符,相当于[0-9]
[:lower:] 匹配小写字母,相当于[a-z]
[:upper:] 匹配大写字母,相当于[A-Z]
(5)元字符
\b 匹配单词边界 类似grep -w
\d 匹配单个数字字符 需用grep -p
例子:
[root@test ~]# grep "^I" linux.txt
I am student !
I like linux
my qq num is 999888666
==============================================================
6、linux 三剑客
awk sed grep
sed:
sed是操作、过滤和转换文本内容的强大工具。
常用功能有对文件实现快速增删改查(增加、删除、修改、查询)。
其中查询的功能中最常用的2大功能是过滤(过滤指定字符串)和取行(取出指定行).
sed [选项] [sed内置命令字符] [文件]
选项:
-n 取消默认sed的输出,常与sed内置命令的p连用。
-i 直接修改文件内容,而不是输出到终端
如果不使用-i选项sed 只是修改在内存中的数据,并不会影响磁盘上的文件。
sed 的内置命令字符说明:
s 替换
g 全局global
p 打印print
d 删除delete
-----------------------------------------------------------------
例子1: 输出linux.txt 的第2-3行内容
[root@test ~]# head -3 linux.txt
I am student !
I like linux
my qq num is 999888666
-----------------------------------------------------------------
例子2:过滤出含有linux字符串的行
[root@test ~]# grep linux linux.txt
I like linux
-----------------------------------------------------------------
例子3:将文中的linux字符串全部替换为SElinux
vim 替换:
:%s#linux#SElinux#g
sed 's#想替换啥#用啥替换#g' linux.txt
sed 's#linux#SElinux#g' linux.txt
修改文件:
sed 's#linux#SElinux#g' linux.txt
----------------------------------------------
例子4:在linux.txt 文件的第2行插入文本
考查的sed命令的i字符功能:
[root@test ~]# sed -i '2i I learn linux,at 2i.' linux.txt
[root@test ~]# cat -n linux.txt
1 I am student !
2 I learn linux,at 2i.
3 I like linux
-----------------------------------------------------------------
例子5:删除指定行
sed -i '3d' linux.txt
sed -i '5,8d' linux.txt
-----------------------------------------------------------------
例子6:取出linux中执行ifconfig eth0后对应的IP地址(只能输出IP地址).
[root@test ~]# ifconfig eth0|sed -n 2p|grep "^.*inet"
inet 10.0.0.201 network 255.255.255.0 broadcast 10.0.0.255
[root@test ~]# ifconfig eth0|sed -n 2p|sed 's#^.*inet ##g'|sed 's# netm.*$##g'
10.0.0.201
7.cut 按列切割:
-d 指定分隔符 -f 指定那列,多列用逗号
[root@test ~]# cat a.txt
1 2 3 4 5 6 7 8 9 10
[root@test ~]# cut -d "" -f1,3,5 a.txt
1 3 5
[root@test ~]# cut -d "" -f3-5 a.txt
3 4 5
-d 指定分隔符
cut -f 指定那列,多列可用逗号或-
-c 按字符取内容
=======================================================
8、 awk:linux三剑客老大
三剑客自身有的特长。
grep 过滤查找内容。筛子
sed 取行,替换,删除,追加
awk 去列
-----------------------------------------------------------------
awk [option] 'pattern{action}' file...
awk [参数] '条件{动作}' 文件...
参数:
-F 指定分隔符:
打印第一列:
[root@test ~]# awk -F ":" '{print $1}' linux.txt
root
bin
daemon
adm
lp
[root@test ~]# awk -F ":" '{print $3,$5}' linux.txt
0 root
1 bin
2 daemon
3 adm
4 lp
列:$1 第一列 $2 第二列 ...
$0 整行
$NF 最后一列
-----------------------------------------------------------------
例子:打印 1 2 和 最后一列
[root@test ~]# awk -F ":" '{print $1,$2,$NF}' linux.txt
针对该awk命令的常见变量进行了列表:
变量名 属性
$0 当前整行记录
$n 当前记录的第n个列,字段间由FS或-F参数指定分隔符
NF 当前记录中的列的个数,就是有多少列
$(NF-n) 倒数第n列,n为数字
NR 已经读出的记录数,就是行号,从1开始
-----------------------------------------------------------------
例子:取出ip地址:
[root@test ~]# ifconfig eth0|awk 'NR==2{print $2}'
10.0.0.201
网友评论