grep命令与正则表达式

三:grep与正则表达式

3.1 grep

grep是Linux中常用的文件搜索命令,用于在文件或命令输出中查找匹配指定模式的行。

  • 常用选项:
选项 说明
-i 忽略大小写
-E 支持扩展正则表达式
-v 反向匹配,排除不想要的行
-n 显示行号
-c 显示匹配的行号
-o 只显示匹配的部分
-C n 显示匹配行的前后各几行
-r 递归搜索目录
-A n 显示匹配行的后几行
-B n 显示匹配行的前几行
  • 实例

准备环境:

root@studry:~# cp -rp /etc/passwd backup/config/
root@studry:~# cd backup/config/
root@studry:~/backup/config# pwd
/root/backup/config

忽略大小写,搜索root匹配的行:

root@studry:~/backup/config# grep -i "root" passwd 
root:x:0:0:Super User:/root:/bin/bash
operator:x:11:0:operator:/root:/usr/sbin/nologin
ROOT:x:1001:1001:ROOT:/home/ROOT:/bin/bash

显示行号,排故障看所在的位置:

root@studry:~/backup/config# grep -i -n "root" passwd 
1:root:x:0:0:Super User:/root:/bin/bash
10:operator:x:11:0:operator:/root:/usr/sbin/nologin
47:ROOT:x:1001:1001:ROOT:/home/ROOT:/bin/bash

反向匹配(排除root所在的行)

root@studry:~/backup/config# grep -v "root" passwd
bin:x:1:1:bin:/bin:/usr/sbin/nologin
daemon:x:2:2:daemon:/sbin:/usr/sbin/nologin
adm:x:3:4:adm:/var/adm:/usr/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/usr/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:/usr/sbin/nologin
games:x:12:100:games:/usr/games:/usr/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/usr/sbin/nologin

匹配行数,快速知道有多少条:

root@studry:~/backup/config# grep -c -i "root" passwd
3

只显示匹配的部分(提取关键信息)

root@studry:~/backup/config# grep -o "root" passwd
root
root
root

显示匹配的行及前后各2行:

root@studry:~/backup/config# grep -C 2 "root" passwd
root:x:0:0:Super User:/root:/bin/bash
bin:x:1:1:bin:/bin:/usr/sbin/nologin
daemon:x:2:2:daemon:/sbin:/usr/sbin/nologin
--
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/usr/sbin/nologin
operator:x:11:0:operator:/root:/usr/sbin/nologin
games:x:12:100:games:/usr/games:/usr/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/usr/sbin/nologin

显示匹配的行和后1行:

root@studry:~/backup/config# grep -A 1 "root" passwd
root:x:0:0:Super User:/root:/bin/bash
bin:x:1:1:bin:/bin:/usr/sbin/nologin
--
operator:x:11:0:operator:/root:/usr/sbin/nologin
games:x:12:100:games:/usr/games:/usr/sbin/nologin

显示匹配的行和前1行:

root@studry:~/backup/config# grep -B 1 "root" passwd
root:x:0:0:Super User:/root:/bin/bash
--
mail:x:8:12:mail:/var/spool/mail:/usr/sbin/nologin
operator:x:11:0:operator:/root:/usr/sbin/nologin

3.2 正则表达式

正则表达式式一套匹配文本的规则,用特定的符合描写所要查找什么样的内容。

3.2.1 基础元字符

元字符 含义 示例
. 匹配任意单个字符 r..t匹配root、roOt、r!@t
^ 匹配行首 ^root匹配行首以root开头
$ 匹配行尾 root$匹配行尾以root结尾
[] 匹配括号内任意一个字符 [0..9]匹配任意数字
[^] 不匹配括号内任意一个字符 [0..9]:不匹配数字。**[0..9a..zA..Z]**:不匹配任何字符,匹配其他字符
\ 特殊字符转换成普通字符 \. 匹配点号本身
  • 例子:

匹配任意一个字符:

root@studry:~/backup/config# grep 'r..t' passwd 
root:x:0:0:Super User:/root:/bin/bash
operator:x:11:0:operator:/root:/usr/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/usr/sbin/nologin
clevis:x:997:996:Clevis Decryption Framework unprivileged user:/var/cache/clevis:/usr/sbin/nologin

匹配行首:

root@studry:~/backup/config# grep "^root" passwd
root:x:0:0:Super User:/root:/bin/bash

匹配行尾:

root@studry:~/backup/config# grep "bash$" passwd
root:x:0:0:Super User:/root:/bin/bash
wmn:x:1000:1000:wmn:/home/wmn:/bin/bash
user01:x:1001:1001::/home/user01:/bin/bash
ruoyi-admin:x:1002:1002::/home/ruoyi-admin:/bin/bash
ruoyi-dba:x:1003:1003::/home/ruoyi-dba:/bin/bash
ruoyi-dev:x:1004:1004::/home/ruoyi-dev:/bin/bash
tianyun:x:1005:1010::/home/tianyun:/bin/bash
jinghui:x:1006:1011::/home/jinghui:/bin/bash
ruoyi:x:1007:1012::/home/ruoyi:/bin/bash
tianyun:x:1000:1000:tianyun:/home/tianyun:/bin/bash
ROOT:x:1001:1001:ROOT:/home/ROOT:/bin/bash

匹配字符集合:

root@studry:~/backup/config# grep 'ro[oO]t' passwd   #匹配root ro0t
root:x:0:0:Super User:/root:/bin/bash
operator:x:11:0:operator:/root:/usr/sbin/nologin

3.2.2 量词

量词 含义 扩展正则写法
* 前导字符出现0次或多次 *
\+ 前导字符出现1次或多次 +
? 前导字符出现0次或1次 ?
前导字符出现n次
前导字符至少出现n次
前导字符出现n到m次
  • 例子:

*前导字符出现至少0次:

root@studry:~/backup/config# grep "ro*t" passwd
root:x:0:0:Super User:/root:/bin/bash
operator:x:11:0:operator:/root:/usr/sbin/nologin
rtkit:x:172:172:RealtimeKit:/:/sbin/nologin

+前导字符出现至少1次:

1)方式一:
root@studry:~/backup/config# grep "ro\+t" passwd
root:x:0:0:Super User:/root:/bin/bash
operator:x:11:0:operator:/root:/usr/sbin/nologin
2)方式二:
root@studry:~/backup/config# grep -E "ro+t" passwd    #ro出现一次 roo出现两次
root:x:0:0:Super User:/root:/bin/bash
operator:x:11:0:operator:/root:/usr/sbin/nologin 

{}:精确匹配次数:

root@studry:~/backup/config# egrep "ro{1,3}" passwd
root:x:0:0:Super User:/root:/bin/bash
operator:x:11:0:operator:/root:/usr/sbin/nologin
setroubleshoot:x:988:987:SELinux troubleshoot server:/var/lib/setroubleshoot:/usr/sbin/nologin
chrony:x:985:984:chrony system user:/var/lib/chrony:/sbin/nologin

3.2.3 扩展正则特有

元字符 含义 示例
| 或 wmn|faz
() 分组,把多个字符当成一体 (ab)+
\b 单词边界 \broot\b
  • 例子:

或:

root@studry:~/backup/config# grep -E "root|wmn" passwd
root:x:0:0:Super User:/root:/bin/bash
operator:x:11:0:operator:/root:/usr/sbin/nologin
wmn:x:1000:1000:wmn:/home/wmn:/bin/bash

()分组:

root@studry:~/backup/config# grep -E "r(oo)+t" passwd
root:x:0:0:Super User:/root:/bin/bash
operator:x:11:0:operator:/root:/usr/sbin/nologin
#说明:
把oo当做一个整体,oo出现一次或多次

\b单词边界,精确匹配

root@studry:~/backup/config# grep -E "\broot\b" passwd 
root:x:0:0:Super User:/root:/bin/bash
operator:x:11:0:operator:/root:/usr/sbin/nologin

root@studry:~/backup/config# grep -E "\broot" passwd 
root:x:0:0:Super User:/root:/bin/bash
operator:x:11:0:operator:/root:/usr/sbin/nologin
root123:x:1001:1001:root123:/home/root123:/bin/bash

root@studry:~/backup/config# grep -E "\bro" passwd 
root:x:0:0:Super User:/root:/bin/bash
operator:x:11:0:operator:/root:/usr/sbin/nologin
root123:x:1001:1001:root123:/home/root123:/bin/bash

3.2.4正则表达式实战

查看nginx有效配置(排除#开头的注释行和空行):

root@studry:~/backup/config# grep -E -v  "^#|^$" /etc/nginx/nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
    worker_connections 1024;
}
http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /var/log/nginx/access.log  main;
    sendfile            on;
    tcp_nopush          on;
    keepalive_timeout   65;
    types_hash_max_size 4096;
    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;
    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;
    server {
        listen       80;
        listen       [::]:80;
        server_name  _;
        root         /usr/share/nginx/html;
        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;
    }
}

查看nginx有效配置,排除注释行及空行:

root@studry:~/backup/config# grep -E -v  "^#|^$|^ *#" /etc/nginx/nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
    worker_connections 1024;
}
http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /var/log/nginx/access.log  main;
    sendfile            on;
    tcp_nopush          on;
    keepalive_timeout   65;
    types_hash_max_size 4096;
    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;
    include /etc/nginx/conf.d/*.conf;
    server {
        listen       80;
        listen       [::]:80;
        server_name  _;
        root         /usr/share/nginx/html;
        include /etc/nginx/default.d/*.conf;
    }
}

查看ssh有效的配置:

root@studry:~/backup/config# grep -Ev "^$|^#" /etc/ssh/sshd_config
Include /etc/ssh/sshd_config.d/*.conf
AuthorizedKeysFile      .ssh/authorized_keys
Subsystem       sftp    /usr/libexec/openssh/sftp-server

匹配nginx日志的IP地址:

root@studry:~/backup/config# grep -E "\b([0-9]{1,3}\.{1,3}){3}[0-9]{1,3}\b" /var/log/nginx/access.log

image-20260911174402106

查看本机的IP:

root@studry:~/backup/config# ip a |grep -E "\b([0-9]{1,3}\.{1,3}){1,3}[0-9]{1,3}\b"
    inet 127.0.0.1/8 scope host lo
    inet 10.0.0.140/24 brd 10.0.0.255 scope global dynamic noprefixroute ens160

查看日志中的状态码:

1)查看500的状态码:
root@studry:~/backup/config# grep "500" /var/log/nginx/access.log 
2)统计各种状态码出现的次数:
root@studry:~/backup/config# grep -Eo " [0-9]{3} " /var/log/nginx/access.log |sort |uniq -c
      3  200 
      4  304 
      1  404 

posted on 2026-09-12 17:18  wangmengnan  阅读(17)  评论(0)    收藏  举报

导航