Linux中最重要的三个命令在业界被称为“三剑客”,它们分别是grep、sed、awk
grep、sed、awk是Linux操作文本的三大利器,合称文本三剑客,也是必须掌握的Linux命令之一
三者的功能都是处理文本,但侧重点各不相同,其中awk功能最强大,但也最复杂。
grep适合单纯的查找或匹配文本,sed更适合编辑匹配到的文本,awk更适合格式化文本,对文本进行较复杂的格式处理
一、正则表达式
1.1 简介
正则表达式又称为正规表达式、常规表达式。
正则表达式是使用单各字符串来描述、匹配一系列符合某个句法规则的字符串,简单来说, 就是一种匹配字符串的方法,通过一些特殊符号,实现快速查找、删除、替换某个特定的字 符串。
1.2 匹配位置
1、匹配行首 : ^
2、匹配行位 : $
3、匹配单词的首部 :\<
4、匹配单词的尾部 :\>
举例子:
例1:找到以root为开头的行
grep "^root" a.txt
例2:找到以root为结尾的行
grep "root$" a.txt
1.3 匹配范围
[] 表示限定一个范围
[0-9] 表示0-9之间的任意一个数字
[a-z] 表示任意一个小写字母
[A-Z] 表示任意一个大写字母
[0-9a-zA-Z] 表示任意一个数字或者字母
[a-zA-Z] 表示任意一个字母 = [a-Z]
[acd39] 表示这五个字符中的任意一个字符
[[:space:]] 表示一个空格
[[:digit:]] 表示任意一个数字
[[:lower:]] 表示任意一个小写字母
[[:upper:]] 表示任意一个大写字母
[[:alnum:]] 表示任意一个数字或者字母
[[:punct:]] 表示任意一个符号
[[:digit:][:space:]] 表示一个空格或者任意一个数字
举例子:匹配以字母a或c或f为开头的行
grep "^[acf]" 1.txt
1.4 次数匹配
. 表示任意一个字符
* 表示其前面的字符出现任意次数【任意次可以是 0次 1次 无数次】
\{m,n\} 其前面的字符出现最少m次,最多n次
\{3,7\} 表示其前面的字符出现最少3次,最多7次
\{3,\} 表示其前面的字符出现最少3次
\{,7\} 表示其前面的字符出现最多7次
\{3,3\} 表示其前面的字符出现3次
? 表其前面的字符出现0次或者1次[最多一次] - 扩展正则的选项
+ 表其前面的字符出现最少一次 - 扩展正则的选项
举例子:过滤去文件a.txt中,a前面至少有3个b的行
grep "b\{3,\}\a" 1.txt
1.5 分组
\( 定位分组的位置 \)
\1 引用第一个分组的内容
\2 引用第二个分组的内容
例:匹配出现2个相同数字的行
grep "\[(0-9)\].*\1" 2.txt
二、grep
文本过滤工具
在grep的时候,是针对每一次进行一次过滤,判断这行是否有满足条件的内容,如果有显示这行;否则不显示
格式:
grep [选项] "匹配的内容"
cat 目标文件 | grep [选项] "匹配的内容"
选项:
-v :取反
-o :显示匹配内容
三、 sed
sed 在处理文本的时候,会将文本加载到内存中,然后对内存中的文件副本将行处理【也就是文本的原始内容不受影响】
格式:
sed [选项] 操作 目标文件
选项:
-i :修改原始文件【如果不加-i,那就是仅仅修改内存中文件副本】
例1:将new.txt中的name=tom修改成jerry
sed -i "s/name=tom/name=jerry/g" new.txt
例2:将new.txt中的 / 修改成@
sed -i "s#/#@#g" new.txt
四、 awk
截取文件中每行的指定的字段
概念:
记录:文件中的每一行都是一条记录
分隔符:分割每一行的符号
字段:一条记录被分隔符分割后的每一块都是一个字段
格式:
awk -F "分隔符" '{print $数字}' 文件名
cat 文件名 | awk -F "分隔符" '{print $数字}'
补充
0 输出整条记录信息
NF 输出最后一个字段
例1:截取第三列
[root@localhost ~]# cat a.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@localhost ~]# cat a.txt | awk -F "\" '{print $3}'binsbinsbinadm:spool
例2: 截取ip地址
[root@localhost ~]# ip addr s ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group
default qlen 1000
link/ether 00:0c:29:6d:1e:f3 brd ff:ff:ff:ff:ff:ff
inet 172.16.100.2/16 brd 172.16.255.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet6 fe80::ed73:f15a:c37:265d/64 scope link noprefixroute
valid_lft forever preferred_lft forever
1、ip addr s ens33 | grep "scope global" | awk -F " " '{print $2}' |awk -F "/" '{print $1}'
2、 ip addr s ens33 | awk -F " " '/scope global/{print $2}' | awk -F "/" '{print $1}'
3、 ip addr s ens33 | awk -F "[/ ] +" 'scope global /{print $3}'