Bootstrap

Linux 三剑客 (grep、sed、awk)

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}'
bin
sbin
sbin
adm:
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}'

;