linux三剑客之 —— grep命令详解,超详细!



- Linux上下文处理三剑客

  • grep:文本过滤(模式、pattern)工具

grep家族成员有:grep、egrep、fgrep

  1. fgrep 该命令不匹配任何正则表达式引擎,所以该命令与其他两个命令相比,其耗费的系统资源更少。
  2. egrep 该命令支持扩展正则表达式引擎
  3. grep 默认使用基本正则表达式引擎去匹配文本
  • sed:stream editor,文本编辑工具
  • awk:Linux上的实现gawk,文本报告生成器

- grep命令的基本介绍

  • grep的全名:Global search Regular expression and print out the line.
  • 作用:文本搜索工具,根据用户指定的“模式”对目标文本逐行进行匹配检查:打印匹配到的行
  • 模式:由正则表达式字符及文本字符所编写的过滤条件
  • REGEXP:由一类特殊字符及文本字符所编写的模式,其中有些字符不表示字符字面意义,而表示控制或通配的功能
  • 正则表达式的分类:
    • 基本正则表达式,BRE
    • 扩展正则表达式,ERE

grep -E 基本等同于 egrep


- 正则表达式引擎:

  • grep命令的基本格式:

grep [OPTIONS] PATTERN [FILE…]

  • grep命令的参数选项:
  1. –color=auto 给匹配到的字符串作色

  2. -v:显示不能够被pattern匹配到的行

  3. -E:使用扩展正则表达式,使用ERE

  4. -G:使用基本正则表达式

  5. -F:基本字符串

  6. -P:perl 表达式

  7. -i:匹配时忽略字符大小写

[xiao@dayuanshuai ~]$ grep -i RoOT /etc/passwd  #不区分大小写,所以匹配到root
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
  1. -o:仅显示匹配到的字符本身

  2. -q:静默模式,检查匹配后,不向屏幕输出任何信息

  3. -A # : after,显示匹配到的行,及其行后多行。

[xiao@dayuanshuai ~]$ grep -A 2 root /etc/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
--
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
  1. -B #:before,显示匹配到的行,及其行前多行
[xiao@dayuanshuai ~]$ grep -B 2 root /etc/passwd
root:x:0:0:root:/root:/bin/bash
--
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
  1. -C #:context,显示匹配到的行,及其前后多行
[xiao@dayuanshuai ~]$ grep -C 2 root /etc/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
--
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin

- 基本正则表达式元字符:

  • 字符匹配
    • . :匹配任意单个字符
    • []: 匹配指定范围内的任意单个字符
    • [^]:匹配指定范围外的任意单个字符
      • [:digit:] 匹配数字
      • [:lower:] 匹配小写字母
      • [:upper:] 匹配大写字母
      • [:alpha:] 匹配字母
      • [:alnum:] 匹配字母和数字
      • [:punct:] 匹配任何标点符号
      • [:space:] 匹配空白字符
  • 匹配次数:用在要指定次数的字符后面,用于指定前面的字符要出现的次数
    • *:匹配前面的字符任意次
[xiao@dayuanshuai ~]$ cat b.txt #查看b.txt的内容
abxy
xay
xxxxxxxy
[xiao@dayuanshuai ~]$ grep "x*y" b.txt #查看匹配结果
abxy
xay
xxxxxxxy
  • 贪婪模式
    • grep 匹配文本时默认处于贪婪模式,即近可能在符合条件的情况下匹配最多的字符串
[xiao@dayuanshuai ~]$ cat grep_big.txt 
more more more
more
[xiao@dayuanshuai ~]$ grep --color "m.*e" grep_big.txt   #grep按照最大长度进行匹配
more more more
more
  • .*:任意长度任意字符
  • ?:匹配其前面的字符0或1:即前面的字符可有可无
[xiao@dayuanshuai ~]$ cat b.txt 
abxy
xay
xxxxxxxy
[xiao@dayuanshuai ~]$ grep --color "x\?y" b.txt 
abxy
xay
xxxxxxxy
  • \+:匹配其前面的字符至少1次
[xiao@dayuanshuai ~]$ cat b.txt 
abxy
xay
xxxxxxxy
[xiao@dayuanshuai ~]$ grep --color "x\+y" b.txt 
abxy
xxxxxxxy
  • \{m\} : 匹配前面的字符m次
[xiao@dayuanshuai ~]$ grep "[[:alpha:]]\{3\}t" /etc/passwd
root:x:0:0:root:/root:/bin/bash
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
operator:x:11:0:operator:/root:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
saslauth:x:499:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
  • \{m,n\}:匹配前面的字符至少m次,至多n次
[xiao@dayuanshuai ~]$ grep --color "[[:alpha:]]\{1,3\}t" /etc/passwd #匹配前面的字母最少一次,最多三次
root:x:0:0:root:/root:/bin/bash
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
saslauth:x:499:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
  • {0,n}:匹配前面的字符至多n次
[xiao@dayuanshuai ~]$ grep --color "[[:alpha:]]\{0,3\}dy" /etc/passwd  #在dy前匹配字母最多三次
nobody:x:99:99:Nobody:/:/sbin/nologin
  • {m,}:匹配前面的字符至少m次
[xiao@dayuanshuai ~]$ grep --color "[[:alpha:]]\{4,\}y" /etc/passwd  #匹配y前面的字母最少4次    
nobody:x:99:99:Nobody:/:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
saslauth:x:499:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

- 位置锚定

  • ^ : 行首锚定:用于模式的最左侧
[xiao@dayuanshuai ~]$ grep "^s" /etc/passwd  #在/etc/passwd中查找开头以s开头的行
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
saslauth:x:499:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
  • $:行尾锚定:用于模式的最右侧
[xiao@dayuanshuai ~]$ grep "c$" /etc/passwd  #在/etc/passwd中查找以c结尾的行
sync:x:5:0:sync:/sbin:/bin/sync
  • ^PATTERN$: 用于模式匹配整行
[xiao@dayuanshuai ~]$ cat b.txt 
abxy
aaabxy
xay
xayyy
xayss
xxxxxxxy
xxxxxxxysss
[xiao@dayuanshuai ~]$ grep "^xay$" b.txt  在b.txt 中查找有一行是xay的行
xay

^$: 空行

^[[:space:]]*$

  • \< 或 \b:词首锚定:用于单词模式的左侧
[xiao@dayuanshuai ~]$ grep '\<[[:alpha:]]\{1,3\}t' /etc/passwd #匹配词首为1个到3个字母开头后接t的行
root:x:0:0:root:/root:/bin/bash
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
saslauth:x:499:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
  • \> 或 \b:词尾锚定:用于单词模式的右侧
[xiao@dayuanshuai ~]$ grep '[[:alpha:]]\{1,3\}t\>' /etc/passwd   # 匹配以t结尾前面有一到三个字母的单词
root:x:0:0:root:/root:/bin/bash
halt:x:7:0:halt:/sbin:/sbin/halt
operator:x:11:0:operator:/root:/sbin/nologin
  • \<PATTERN\> : 匹配整个单词:
[xiao@dayuanshuai ~]$ grep '\<[[:alpha:]]\{1,3\}t\>' /etc/passwd  
root:x:0:0:root:/root:/bin/bash
halt:x:7:0:halt:/sbin:/sbin/halt
operator:x:11:0:operator:/root:/sbin/nologin

-分组:

  • \(\) : 将一个或多个字符捆绑在一起,当作一个整体进行处理
[xiao@dayuanshuai ~]$ grep --color "\(xy\)\+" b.txt 
abxy
aaabxy
xxxxxxxy
xxxxxxxysss
[xiao@dayuanshuai ~]$ grep --color "\(xy\)*s" b.txt   
xayss
xxxxxxxysss
  • Note: 分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为: \1, \2, \3, …
    • \1: 从左侧起,第一个左括号以及与之匹配右括号之间的模式所匹配到的字符
    • 例子: \(ab\+\(xy\)*\)
      • \1:ab\+\(xy\)*
      • \2:xy
  • 后向引用:引用前面分组括号中的模式所匹配字符,(而非模式本身)
[xiao@dayuanshuai ~]$ grep --color "\(xy\)*.*\1" b.txt 
xyaaabxy
xyxxxxxxy

- 习题:

  1. 显示/proc/meminfo文件中以大小s开头的行;(要求:使用两种方式)
[xiao@dayuanshuai ~]$  grep -i  "^s" /proc/meminfo
SwapCached:            0 kB
SwapTotal:       3145724 kB
SwapFree:        3145724 kB
Shmem:               228 kB
Slab:             150788 kB
SReclaimable:      87644 kB
SUnreclaim:        63144 kB
[xiao@dayuanshuai ~]$ grep '^[sS]' /proc/meminfo   
SwapCached:            0 kB
SwapTotal:       3145724 kB
SwapFree:        3145724 kB
Shmem:               228 kB
Slab:             150780 kB
SReclaimable:      87640 kB
SUnreclaim:        63140 kB
  1. 显示/etc/passwd文件中不以/bin/bash结尾的行
[xiao@dayuanshuai ~]$ grep -v '/bin/bash$' /etc/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
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
saslauth:x:499:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
dhcpd:x:177:177:DHCP server:/:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
  1. 显示/etc/passwd文件中ID号最大的用户的用户名
[xiao@dayuanshuai ~]$ sort -t: -k3 -n /etc/passwd |tail -1 |cut -d: -f1
xiao
  1. 如果用户root存在,显示其默认的shell程序
[xiao@dayuanshuai ~]$ id root &> /dev/null && grep "^root\>" /etc/passwd | cut -d: -f7 
/bin/bash
  1. 找出/etc/passwd中的两位或三位数
[xiao@dayuanshuai ~]$ grep -o '\<[0-9]\{2,3\}\>' /etc/passwd  
12
10
14
11
12
100
13
30
14
50
99
99
...
  1. 显示/etc/grub.conf 文件中,至少以一个空白字符开头的且后面存在非空白字符的行
[root@dayuanshuai ~]# grep "^[[:space:]]\+[^[:space:]]" /etc/grub.conf 
        root (hd0,0)
        kernel /vmlinuz-2.6.32-754.el6.x86_64 ro root=UUID=7babbd31-9dc4-48a4-a532-9c3c5239d36e rd_NO_LUKS  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD crashkernel=auto LANG=zh_CN.UTF-8 rd_NO_LVM rd_NO_DM rhgb quiet
        initrd /initramfs-2.6.32-754.el6.x86_64.img
  1. 找出"netstat -tan"命令的结果中以’LISTEN’后跟0、1或多个空白字符结尾的行
[root@dayuanshuai ~]# netstat -tan | grep "LISTEN[[:space:]]\{0,\}$"  
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      
tcp        0      0 :::22                       :::*                        LISTEN      
tcp        0      0 ::1:25                      :::*                        LISTEN   
[root@dayuanshuai ~]# netstat -tan | grep "LISTEN[[:space:]]*$" 
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      
tcp        0      0 :::22                       :::*                        LISTEN      
tcp        0      0 ::1:25                      :::*                        LISTEN   
  1. 添加用户bash、testbash、basher以及nologin(其shell为/sbin/nologin);而后找出/etc/passwd文件中用户名同shell名的行
[root@dayuanshuai ~]# grep "^\([[:alnum:]]\+\>\).*\1$" /etc/passwd     
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
  1. 写一个脚本,实现如下功能
  • 如果user1用户存在,就显示其存在,否则添加之
  • 显示添加的用户的id号等信息
#!/bin/bash
id user1 &>/dev/null && echo "user1 exists." || useradd user1
id user1

10.写一个脚本,完成如下功能

  • 如果root用户登录了当前系统,就显示root用户在线;否则说明其未登录
[root@dayuanshuai ~]# w | grep "root\>" &>/dev/null && echo "root logged" || echo "root not logged"
root logged



- 写在最后的话:

  • 无论每个知识点的难易程度如何,我都会尽力将它描绘得足够细致
  • 欢迎关注我的CSDN博客,IDYS’BLOG
  • 持续更新内容运维 | 网工 | 软件技巧
  • 如果你有什么疑问,或者是难题。欢迎评论或者私信我。你若留言,我必回复!
  • 虽然我现在还很渺小,但我会做好每一篇内容。谢谢关注!

发布了5 篇原创文章 · 获赞 1 · 访问量 374

猜你喜欢

转载自blog.csdn.net/weixin_41633902/article/details/105692317