grep熟悉和使用

grep 参数总结

参数选项 解释说明
-v 排除匹配结果
-n 显示匹配行与行号
-i 不区分大小写
-c 只统计匹配的行数
-E 扩展正则表达式 ,使用 egrep命令
–color=auto 为grep过滤结果添加颜色
-w 只匹配过滤的单词
-o 只输出匹配内容

linux 自带的通配符

通配符 解释
* 匹配任意0-n个字符
? 匹配任意1 个字符
符号集合 匹配一堆字符或者文本
[abcd] 匹配[abcd]任意一个字符
[!abcd] 或者 [!a-d] 不匹配括号里面的任意一个字符
[^a-d] 同上 ^和 ! 等价
[[:upper:]] 所有大写字母
[[:lower:]] 小写字母
[[:alpha:]] 所有字母
[[:space:]] 所有空白字符
1
2
find ./ -name "[a-z]*"
# 通配符的使用方法

三剑客提供的正则表达式符号

符号 作用
^ 表示开头
$ 表示结尾
^$ 组合符号,表示空行
. 匹配任意一个字符, 对应通配符中的 ?
\ 转义字符,让特殊字符还原本意
* 匹配前一个字符,连续出现 0和1次以上,重复0次代表空,即匹配任意次
.* 组合符,表示匹配所有内容
^.* 组合符号,表示匹配任意多个字符开头的内容
.*$ 组合符号,匹配任意多个字符结尾的内容
[abc] 和通配符的用法一样,表示集合内的任意一个字符
[^abc] 匹配除了 ^后面的任意字符,a或者bc

扩展正则表达式 ERE 集合

字符 作用
+ 匹配前一个字符1次或多次, * 和 + 的区别是,* 包括了 0次
[:/]+ 匹配括号内的 “:”或者 “/” 字符一次或多次
匹配前一个字符 0次胡总1次
| 表示或者,同时过滤多个字符,例如 a|b
() 分组过滤,括起来的是一个整体
a{n,m} 匹配前一个字符最少n次,最多m次
a{n,} 匹配前一个字符最少n次
a{n} 匹配前一个字符正好n次
a{,m} 匹配a最多m次

grep 语法形式

  • grep [option] [pattern ] [file1 ,file2]
  • command | grep [option ] [pattern]

image-20211003200107627

  1. -c 匹配行的数量,不显示具体内容
  2. -w 匹配整词
  3. -x 匹配整行
  4. -l 只列出匹配的名字,不显示具体的行
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
lyr@DESKTOP-FSVN6C0:~$ grep test.sh
add
^C
lyr@DESKTOP-FSVN6C0:~$ grep add  test.sh
add 1 1
lyr@DESKTOP-FSVN6C0:~$ grep sum  app
grep: app: 没有那个文件或目录
lyr@DESKTOP-FSVN6C0:~$ grep sum  app.sh
            sum=`expr $sum + $i`
echo $sum
lyr@DESKTOP-FSVN6C0:~$ grep sum  app.sh  -niv
1:#!/bin/bash
2:#Author:LYR
3:#Time:2021-10-03 17:35:05
4:#Name:app.sh
5:
6:this_pid=$$
7:# 自己的pid
8:      # systemctl start nginx
9:
10:read -p "input your n: "  n
11:
12:expr $n + 1 &>  /dev/null
13:if [ $? -eq 0 ] ;then
14:    if [ `expr $n \> 0 ` -eq 1 ]  ; then
15:        for ((i=1;i<=$n;i++ ))
16:        do
18:        done
19:
20:
21:    fi
22:
23:else
24:    echo "非法输入"
25:
26:fi
27:
29:
30:

lyr@DESKTOP-FSVN6C0:~$ grep sum  app.sh  -ni
17:            sum=`expr $sum + $i`
28:echo $sum
# 这里 只用 指定行号 -n , i表示 不区分大小写
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
lyr@DESKTOP-FSVN6C0:~$ grep add ./
grep: ./: 是一个目录
lyr@DESKTOP-FSVN6C0:~$ grep add ./*
./client.cpp:    struct sockaddr_in serv;
./client.cpp:    //serv.sin_addr.s_addr = htonl(INADDR_ANY); //使用本机任意可用IP
./client.cpp:    inet_pton(AF_INET, "127.0.0.1",&serv.sin_addr.s_addr);
./client.cpp:    //printf("[%p]", serv.sin_addr.s_addr);
./client.cpp:    int ret = connect(cfd,(struct sockaddr *)&serv, sizeof serv);
./main.cpp:    struct sockaddr_in serv;
./main.cpp:    serv.sin_addr.s_addr = htonl(INADDR_ANY); //使用本机任意可用IP
./main.cpp:    int ret = bind(lfd,(struct sockaddr *)&serv,sizeof serv);
./test.sh:add 1 1
lyr@DESKTOP-FSVN6C0:~$ grep add.* ./*
./client.cpp:    struct sockaddr_in serv;
./client.cpp:    //serv.sin_addr.s_addr = htonl(INADDR_ANY); //使用本机任意可用IP
./client.cpp:    inet_pton(AF_INET, "127.0.0.1",&serv.sin_addr.s_addr);
./client.cpp:    //printf("[%p]", serv.sin_addr.s_addr);
./client.cpp:    int ret = connect(cfd,(struct sockaddr *)&serv, sizeof serv);
./main.cpp:    struct sockaddr_in serv;
./main.cpp:    serv.sin_addr.s_addr = htonl(INADDR_ANY); //使用本机任意可用IP
./main.cpp:    int ret = bind(lfd,(struct sockaddr *)&serv,sizeof serv);
./test.sh:add 1 1
lyr@DESKTOP-FSVN6C0:~$ grep "add.*|bind" ./*
lyr@DESKTOP-FSVN6C0:~$ grep "add.*|sock" ./*
lyr@DESKTOP-FSVN6C0:~$ grep "add|sock" ./*
lyr@DESKTOP-FSVN6C0:~$ grep -E "add|sock"  ./*
./client.cpp:    int cfd = socket(AF_INET, SOCK_STREAM, 0);
./client.cpp:        perror("socket error");
./client.cpp:    struct sockaddr_in serv;
./client.cpp:    //serv.sin_addr.s_addr = htonl(INADDR_ANY); //使用本机任意可用IP
./client.cpp:    inet_pton(AF_INET, "127.0.0.1",&serv.sin_addr.s_addr);
./client.cpp:    //printf("[%p]", serv.sin_addr.s_addr);
./client.cpp:    int ret = connect(cfd,(struct sockaddr *)&serv, sizeof serv);
./main.cpp:    int lfd = socket(AF_INET, SOCK_STREAM, 0);
./main.cpp:        perror("socket error");
./main.cpp:    struct sockaddr_in serv;
./main.cpp:    serv.sin_addr.s_addr = htonl(INADDR_ANY); //使用本机任意可用IP
./main.cpp:    int ret = bind(lfd,(struct sockaddr *)&serv,sizeof serv);
./test.sh:add 1 1
lyr@DESKTOP-FSVN6C0:~$

-E 开启正则表达式匹配

-c 表示计数

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
lyr@DESKTOP-FSVN6C0:~$ ls
app.sh  client.cpp  main.cpp  test.sh
lyr@DESKTOP-FSVN6C0:~$ grep -c "addr" ./*
./app.sh:0
./client.cpp:5
./main.cpp:3
./test.sh:0
lyr@DESKTOP-FSVN6C0:~$ grep -l  "addr" ./*
./client.cpp
./main.cpp
lyr@DESKTOP-FSVN6C0:~$ grep -w  "addr" ./*
lyr@DESKTOP-FSVN6C0:~$ grep -x  "addr" ./*
# 默认
# egrep 等于  grep -E
lyr@DESKTOP-FSVN6C0:~$ egrep "addr" ./*
./client.cpp:    struct sockaddr_in serv;
./client.cpp:    //serv.sin_addr.s_addr = htonl(INADDR_ANY); //使用本机任意可用IP
./client.cpp:    inet_pton(AF_INET, "127.0.0.1",&serv.sin_addr.s_addr);
./client.cpp:    //printf("[%p]", serv.sin_addr.s_addr);
./client.cpp:    int ret = connect(cfd,(struct sockaddr *)&serv, sizeof serv);
./main.cpp:    struct sockaddr_in serv;
./main.cpp:    serv.sin_addr.s_addr = htonl(INADDR_ANY); //使用本机任意可用IP
./main.cpp:    int ret = bind(lfd,(struct sockaddr *)&serv,sizeof serv);
lyr@DESKTOP-FSVN6C0:~$