三剑客在Linux中功能强大,下面所说的是Linux中最重要的三个命令在业界被称为“三剑客”,它们分别是awk,sed,grep。三剑客是(grep,sed,awk)三者的简称,熟练使用这三个工具可以提升运维效率。Linux 三剑客以正则表达式作为基础,而在Linux系统中,支持两种正则表达式,分别为“标准正则表达式”和“扩展正则表达式”。在这里将介绍三剑客命令的用法。
我们知道Linux下一切皆文件,对Linux的操作就是对文件的处理,三剑客命令可以帮助我们更好的处理文件。
三剑客的功能非常强大,但我们只需要掌握他们分别擅长的领域即可:grep擅长查找功能,sed擅长取行和替换。awk擅长取列。
因为涉及到正则表达式,所以我们首先介绍元字符,便于大家更好地理解使用。
元字符 | 功能 | 意思 |
^ | 匹配行首 | 表示以某个字符开头 |
$ | 匹配行尾 | 表示以某个字符结尾 |
^$ | 空行的意思 | 表示空行的意思 |
. | 匹配任意单个字符 | 表示任意一个字符 |
***** | 字符* 匹配0或多个此字符 | 表示重复的任意多个字符 |
** | 屏蔽一个元字符的特殊含义 | 表示去掉有意义的元字符的含义 |
[] | 匹配中括号内的字符 | 表示过滤括号内的字符 |
.* | 代表任意多个字符 | 就是代表任意多个字符 |
lele{n} | 用来匹配前面lele出现次数。n为次数 | 就是统计前面lele出现的次数 |
lele{n,} | 含义同上,但次数最少为n | 从功能就可以看出 |
lele{n,m} | 义同上,但lele出现次数在n与m之间 | 从功能也可以看出 |
lele{n,m} | 义同上,但lele出现次数在n与m之间 | 从功能也可以看出 |
awk #三剑客之老大,擅长取列。
#取列,计算,统计,数组,循环,判断
-F #指定分割符,默认是以空白字符为分隔符
NR #表示行号
NF #表示每一行的列数
$NF #表示最后一列
$0 #整行内容
$n #n是数字 表示取出哪一列
&& #并且
|| #或者
! #排除
’ #取出连续的
; #多条命令分割
#取行
[root@lxy ~]# awk 'NR==1' passwd #取出第一行
root:x:0:0:root:/root:/bin/bash
[root@lxy ~]# awk 'NR==1,NR==3' passwd #取出第一行到第三行
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@lxy ~]# awk 'NR==1;NR==3' passwd #取出第一行和第三行
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@lxy ~]# awk 'NR>10' passwd #取出大于10行的所有行的的内容
root
[root@lxy ~]# awk 'NR<2' passwd #取出小于两行的内容
root:x:0:0:root:/root:/bin/bash
[root@lxy ~]# awk 'NR<=2' passwd #小于等于
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
[root@lxy ~]# awk 'NR>=10' passwd #大于等于
operator:x:11:0:operator:/root:/sbin/nologin
root
[root@lxy ~]# awk 'NR>=1 && NR<=10' passwd #取出大于等于第一行并且小于等于第十行 && 并且
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
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
[root@lxy ~]# awk 'NR>0 && NR<11' passwd #取出大于等于第一行并且小于等于第十行 && 并且
[root@lxy ~]# awk 'NR<2 || NR>10' passwd #取出小于2行或者大于10行 || 或者
root:x:0:0:root:/root:/bin/bash
root
[root@lxy ~]# awk '{print NR,$0}' passwd #显示行号
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8 halt:x:7:0:halt:/sbin:/sbin/halt
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10 operator:x:11:0:operator:/root:/sbin/nologin
11 root
[root@lxy ~]# awk '/root/' passwd #过滤出root的字符串
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
root
[root@lxy ~]# awk '/^root/' passwd #过滤出以root开头的字符串
root:x:0:0:root:/root:/bin/bash
root
[root@lxy ~]# awk '/root$/' passwd #过滤出以root为结尾的字符串
root
[root@lxy ~]# awk '/root|adm/' passwd #过滤出root或者adm的字符串
root:x:0:0:root:/root:/bin/bash
adm:x:3:4:adm:/var/adm:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
root
[root@lxy ~]# awk '/root/;/adm/' passwd #过滤出root或者adm的字符串
root:x:0:0:root:/root:/bin/bash
adm:x:3:4:adm:/var/adm:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
root
[root@lxy ~]# awk '/adm/,/sync/' passwd #过滤以adm的行到sync的行
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
[root@lxy ~]# awk 'BEGIN{FS=":"}{print $7}' passwd #取出文件的第七列
/bin/bash
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/bin/sync
/sbin/shutdown
/sbin/halt
/sbin/nologin
/sbin/nologin
[root@lxy ~]# awk -F: '{print $7}' passwd #取出文件的第七列
/bin/bash
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/bin/sync
/sbin/shutdown
/sbin/halt
/sbin/nologin
/sbin/nologin
[root@lxy ~]# awk -F '[:]' '{print $7}' passwd
/bin/bash
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/bin/sync
/sbin/shutdown
/sbin/halt
/sbin/nologin
/sbin/nologin
[root@lxy ~]# awk -F: '{print $NF}' passwd #取出文件中的每一行的最后一列
/bin/bash
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/bin/sync
/sbin/shutdown
/sbin/halt
/sbin/nologin
/sbin/nologin
root
[root@lxy ~]# echo 'oldboy:123 oldgirl' >>passwd
[root@lxy ~]# awk '{print $2}' passwd |tail -1
oldgirl
[root@lxy ~]# awk -F: '{print $2}' passwd |tail -1
123 oldgirl
[root@lxy ~]# awk -F '[: ]' '{print $2}' passwd |tail -1 #支持多个分隔符
123
#取出ip地址
[root@lxy ~]# ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.0.0.100 netmask 255.255.255.0 broadcast 10.0.0.255
inet6 fe80::c653:602a:38c6:e45 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:ae:0b:8a txqueuelen 1000 (Ethernet)
RX packets 3515748 bytes 5009905896 (4.6 GiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 382062 bytes 54939915 (52.3 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@lxy ~]# ifconfig eth0 |awk 'NR==2'
inet 10.0.0.100 netmask 255.255.255.0 broadcast 10.0.0.255
[root@lxy ~]# ifconfig eth0 |awk 'NR==2' |awk '{print $2}'
10.0.0.100
[root@lxy ~]# ifconfig eth0 |awk 'NR==2{print $2}'
10.0.0.100
#取出ip地址
[root@lxy ~]# ip a s eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:ae:0b:8a brd ff:ff:ff:ff:ff:ff
inet 10.0.0.100/24 brd 10.0.0.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
inet6 fe80::c653:602a:38c6:e45/64 scope link noprefixroute
valid_lft forever preferred_lft forever
[root@lxy ~]# ip a s eth0 | awk 'NR==3' | awk -F '[ /]*' '{print $2}'
inet
[root@lxy ~]# ip a s eth0 | awk 'NR==3' | awk -F '[ /]*' '{print $3}'
10.0.0.100
[root@lxy ~]# ip a s eth0 | awk 'NR==3' | awk -F '[ /]' '{print $6}'
10.0.0.100
[root@lxy ~]# awk 'NR!=1' passwd #排除第一列
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
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
root
oldboy:123 oldgirl
[root@lxy ~]# awk '!/root/' passwd #排除包含root的字符串
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
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
oldboy:123 oldgirl
[root@lxy ~]#
[root@lxy ~]# awk -F: '/^root/{print $NF}' passwd #取出满足以root开头的行并且打印出该行的最后一列
/bin/bash
root
[root@lxy ~]# awk -F: '/^root/{print $1,$2}' passwd #打印多列内容
root x
root
[root@lxy ~]# awk -F: '/^root/{print $3,$1}' passwd #把第三列和第一列倒着显示
0 root
root
sed #三剑客老二,擅长增删改查,取行和替换。
-n #取消默认输出
-i #真实的替换文件内容
-r #支持扩展正则
内部命令:
p #打印
d #删除
s #替换
g #全局
a #追加
i #插入
; #多条命令的分割
, #表示连续的命令
1.查
[root@lxy ~]# sed -n '1p' passwd #打印单行
root:x:0:0:root:/root:/bin/bash
[root@lxy ~]# sed -n '1,3p' passwd #打印连续的多行
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@lxy ~]# sed -n '1p;3p' passwd #打印不连续的多行
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@lxy ~]# sed -n '$p' passwd #打印最后一行
ntp:x:38:38::/etc/ntp:/sbin/nologin
[root@lxy ~]# sed -n '/root/p' passwd #过滤包含root的行
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@lxy ~]# sed -n '/^root/p' passwd #过滤以root开头的行
root:x:0:0:root:/root:/bin/bash
[root@lxy ~]# sed -nr '/root|adm/p' passwd #过滤root或者adm的行
root:x:0:0:root:/root:/bin/bash
adm:x:3:4:adm:/var/adm:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
[root@lxy ~]# sed -n '/root/p;/adm/p' passwd #过滤root或者adm的行
root:x:0:0:root:/root:/bin/bash
adm:x:3:4:adm:/var/adm:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
[root@lxy ~]# sed -n '/^root/,/adm/p' passwd #过滤以root开头的行到adm的行
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
2.删除
[root@lxy ~]# sed '1d' passwd #删除第一行
[root@lxy ~]# sed '$d' passwd #删除最后一行
[root@lxy ~]# sed '1,20d' passwd #删除连续的多行
[root@lxy ~]# sed '1d;20d' passwd #删除不连续的多行
[root@lxy ~]# sed '/root/d' passwd #删除包含root的行
[root@lxy ~]# sed -r '/root|adm/d' passwd #删除不连续的多行
[root@lxy ~]# sed '/root/d;/adm/d' passwd #删除不连续的多行
[root@lxy ~]# sed '/^root/,/adm/d' passwd #删除以root开头的行到包含adm的行
[root@lxy ~]# sed '1,$d' passwd #删除所有
3.增
[root@lxy ~]# sed '$aoldboy' sort.log #在文件的最后一行追加oldboy
abc/1
abd/11
fgrf/2
fger/8
rgrgh/66
fger/8
abd/11
fgrf/2
oldboy
[root@lxy ~]# sed '1aoldboy' sort.log #在文件的第一行后面追加oldboy
abc/1
oldboy
abd/11
fgrf/2
fger/8
rgrgh/66
fger/8
abd/11
fgrf/2
[root@lxy ~]# sed '1ioldboy' sort.log #在第一行的前面插入oldboy
oldboy
abc/1
abd/11
fgrf/2
fger/8
rgrgh/66
fger/8
abd/11
fgrf/2
[root@lxy ~]# sed '$ioldboy' sort.log #在最后一行前面插入oldboy
abc/1
abd/11
fgrf/2
fger/8
rgrgh/66
fger/8
abd/11
oldboy
fgrf/2
[root@lxy ~]# sed '1ioldboy\noldgirl' sort.log #插入多行
oldboy
oldgirl
abc/1
abd/11
fgrf/2
fger/8
rgrgh/66
fger/8
abd/11
fgrf/2
[root@lxy ~]# sed '$aoldboy\noldgirl' sort.log #追加多行
abc/1
abd/11
fgrf/2
fger/8
rgrgh/66
fger/8
abd/11
fgrf/2
oldboy
oldgirl
4.替换
[root@lxy ~]# cat passwd
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
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
[root@lxy ~]# sed 's#root#oldboy#g' passwd #把所有的root替换为oldboy 全局替换
oldboy:x:0:0:oldboy:/oldboy:/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
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/oldboy:/sbin/nologin
[root@lxy ~]# sed 's#root#oldboy#' passwd #替换每一行第一个匹配条件的
oldboy: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
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/oldboy:/sbin/nologin
[root@lxy ~]# sed '10s#root#oldboy#g' passwd #针对行进行替换
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
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/oldboy:/sbin/nologin
[root@lxy ~]# sed '10,11s#root#oldboy#g' passwd #操作多行替换
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
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/oldboy:/sbin/nologin
oldboy
[root@lxy ~]# sed '$s#root#oldboy#g' passwd #替换最后一行
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
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
oldboy
[root@lxy ~]# sed '/^root/s#root#oldboy#g' passwd #替换以root开头的行中root替换为oldboy
oldboy:x:0:0:oldboy:/oldboy:/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
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
oldboy
[root@lxy ~]# sed '/t$/s#root#oldboy#g' passwd #匹配以t为结尾的进行替换
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
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
oldboy
grep #三剑客之老三,grep擅长查找功能。
#文本过滤,给过滤出来的内容加上颜色
选项:
-v #排除,取反
-i #忽略大小写
-n #给过滤出来的内容加上所在文件的行号
-c #统计过虑出来的行数
-o #只显示匹配的内容
-w #精确匹配
-E #支持扩展正则
-r #递归过滤
-R #递归过滤
-A #匹配内容向下多少行
-B #匹配内容向上多少行
-C #匹配内容向上向下各多少行
^ #以什么开头
$ #以什么为结尾
^$ #空行
. #任意一个字符,换行符除外
.* #所有
\ #取消特殊符号的含义
| #扩展正则,或者
[root@lxy ~]# cp /etc/passwd ./
[root@lxy ~]# grep 'root' passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@lxy ~]# grep '/sbin/nologin' passwd
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
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
www:x:666:666::/home/www:/sbin/nologin
nginx:x:665:665:nginx user:/var/cache/nginx:/sbin/nologin
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
mysql:x:27:27:MariaDB Server:/var/lib/mysql:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
[root@lxy ~]# grep -v '/sbin/nologin' passwd #-v 排除
root:x:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
test:x:1000:1000::/home/test:/bin/bash
[root@lxy ~]# grep -i 'root' passwd #忽略大小写
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
ROOT
[root@lxy ~]# grep -n 'root' passwd #显示该行内容在文件的所在行号
1:root:x:0:0:root:/root:/bin/bash
10:operator:x:11:0:operator:/root:/sbin/nologin
[root@lxy ~]# grep -c 'root' passwd #统计匹配root字符串的行数
2
[root@lxy ~]# grep -o 'root' passwd #只显示匹配的内容
root
root
root
root
[root@lxy ~]# grep -o 'root' passwd | grep -c 'root' #统计匹配的root的次数
4
[root@lxy ~]# echo -e 'roott\nrootooo' >>passwd
[root@lxy ~]# grep 'root' passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
roott
rootooo
[root@lxy ~]# grep -w 'root' passwd #精确匹配root
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@lxy ~]# mkdir data
[root@lxy ~]# mkdir test
[root@lxy ~]# echo 'root' >>data/test.txt
[root@lxy ~]# echo 'root' >>test/data.txt
[root@lxy ~]# ll
total 680
drwxr-xr-x. 2 root root 22 Dec 3 18:04 data
-rw-r--r--. 1 root root 4 Dec 2 20:19 file.log
-rw-r--r--. 1 root root 27 Dec 2 19:31 file.txt
-rw-r--r--. 1 root root 158 Dec 2 19:26 hosts
-rw-r--r--. 1 root root 1100 Dec 3 18:01 passwd
-rw-r--r--. 1 root root 670293 Dec 2 19:36 services
drwxr-xr-x. 2 root root 22 Dec 3 18:04 test
-rw-r--r--. 1 root root 178 Dec 2 20:14 test.log
-rw-r--r--. 1 root root 16 Dec 2 19:23 test.txt
[root@lxy ~]# grep 'root' ./*
grep: ./data: Is a directory
./passwd:root:x:0:0:root:/root:/bin/bash
./passwd:operator:x:11:0:operator:/root:/sbin/nologin
./passwd:roott
./passwd:rootooo
./services:rootd 1094/tcp # ROOTD
./services:rootd 1094/udp # ROOTD
grep: ./test: Is a directory
[root@lxy ~]# grep -r 'root' ./* #递归过滤
./data/test.txt:root
./passwd:root:x:0:0:root:/root:/bin/bash
./passwd:operator:x:11:0:operator:/root:/sbin/nologin
./passwd:roott
./passwd:rootooo
./services:rootd 1094/tcp # ROOTD
./services:rootd 1094/udp # ROOTD
./test/data.txt:root
[root@lxy ~]# grep -R 'root' ./* #递归过滤
./data/test.txt:root
./passwd:root:x:0:0:root:/root:/bin/bash
./passwd:operator:x:11:0:operator:/root:/sbin/nologin
./passwd:roott
./passwd:rootooo
./services:rootd 1094/tcp # ROOTD
./services:rootd 1094/udp # ROOTD
./test/data.txt:root
[root@lxy ~]# grep 'root|adm' passwd
[root@lxy ~]# egrep 'root|adm' passwd
root:x:0:0:root:/root:/bin/bash
adm:x:3:4:adm:/var/adm:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
roott
rootooo
[root@lxy ~]# grep -E 'root|adm' passwd #扩展正则 | 表示或者 -E 支持扩展正则
root:x:0:0:root:/root:/bin/bash
adm:x:3:4:adm:/var/adm:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
roott
rootooo
[root@lxy ~]# grep 'adm' passwd
adm:x:3:4:adm:/var/adm:/sbin/nologin
[root@lxy ~]# grep -A2 'adm' passwd #匹配内容的行及向下两行
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
[root@lxy ~]# grep -B2 'adm' passwd #匹配内容的行及向上两行
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
[root@lxy ~]# grep -C2 'adm' passwd #匹配内容的行及向上向下各两行
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
sync:x:5:0:sync:/sbin:/bin/sync
[root@lxy ~]# grep '^root' passwd #匹配以什么开头的行
root:x:0:0:root:/root:/bin/bash
roott
rootooo
[root@lxy ~]# grep 't$' passwd #匹配以谁为结尾的行
halt:x:7:0:halt:/sbin:/sbin/halt
roott
ooroot
[root@lxy ~]# grep '.' passwd #匹配换行符以外的任意一个字符
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@lxy ~]# grep '\.$' passwd #取消特殊字符的含义
roottt.
[root@lxy ~]# grep '^$' passwd #表示空行,有空格的和tab键的空行不匹配
[root@lxy ~]# grep '.*' passwd #表示所有,包括空行