grep 的使用

一、grep命令语法:
grep [OPTIONS] PATTERN [file....]

方括号中的项目是可选的:

OPTIONS-零个或多个选项,Grep包含许多控制其行为的选项。
PATTERN-搜索模式
FILE-零个或多个输入文件名
为了能够搜索文件,运行命令的用户必须对文件具有可读权限。

二、grep的基本命令及使用

  1. 要显示/etc/passwd文件中包含字符串bash的所有行,请运行一下命令:
grep  bash /etc/passwd   # 查询passwd中有多少行包含bash
  1. 如果字符串中包含空格,则需要将其用单引号或者双引号引起来。
grep "Gnome Display Manager" /etc/passwd #字符串包含字符需要用单引号或者双引号引起来
  1. 反转匹配(排除),要显示与模式不匹配的行,用 -V(--invert-match)选项
grep -V nologin /etc/passwd # 打印不包含nologin的行
  1. 使用grep过滤命令的输出,使用grep通过管道过滤命令的输出,并且只有与给定模式匹配的行才会打印在终端上。
ps -ef|grep www-data # 找出系统以用户www-data的身份在系统上运行

可以在命令中使用多个管道,在上面的输出中看到的,还有一行包含grep进程,如果不希望看到改行,则将输出再传递到另一个grep实例,如下所示:

ps -ef|grep www-data|grep -V grep
  1. 递归搜索,要递归搜索模式,可以使用-r选项(或--recursive)调用grep。使用此选项时,grep将搜索指定目录下的所有文件,并跳过递归遇到的符号链接。要跟随所有符号链接,请使用-R(--dereference-recursive),而不是-R
grep -r linuxidc /etc #显示在/etc目录的所有文件中包含linuxids的行,输出包含以文件的完整路径为前缀的匹配行
  1. 如果使用-R选项,则grep将跟随所有符号链接
grep -R linuxidc.com /etc   #注意下面输出的最后一行。 当用-r调用grep时,不会打印该行,因为Nginx启用站点的目录中的文件是指向可用站点目录中的配置文件的符号链接。
  1. 仅显示文件名

要取消默认grep输出并仅打印包含匹配模式的文件名,请使用-l(或--files-with-matches)选项。
以下命令在当前工作目录中搜索所有以.conf结尾的文件,并仅显示包含字符串linuxidc.com的文件的名称:

grep -l linuxidc.com *.conf
# 显示如下
# 输出将如下所示:
 
# tmux.conf
# haproxy.conf
 
# -l选项通常与递归选项-R结合使用:
 
# grep -Rl linuxidc.com /tmp
  1. 不区分大小写的搜索

默认情况下,grep区分大小写。 这意味着将大写和小写字符视为不同的字符。要在搜索时忽略大小写,请使用-i选项(或--ignore-case)调用grep。

grep Zebra /usr/share/words # 搜索不带任何选项的Zebra时,以下命令将不显示任何输出
# 使用-i选项执行不区分大小写的搜索,则它将同时匹配大小写字母
grep -i Zebra /usr/share/words # 指定“ Zebra”将匹配该字符串的“ zebra”,“ ZEbrA”或任何其他大小写字母组合
  1. 搜索全词

搜索字符串时,grep将显示该字符串嵌入较大字符串中的所有行。例如,如果您搜索“ gnu”,则将以较大的单词(例如“ cygnus”或“ magnum”)嵌入“ gnu”的所有行都将匹配:

grep gnu /usr/share/words
# 输出结果如下
# cygnus
# gnu
# interregnum
# lgnu9d
# lignum
# magnum
# magnuson
# sphagnum
# wingnut

要仅返回指定字符串是整个单词(用非单词字符括起来)的那些行,请使用-w(或--word-regexp)选项。文字字符包括字母数字字符(a-z,A-Z和0-9)和下划线(_)。 所有其他字符均视为非单词字符。

grep -w gnu /usr/share/words # 包括-w选项,则grep命令将仅返回其中包含gnu作为单独单词的那些行
# 输出结果如下
# gnu
  1. 显示行号

-n(或--line-number)选项告诉grep显示包含与模式匹配的字符串的行的行号。 使用此选项时,grep将匹配项打印到以行号为前缀的标准输出。

grep -n 10000 /etc/services # 显示/etc/services文件中的包含字符串10000并带有匹配行号的行
 
下面的输出显示在行104445和10446上找到匹配项。
 
10445:ndmp            10000/tcp              # Network Data Management Protocol
10446:ndmp            10000/udp              # Network Data Management Protocol
  1. Count函数匹配

若要将匹配行数打印到标准输出,请使用-c(或 --count)选项。

grep -c '/usr/bin/zsh' /etc/passwd # 计算以/usr/bin/zsh作为shell的帐户数量
 
# 输出: 4

参考:https://blog.csdn.net/quanhujing/article/details/108296317

posted @ 2021-01-12 14:14  忆尘不散  阅读(622)  评论(0)    收藏  举报