Grep是Linux/Unix系统中的一个命令行工具,用于从文件中搜索文本或字符串。Grep代表全局正则表达式打印。当我们使用指定字符串运行grep命令时,如果匹配,则它将显示包含该字符串的所在行,而不修改现有文件的内容。
命令语法
$ grep <Options> <Search String> <File-Name>
命令选项:
(1) 在文件中搜索单词或字符串
当我们运行grep命令,后跟搜索字符串或模式时,它将打印文件的匹配行。示例如下所示。
例如:在文件 /etc/passwd 文件中搜索 nobody
$ grep nobody /etc/passwd
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
$
(2) 多文件中的搜索模式
可以使用grep命令在多个文件中搜索单词或模式。
例如:在 /etc/passwd,/etc/shadow, /etc/gshadow文件中搜索 linuxtechi
$ sudo grep linuxtechi /etc/passwd /etc/shadow /etc/gshadow
(3) 打印与模式匹配的文件名
假设我们想列出包含单词“root”的文件名,可以在grep命令中使用“-l”选项,后跟单词(模式)和文件。
$ grep -l 'root' /etc/fstab /etc/passwd /etc/mtab
/etc/passwd
$
(4) 显示带有行号的输出行
使用 “-n” 选项显示与模式或单词匹配的行及其编号。
$ grep -n 'nobody' /etc/passwd
18:nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
$
(5) 反转模式匹配
使用grep命令中的选项 “-v”,我们可以显示与模式不匹配的行
$ grep -v 'nobody' /etc/passwd
6) 打印以特定字符开头的所有行
Bash Shell 将插入符号 “^” 视为特殊字符,用于标记行或单词的开头。
让我们显示文件 /etc/passwd 中以 “backup” 开头的行
$ grep ^backup /etc/passwd
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
$
(7) 打印以特定字符结尾的所有行
Bash Shell 将美元符号 “$” 视为一个特殊字符,用于标记行或字的结尾。
让我们列出 /etc/passwd 中以 “bash” 结尾的所有行
$ grep bash$ /etc/passwd
root:x:0:0:root:/root:/bin/bash
linuxtechi:x:1000:1000:linuxtechi,,,:/home/linuxtechi:/bin/bash
$
(8) 递归搜索模式
“-r” 选项用于在文件夹和子文件夹中递归搜索模式。
假设我们想递归地搜索 /etc 文件夹中的模式 “nologin”
$ sudo grep -r nobody /etc
/etc/shadow:nobody:*:19101:0:99999:7:::
/etc/shadow-:nobody:*:19101:0:99999:7:::
/etc/passwd:nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
/etc/ssh/sshd_config:#AuthorizedKeysCommandUser nobody
/etc/passwd-:nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
$
(9) 打印文件中的所有空行
使用特殊字符组合 “^$” 打印文件中的所有空行
$ grep '^$' /etc/sysctl.conf
打印空行的行号
$ grep -n '^$' /etc/sysctl.conf
(10) 搜索时忽略字母大小写
“-i” 选项忽略模式和数据中的字母大小写
假设我们希望在 sysctl.conf 文件中搜索 “IP_Forward” 字符串
$ grep IP_Forward /etc/sysctl.conf
$
$ grep -i IP_Forward /etc/sysctl.conf
#net.ipv4.ip_forward=1
$
使用 “-w” 选项仅匹配整个单词
$ sudo sysctl -a | grep -w 'vm.swappiness'
vm.swappiness = 60
$
(11) 匹配多个模式
借助 grep 命令中的 “-e” 选项,我们可以在单个命令中搜索多个模式。
$ grep -e nobody -e mail /etc/passwd
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
$
或者使用如下方式
$ grep -E "nobody|mail" /etc/passwd
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
$
(12) 从文件中获取模式
grep命令中的 “-f” 选项允许从文件中获取模式。示例如下所示:
First create a search pattern file with name “grep_pattern” in your current working directory. In my case put following content in it.
首先在当前工作目录中创建名为 “grep_pattern” 的搜索模式文件,我已事先将以下内容放入其中。
$ cat grep_pattern
^linuxtechi
root
false$
$
现在尝试使用 “grep_pattern” 文件进行搜索
$ grep -f grep_pattern /etc/passwd
(13) 计算与模式匹配的行数
“-c” 选项用于计算与搜索模式匹配的行数。
假设我们要计算 /etc/password 文件中以 “false” 结尾的行数
$ grep -c false$ /etc/passwd
6
$
(14) 打印模式匹配前后的N行
(a) 打印在模式匹配之前的四行,使用 "-B" 选项
$ grep -B 4 "games" /etc/passwd
(b) 打印在模式匹配之后的四行,使用 "-A" 选项
$ grep -A 4 "games" /etc/passwd
(c) 打印在匹配模式周围的四行(前后各四行),使用 "-C" 选项
$ grep -C 4 "games" /etc/passwd
小编开源项目
- course-tencent-cloud(酷瓜云课堂 - gitee仓库)
- course-tencent-cloud(酷瓜云课堂 - github仓库)