Linux grep 命令

Posted 天宇轩-王

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux grep 命令相关的知识,希望对你有一定的参考价值。

Linux grep 命令用于查找文件里符合条件的字符串。

grep 指令用于查找内容包含指定的范本样式的文件,如果发现某文件的内容符合所指定的范本样式,预设 grep 指令会把含有范本样式的那一列显示出来。若不指定任何文件名称,或是所给予的文件名为 -,则 grep 指令会从标准输入设备读取数据。

语法

grep [-abcEFGhHilLnqrsvVwxy][-A<显示列数>][-B<显示列数>][-C<显示列数>][-d<进行动作>][-e<范本样式>][-f<范本文件>][--help][范本样式][文件或目录...]

参数

  • -a 或 --text : 不要忽略二进制的数据。
  • -A<显示行数> 或 --after-context=<显示行数> : 除了显示符合范本样式的那一列之外,并显示该行之后的内容。
  • -b 或 --byte-offset : 在显示符合样式的那一行之前,标示出该行第一个字符的编号。
  • -B<显示行数> 或 --before-context=<显示行数> : 除了显示符合样式的那一行之外,并显示该行之前的内容。
  • -c 或 --count : 计算符合样式的列数。
  • -C<显示行数> 或 --context=<显示行数>或-<显示行数> : 除了显示符合样式的那一行之外,并显示该行之前后的内容。
  • -d <动作> 或 --directories=<动作> : 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep指令将回报信息并停止动作。
  • -e<范本样式> 或 --regexp=<范本样式> : 指定字符串做为查找文件内容的样式。
  • -E 或 --extended-regexp : 将样式为延伸的正则表达式来使用。
  • -f<规则文件> 或 --file=<规则文件> : 指定规则文件,其内容含有一个或多个规则样式,让grep查找符合规则条件的文件内容,格式为每行一个规则样式。
  • -F 或 --fixed-regexp : 将样式视为固定字符串的列表。
  • -G 或 --basic-regexp : 将样式视为普通的表示法来使用。
  • -h 或 --no-filename : 在显示符合样式的那一行之前,不标示该行所属的文件名称。
  • -H 或 --with-filename : 在显示符合样式的那一行之前,表示该行所属的文件名称。
  • -i 或 --ignore-case : 忽略字符大小写的差别。
  • -l 或 --file-with-matches : 列出文件内容符合指定的样式的文件名称。
  • -L 或 --files-without-match : 列出文件内容不符合指定的样式的文件名称。
  • -n 或 --line-number : 在显示符合样式的那一行之前,标示出该行的列数编号。
  • -o 或 --only-matching : 只显示匹配PATTERN 部分。
  • -q 或 --quiet或--silent : 不显示任何信息。
  • -r 或 --recursive : 此参数的效果和指定"-d recurse"参数相同。
  • -s 或 --no-messages : 不显示错误信息。
  • -v 或 --revert-match : 显示不包含匹配文本的所有行。
  • -V 或 --version : 显示版本信息。
  • -w 或 --word-regexp : 只显示全字符合的列。
  • -x --line-regexp : 只显示全列符合的列。
  • -y : 此参数的效果和指定"-i"参数相同。

白话文概括常见的

OPTIONS:
    -i: 不区分大小写
    -v: 查找不包含指定内容的行,反向选择
    -w: 按单词搜索
    -o: 打印匹配关键字
    -c: 统计匹配到的行数
    -n: 显示行号
    -r: 逐层遍历目录查找
    -A: 显示匹配行及后面多少行    
    -B: 显示匹配行及前面多少行
    -C: 显示匹配行前后多少行
    -l:只列出匹配的文件名
    -L:列出不匹配的文件名
    -e: 使用正则匹配
    -E:使用扩展正则匹配
    ^key:以关键字开头
    key$:以关键字结尾
    ^$:匹配空行
    --color=auto :可以将找到的关键词部分加上颜色的显示

颜色显示(别名设置):

临时设置:
# alias grep=grep --color=auto            //只针对当前终端和当前用户生效

永久设置:
1)全局(针对所有用户生效)
vim /etc/bashrc
alias grep=grep --color=auto
source /etc/bashrc

2)局部(针对具体的某个用户)
vim ~/.bashrc
alias grep=grep --color=auto
source ~/.bashrc

实例:

# grep -i root passwd                        忽略大小写匹配包含root的行
# grep -w ftp passwd                         精确匹配ftp单词
# grep -w hello passwd                         精确匹配hello单词;自己添加包含hello的行到文件
# grep -wo ftp passwd                         打印匹配到的关键字ftp
# grep -n root passwd                         打印匹配到root关键字的行好
# grep -ni root passwd                         忽略大小写匹配统计包含关键字root的行
# grep -nic root passwd                        忽略大小写匹配统计包含关键字root的行数
# grep -i ^root passwd                         忽略大小写匹配以root开头的行
# grep bash$ passwd                             匹配以bash结尾的行
# grep -n ^$ passwd                             匹配空行并打印行号
# grep ^# /etc/vsftpd/vsftpd.conf        匹配以#号开头的行
# grep -v ^# /etc/vsftpd/vsftpd.conf    匹配不以#号开头的行
# grep -A 5 mail passwd                      匹配包含mail关键字及其后5行
# grep -B 5 mail passwd                      匹配包含mail关键字及其前5行
# grep -C 5 mail passwd                     匹配包含mail关键字及其前后5行
[root@iZbp1efx14jd8471u20gpaZ tmp]# cp /etc/passwd .
[root@iZbp1efx14jd8471u20gpaZ tmp]# ll
total 8
srwxr-xr-x 1 root root    0 Feb  5 20:30 Aegis-<Guid(5A2C30A2-A87D-490A-9281-6765EDAD7CBA)>
-rw-r--r-- 1 root root  956 Feb  5 21:03 passwd
drwx------ 3 root root 4096 Feb  5 20:30 systemd-private-38985bf8993a45cc8f6c10b0d55ebf1c-chronyd.service-svMPKF
[root@iZbp1efx14jd8471u20gpaZ tmp]# alias grep=‘grep --color=auto‘
[root@iZbp1efx14jd8471u20gpaZ tmp]# group root passwd
-bash: group: command not found
[root@iZbp1efx14jd8471u20gpaZ tmp]# grep root passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@iZbp1efx14jd8471u20gpaZ tmp]# grep -w ftp passwd
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
[root@iZbp1efx14jd8471u20gpaZ tmp]#  grep -wo ftp passwd
ftp
ftp
[root@iZbp1efx14jd8471u20gpaZ tmp]# grep -n root passwd
1:root:x:0:0:root:/root:/bin/bash
10:operator:x:11:0:operator:/root:/sbin/nologin
[root@iZbp1efx14jd8471u20gpaZ tmp]# grep -nic root passwd
2
[root@iZbp1efx14jd8471u20gpaZ tmp]# grep -ni root passwd
1:root:x:0:0:root:/root:/bin/bash
10:operator:x:11:0:operator:/root:/sbin/nologin
[root@iZbp1efx14jd8471u20gpaZ tmp]# grep -i ^root passwd
root:x:0:0:root:/root:/bin/bash
[root@iZbp1efx14jd8471u20gpaZ tmp]# grep bash$ passwd
root:x:0:0:root:/root:/bin/bash
[root@iZbp1efx14jd8471u20gpaZ tmp]#  grep -n ^$ passwd
[root@iZbp1efx14jd8471u20gpaZ tmp]# grep ^# /etc/vsftpd/vsftpd.conf
grep: /etc/vsftpd/vsftpd.conf: No such file or directory
[root@iZbp1efx14jd8471u20gpaZ tmp]# grep -A 5 mail passwd
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
[root@iZbp1efx14jd8471u20gpaZ tmp]# grep -B 5 mail passwd
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

以上是关于Linux grep 命令的主要内容,如果未能解决你的问题,请参考以下文章

linux脚本中的ps等命令问题

写代码怎能不会这些Linux命令?

linux grep查询结果再过滤

linux grep命令详解

#grep ‘Linux’ filename命令查找的是啥文件?

linux 命令grep