通过14个实例掌握grep命令的使用方法

08/31 10:57
阅读数 19

Grep是Linux/Unix系统中的一个命令行工具,用于从文件中搜索文本或字符串。Grep代表全局正则表达式打印。当我们使用指定字符串运行grep命令时,如果匹配,则它将显示包含该字符串的文件行,而不修改现有文件的内容。

命令语法

$ grep  <Options> <Search String>  <File-Name>

命令选项:

Grep-Command-Options

(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

Search-Word-Multiple-files-Grep-command

(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

Invert-Match-Pattern-Grep-Command

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

Print-Empty-Lines-Grep-Command

打印空行的行号

$ 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

Takes-Pattern-from-file

(13) 计算与模式匹配的行数

“-c” 选项用于计算与搜索模式匹配的行数。

假设我们要计算 /etc/password 文件中以 “false” 结尾的行数

$ grep -c false$ /etc/passwd
6
$

(14) 打印模式匹配前后的N行

(a) 打印在模式匹配之前的四行,使用 "-B" 选项

$ grep -B 4 "games" /etc/passwd

Print-Lines-Before-Matching-Pattern-Grep-Command

(b) 打印在模式匹配之后的四行,使用 "-A" 选项

$ grep -A 4 "games" /etc/passwd

Print-Lines-After-Matching-Pattern-Grep-Command

(c) 打印在匹配模式周围的四行(前后各四行),使用 "-C" 选项

$ grep -C 4 "games" /etc/passwd

Print-Lines-Around-Matching-Pattern-Grep-Command

小编开源项目

展开阅读全文
加载中

作者的其它热门文章

打赏
0
0 收藏
分享
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部