{"msg":"操作成功","code":200,"data":{"createBy":"admin","createTime":"2021-02-16 15:41:24","updateBy":"admin","updateTime":"2025-06-16 20:19:45","remark":null,"id":50,"articleTitle":"Shell（九）文本处理grep命令","articleUrl":"shell_grep","articleThumbnail":"https://www.asumimoe.com/imgfiles/20220908/7769fde9ec5445068e41583cb1c71894.jpg","articleFlag":"0","draftStatus":"1","reprintStatement":"1","articleSummary":"我们可以使用grep命令在文本中查找指定的字符串，就像你在windows中打开txt文件，使用快捷键 \"Ctrl+F\" 在文本中查找某个字符串一样，说白了，可以把grep理解成字符查找工具。","articleContent":"## grep命令\n\n我们可以使用grep命令在文本中查找指定的字符串，就像你在windows中打开txt文件，使用快捷键 \"Ctrl+F\" 在文本中查找某个字符串一样，说白了，可以把grep理解成字符查找工具。\n\ngrep是Linux中最常用的\"文本处理工具\"之一，grep与sed、awk合称为Linux中的三剑客。\n\ngrep的全称为： Global search Regular Expression and Print out the line\n\n全称中的\"Global search\"为全局搜索之意。\n\n全称中的\"Regular Expression\"表示正则表达式。\n\n所以，从grep的全称中可以了解到，grep是一个可以利用\"正则表达式\"进行\"全局搜索\"的工具，grep会在文本文件中按照指定的正则进行全局搜索，并将搜索出的行打印出来。\n\n当然，不使用正则表达式时也可以使用grep，但是当grep与正则表达式结合在一起时，威力更强大。\n\n## grep命令使用\n\n### 1.搜索特定字符\n\n最常用的即为查看进程是否运行.\n\n```bash\n[root@l1 ~]# ps -ef | grep docker\nroot       1974      1  0 08:22 ?        00:00:01 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock\nroot       2642   2153  0 08:59 pts/0    00:00:00 grep --color=auto docker\n```\n\n### 2.-v选项\n\n表示输出不满足条件的行\n\n```bash\n[root@l1 ~]# cat /etc/passwd | grep -v \"root\" # 表示输出不包含root的行\nbin:x:1:1:bin:/bin:/sbin/nologin\ndaemon:x:2:2:daemon:/sbin:/sbin/nologin\nadm:x:3:4:adm:/var/adm:/sbin/nologin\n```\n\n### 3.-i选项\n\ngrep默认是区分大小写来进行匹配的，如果我们想不区分大小写就需要-i选项。\n\n```bash\n[root@l1 ~]# cat /etc/passwd | grep -i \"ROOT\"\nroot:x:0:0:root:/root:/bin/bash\noperator:x:11:0:operator:/root:/sbin/nologin\n```\n\n### 4.-n显示行号\n\n使用-n命令可以看到负荷规则的行是第几行，比如下面的root出现在第一与第十行。\n\n```bash\n[root@l1 ~]# cat /etc/passwd | grep -n \"root\"\n1:root:x:0:0:root:/root:/bin/bash\n10:operator:x:11:0:operator:/root:/sbin/nologin\n```\n\n### 5.--color关键字高亮\n\n在linux中我们日常使用的时候并不需要加上这个选项，关键字依然会高亮显示，这是为什么呢？\n\n```bash\n[root@l1 ~]# alias\nalias egrep='egrep --color=auto' # 可以看到liunx已经为我们自动加上--color的选项\nalias fgrep='fgrep --color=auto'\nalias grep='grep --color=auto'\n```\n\n### 6.-c显示行数\n\n这个选项是输入符合规则的有几行，而不是将行的内容打印出来。\n\n```bash\n[root@l1 ~]# cat /etc/passwd | grep -c \"root\"\n2 # 可以看到只有两行符合规则\n```\n\n### 7.-o选项，只输出匹配内容\n\n```bash\n[root@l1 ~]# cat /etc/passwd | grep -o \"root\"\nroot\nroot\nroot\nroot\n```\n\n可以看到文本中一共有4个root，包含多个root的行会被重复打印。但需要注意的是-o选项会把每个匹配到的关键字都作为单独的一行输出。\n\n```bash\n[root@l1 ~]# cat /etc/passwd | grep -o -n \"root\"\n1:root\n1:root\n1:root\n10:root\n# 这样就可以看到第一行出现了3个root，第10行出现了1个root\n```\n\n### 8.-A、-B、-C选项\n\n这三个选项的用法是比较相似的，必须要在后面加n数字。\n\n\"-A\"有After之意，代表显示符合条件的行的同时，还要显示之后的行，\"-A3\"表示同时显示符合条件的行之后的3行。\"-B\"有Before之意，代表显示符合条件的行的同时，还要显示之前的行，\"-B3\"表示同时显示符合条件的行之前的3行。\n\n\"-C\"选项可以理解为\"-A与-B\"的结合，\"-C\"选项表示在显示符合条件的行的同时，也会显示其前后的行，如\"-C1″，\"-C1″表示打印符合条件的行的同时，也打印出之前的一行与之后的一行，\"-C\"有Context之意（上下文之意）。\n\n```bash\n[root@l1 ~]# cat /etc/passwd | grep -A1 -n \"root\"\n1:root:x:0:0:root:/root:/bin/bash\n2-bin:x:1:1:bin:/bin:/sbin/nologin\n--\n10:operator:x:11:0:operator:/root:/sbin/nologin\n11-games:x:12:100:games:/usr/games:/sbin/nologin\n```\n\n### 9.-w选项精确匹配\n\n如果我们只加\"bin\"字符，结果为所有包含这个字符串的行。如果加上-w选项则以为匹配只包含bin单词的行，\"bin\"包含于某个字符串的时候，则不会被匹配到。\n\n```bash\n[root@l1 ~]# cat /etc/passwd | grep \"bin\"\nroot:x:0:0:root:/root:/bin/bash\nbin:x:1:1:bin:/bin:/sbin/nologin\ndaemon:x:2:2:daemon:/sbin:/sbin/nologin\n# 加-w选项后\n[root@l1 ~]# cat /etc/passwd | grep -w \"bin\"\nroot:x:0:0:root:/root:/bin/bash\nbin:x:1:1:bin:/bin:/sbin/nologin\n```\n\n### 10.-e选项多规则匹配\n\n使用\"-e\"选项可以同时匹配多个目标，多个目标之间存在“或\"关系，即匹配其中的任意一个都算作匹配成功。值得注意的是，每个规则前都要加-e选项。\n\n```bash\n[root@l1 ~]# cat /etc/passwd | grep -n -e \"root\" -e \"mysql\"\n1:root:x:0:0:root:/root:/bin/bash\n10:operator:x:11:0:operator:/root:/sbin/nologin\n46:mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/false\n```\n\n### 11.-q静默模式\n\n当使用\"-q\"选项时，表示grep使用静默模式，静默模式下grep不会输入任何信息，无论是否匹配到指定的字符串，都不会输出任何信息，所以，我们需要配合\"echo  $?\"命令，查看命令的执行状态，如果返回值为0，证明上一条grep命令匹配到了指定的字符串，如果返回值为1，则证明上一条grep命令没有匹配到指定的字符串。\n\n```bash\n[root@l1 ~]# cat /etc/passwd | grep -q \"root\"\n[root@l1 ~]# echo $?\n0 # 表示文件中包含root字符串\n[root@l1 ~]# cat /etc/passwd | grep -q \"cdfcvd\"\n[root@l1 ~]# echo $?\n1 # 表示文件中不包含cdfcvd字符串\n```","categoryId":5,"viewCount":900,"categoryName":"Shell","author":"球接子","authorAvatar":null,"tagIds":[4,10],"tagNames":["Shell","Linux基础"]}}