0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

grep命令常用的选项详解

阿铭linux 来源:阿铭linux 作者:阿铭 2022-11-30 11:43 次阅读

阿铭在前面多次用到了grep命令,可见它的重要性。该命令的格式为:grep [-cinvABC] 'word' filename,其常用的选项如下所示。

-c:表示打印符合要求的行数。

-i:表示忽略大小写。

-n:表示输出符合要求的行及其行号。

-v:表示打印不符合要求的行。

-A:后面跟一个数字(有无空格都可以),例如-A2表示打印符合要求的行以及下面两行。

-B:后面跟一个数字,例如-B2表示打印符合要求的行以及上面两行。

-C:后面跟一个数字,例如-C2表示打印符合要求的行以及上下各两行。

首先看看-A、-B和-C这3个选项的用法。

-A2 会把包含halt的行以及这行下面的两行都打印出来:

# grep -A2 'halt' /etc/passwd
halt7halt:/sbin:/sbin/halt
mail8mail:/var/spool/mail:/sbin/nologin
operator11operator:/root:/sbin/nologin
说明:在Rocky8系统中,grep默认帮我们把匹配到的字符串标注了红色,这点还是挺贴心的。其实大家可以用which命令看一下grep,你会发现grep其实是grep --color=auto,这个选项就是颜色显示。

-B2 会把包含halt的行以及这行上面的两行都打印出来:

# grep -B2 'halt' /etc/passwd
sync5sync:/sbin:/bin/sync
shutdown6shutdown:/sbin:/sbin/shutdown
halt7halt:/sbin:/sbin/halt

-C2 会把包含halt的行以及这行上下各两行都打印出来:

# grep -C2 'halt' /etc/passwd
sync5sync:/sbin:/bin/sync
shutdown6shutdown:/sbin:/sbin/shutdown
halt7halt:/sbin:/sbin/halt
mail8mail:/var/spool/mail:/sbin/nologin
operator11operator:/root:/sbin/nologin

下面阿铭举几个典型实例来帮你更深刻地理解grep。

12.1.1过滤出带有某个关键词的行,并输出行号

示例命令如下:

# grep -n 'root' /etc/passwd
1x0/root:/bin/bash
10x0/root:/sbin/nologin

说明前面的数字显示为绿色,表示行号。

12.1.2过滤出不带有某个关键词的行,并输出行号

示例命令如下:

# grep -nv 'nologin' /etc/passwd
1x0/root:/bin/bash
6x0/sbin:/bin/sync
7x0/sbin:/sbin/shutdown
8x0/sbin:/sbin/halt
45x1000/home/aminglinux:/bin/bash

12.1.3过滤出所有包含数字的行

示例命令如下:

# grep '[0-9]' /etc/inittab
# multi-user.target: analogous to runlevel 3
# graphical.target: analogous to runlevel 5

说明只要有一个数字就算匹配到了。

12.1.4过滤出所有不包含数字的行

示例命令如下:

# grep -v '[0-9]' /etc/inittab
# inittab is no longer used.
#
# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target
#
# systemd uses 'targets' instead of runlevels. By default, there are two main targets:
#
#
# To view current default target, run:
# systemctl get-default
#
# To set a default target, run:
# systemctl set-default TARGET.target

说明:和上一例的结果正好相反,只要是包含一个数字,就不显示。

12.1.5过滤掉所有以#开头的行

操作样例文档/etc/sos.conf的内容如下:

[plugins]
#disable = rpm, selinux, dovecot


[tunables]
#rpm.rpmva = off


#general.syslogsize = 15
# grep -v '^#' /etc/sos.conf
[plugins]


[tunables]

说明:这里面是含有空行的。

那如何将空行删除呢?示例命令如下:

# grep -v '^#' /etc/sos.conf |grep -v '^$'
[plugins]
[tunables]
在正则表达式中,^表示行的开始,$表示行的结尾,那么空行则可以用^$表示。如何打印出不以英文字母开头的行呢?我们先来自定义一个文件,如下所示:
# mkdir /tmp/1
# cd /tmp/1
# vim test.txt //内容如下
123
abc
456
abc2323
#laksdjf
Alllllllll

接下来看两个例子:

# grep '^[^a-zA-Z]' test.txt
123
456
#laksdjf
# grep '[^a-zA-Z]' test.txt
123
456
abc2323
#laksdjf
前面也提到过中括号[]的应用,如果是数字就用[0-9]这样的形式(当遇到类似[15]的形式时,表示只含有1或者5)。如果要过滤数字以及大小写字母,则要写成类似[0-9a-zA-Z]的形式。另外,[^字符]表示除[]内字符之外的字符。请注意,把^写到方括号里面和外面是有区别的。

12.1.6过滤出任意一个字符和重复字符

示例命令如下:

# grep 'r.o' /etc/passwd
root0root:/root:/bin/bash
operator11operator:/root:/sbin/nologin

.表示任意一个字符。上例中,r.o表示把r与o之间有一个任意字符的行过滤出来。

# grep 'ooo*' /etc/passwd
root0root:/root:/bin/bash
lp4lp:/var/spool/lpd:/sbin/nologin
mail8mail:/var/spool/mail:/sbin/nologin
operator11operator:/root:/sbin/nologin
setroubleshoot981:/var/lib/setroubleshoot:/sbin/nologin

*表示零个或多个*前面的字符。上例中,ooo*表示oo、ooo、oooo...或者更多的o。

# grep '.*' /etc/passwd |wc -l
45
# wc -l /etc/passwd
45 /etc/passwd

上例中,.*表示零个或多个任意字符,空行也包含在内,它会把/etc/passwd文件里面的所有行都匹配到,你也可以不加|wc -l看一下效果。

12.1.7指定要过滤出的字符出现次数

示例命令如下:

# grep 'o{2}' /etc/passwd
root0root:/root:/bin/bash
lp4lp:/var/spool/lpd:/sbin/nologin
mail8mail:/var/spool/mail:/sbin/nologin
operator11operator:/root:/sbin/nologin
setroubleshoot981:/var/lib/setroubleshoot:/sbin/nologin
这里用到了符号{},其内部为数字,表示前面的字符要重复的次数。需要强调的是,{}左右都需要加上转义字符。另外,使用“{ }”还可以表示一个范围,具体格式为{n1,n2},其中n1 < n2,表示重复n1到n2次前面的字符,n2还可以为空,这时表示大于等于n1次。 除grep工具外,阿铭也常常用到egrep这个工具,后者是前者的扩展版本,可以完成grep不能完成的工作。

下面阿铭介绍egrep不同于grep的几个用法。为了试验方便,阿铭把test.txt编辑成如下内容:
rot0/rot:/bin/bash
operator11operator:/root:/sbin/nologin
operator11operator:/rooot:/sbin/nologin
roooot0/rooooot:/bin/bash
1111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

12.1.8过滤出一个或多个指定的字符

示例命令如下:

# egrep 'o+' test.txt
rot0/rot:/bin/bash
operator11operator:/root:/sbin/nologin
operator11operator:/rooot:/sbin/nologin
roooot0/rooooot:/bin/bash
# egrep 'oo+' test.txt
operator11operator:/root:/sbin/nologin
operator11operator:/rooot:/sbin/nologin
roooot0/rooooot:/bin/bash
# egrep 'ooo+' test.txt
operator11operator:/rooot:/sbin/nologin
roooot0/rooooot:/bin/bash
和grep不同,这里egrep使用的是符号+,它表示匹配1个或多个+前面的字符,这个“+”是不支持被grep直接使用的。包括上面的{},也是可以直接被egrep使用,而不用加转义。示例如下:
# egrep 'o{2}' /etc/passwd
root0root:/root:/bin/bash
lp4lp:/var/spool/lpd:/sbin/nologin
mail8mail:/var/spool/mail:/sbin/nologin
operator11operator:/root:/sbin/nologin
setroubleshoot981:/var/lib/setroubleshoot:/sbin/nologin

12.1.9过滤出零个或一个指定的字符

示例命令如下:

# egrep 'o?' test.txt
rot0/rot:/bin/bash
operator11operator:/root:/sbin/nologin
operator11operator:/rooot:/sbin/nologin
roooot0/rooooot:/bin/bash
1111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
# egrep 'ooo?' test.txt
operator11operator:/root:/sbin/nologin
operator11operator:/rooot:/sbin/nologin
roooot0/rooooot:/bin/bash
# egrep 'oooo?' test.txt
operator11operator:/rooot:/sbin/nologin
roooot0/rooooot:/bin/bash

12.1.10过滤出字符串1或者字符串2

示例命令如下:

# egrep 'aaa|111|ooo' test.txt
operator11operator:/rooot:/sbin/nologin
roooot0/rooooot:/bin/bash
1111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

12.1.11egrep中()的应用

示例命令如下:
# egrep 'r(oo|at)o' test.txt
operator11operator:/root:/sbin/nologin
operator11operator:/rooot:/sbin/nologin
roooot0/rooooot:/bin/bash
这里用()表示一个整体,上例中会把包含rooo或者rato的行过滤出来,另外也可以把()和其他符号组合在一起,例如(oo)+就表示1个或者多个oo。如下所示:
# egrep '(oo)+' test.txt
operator11operator:/root:/sbin/nologin
operator11operator:/rooot:/sbin/nologin
roooot0/rooooot:/bin/bash

好了,grep常用的就这些,足够你在工作中用了。






审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • grep
    +关注

    关注

    0

    文章

    22

    浏览量

    4680

原文标题:一篇文章总结完grep用法

文章出处:【微信号:aming_linux,微信公众号:阿铭linux】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Linux中grep命令的12个实际例子

    Linux中grep命令的12个实际例子
    发表于 02-08 09:38 492次阅读

    Linux中grep、sed和awk命令详解

    今天给大家聊一聊Linux中文本操作的`三剑客:awk、grep、sed`,因其功能强大、使用频繁,且是Linux下文本处理的得力利器,常被称之为`文本三剑客`。`grep`常用于查找,`sed`
    发表于 04-26 17:20 1932次阅读
    Linux中<b class='flag-5'>grep</b>、sed和awk<b class='flag-5'>命令</b><b class='flag-5'>详解</b>

    linux下的grep命令有什么区别?

    下面两个命令有什么区别1.grep . "abc" *2.grep . "abc"
    发表于 09-17 16:59

    12个 Linux 中 grep 命令的超级用法实例

    grep命令中使用选项-E来启用它。$ sudo grep -E12.搜索一个固定匹配字符串fgrep用于在一个文件或文件列表中搜索固定样式的字符串。功能与
    发表于 05-12 08:00

    Linux命令grep

    Linux命令grep
    发表于 05-29 07:13

    linux grep命令详解

    grep。它功能更强,可以通过-G、-E、-F命令选项来使用egrep和fgrep的功能。  grep常用用法  [root@www ~
    发表于 03-31 10:05

    Linux关机命令详解

    Linux关机命令详解 在linux下一些常用的关机/重启命令有shutdown、halt、reboot、及init,它们都 可以达到重启系统的目的,但每个
    发表于 01-18 12:52 3514次阅读

    Linux中用grep命令来搜索单词及统计匹配的行数

    使用 grep 命令来搜索多个单词要使用 grep 命令来搜索多个字符串或单词,我们该怎么做?例如我想要查找 /path/to/file 文件中的 word1、word
    发表于 04-02 14:46 515次阅读

    Linux在在文件中查找文本的Grep命令

    grep命令是(global regular expression print,全局正则表达式输出)的缩写,它是Linux中功能最强大且最常用命令之一。
    的头像 发表于 06-21 12:06 2892次阅读

    详解tcpdump命令的六个常用选项

    tcpdump用于捕获和分析网络流量。系统管理员可以使用它来查看实时流量或将输出保存到文件中并在以后进行分析。下面列出6个常用选项
    的头像 发表于 03-16 10:30 2234次阅读

    如何使用grep命令

    grep命令的全称是全局正则表达式打印,它是Linux中功能最强大且最常用命令之一。
    的头像 发表于 12-06 16:43 1674次阅读

    如何使用grep对标准输出进行过滤

    grep命令的全称是全局正则表达式打印,它是Linux中功能最强大且最常用命令之一。
    的头像 发表于 12-12 17:30 2006次阅读

    egrep和grep两个常用命令区别在哪?

    egrep 和 grep 是两个常用命令行工具,用于在文本文件中搜索匹配某个模式的行。它们的主要区别在于正则表达式的语法支持。
    的头像 发表于 07-08 10:01 5759次阅读

    nmcli命令的一些常用选项和用法

    以下是nmcli命令的一些常用选项和用法: connection show -- 显示所有网络连接的详细信息。 connection up --启动网络连接。 connection down
    发表于 10-08 11:15 337次阅读
    nmcli<b class='flag-5'>命令</b>的一些<b class='flag-5'>常用</b><b class='flag-5'>选项</b>和用法

    kafka相关命令详解

    kafka常用命令详解
    的头像 发表于 10-20 11:34 351次阅读