linux grep

本文详细介绍了Linux中的grep命令,包括基本用法、正则表达式、匹配控制、输出控制等,并提供了丰富的示例,如查找以数字结尾的行、查找特定模式的字符串等,帮助读者深入理解和掌握grep命令的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这本阿里P8撰写的算法笔记,再次推荐给大家,身边不少朋友学完这本书最后加入大厂:

Github 疯传!史上最强悍!阿里大佬「LeetCode刷题手册」开放下载了!

1、概述

  使用正则表达式搜索文本,并把匹 配的行打印出来。

2、命令格式

  grep [OPTIONS] PATTERN [FILE...]

  grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]

3、常用命令参数

  匹配选择:

    -E, --extended-regexp    使用扩展正则表达式 【不用使用 \ 了】

    -F, --fixed-strings    相当于fgrep 不支持正则表达式

  匹配控制:     -e PATTERN, --regexp=PATTERN    这可以用于多个搜索模式指定,或用连字符(-)开始保护模式。

[root@mode-6 day03]# cat grepTest2

Default runlevel. The runlevels used are:

0 - halt (Do NOT set initdefault to this)

1 - Single user mode

2 - Multiuser, without NFS (The same as 3, if you do not have networking)

3 - Full multiuser mode

4 - unused

5 - X11

6 - reboot (Do NOT set initdefault to this)

id:3:initdefault: [root@mode-6 day03]# grep -e 'multiuser' grepTest2

3 - Full multiuser mode

[root@mode-6 day03]# grep -e 'multiuser' -e 'initdefault' grepTest2 # 多个正则匹配

0 - halt (Do NOT set initdefault to this)

3 - Full multiuser mode

6 - reboot (Do NOT set initdefault to this)

id:3:initdefault:     -i, --ignore-case      忽略大小写

    -x, --line-regexp    整行匹配

    -y    "-i" 的同义词

    -w, --word-regexp  单词匹配

    -v, --invert-match    显示没有被模式匹配到的行,匹配的行不显示

[oldboy@moban ~]$ grep --color -v "nologin" /etc/passwd root:x:0:0:root:/root:/bin/bash sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt oldboy:x:500:500::/home/oldboy:/bin/bash hive:x:501:501::/home/hive:/bin/bash kkk:x:502:502::/home/kkk:/bin/bash   通用输出控制:     -c, --count    得到匹配行数。示例:

[oldboy@moban ~]$ grep -c -v "nologin" /etc/passwd 7       --color[=WHEN], --colour[=WHEN]    匹配处,高亮显示【默认红色字体】。示例: [oldboy@moban ~]$ grep --color "nologin" /etc/passwd

    -L, --files-without-match    查看那些文件没有被匹配。【通常针对多个文件匹配时】     -l, --files-with-matches    查看那些文件是由匹配的。【通常针对多个文件匹配时】【小写字母 L】

     -m NUM, --max-count=NUM    匹配多少行;如果NUM超过匹配行数,那么显示所有匹配行。示例:

    -o, --only-matching    只显示被模式匹配到的字符串。示例:

  输出行前缀控制:     -b, --byte-offset    在显示符合样式的那一行之前,标示出该行第0个字符的偏移。示例:

 

    -H, --with-filename    在显示符合样式的那一行之前,显示该行所属的文件名称

    -n, --line-number    显示匹配行所在的行号。

  上下文控制:     -A NUM, --after-context=NUM    显示匹配行,和之后的NUM行数据。示例:

    -B NUM, --before-context=NUM    显示匹配行,和之前的NUM行数据。

    -C NUM, -NUM, --context=NUM    显示匹配行,和之前以及之后NUM行数据。

4、正则表达式

  基本正则表达式:         默认匹配次数:贪婪模式,尽可能多的去匹配 

    1)元字符:

    .    匹配任意单个字符

    []     匹配指定范围内的任意单个字符 [0-9],[a-z],[abc]     [^]     匹配指定范围外的任意单个字符

    2)字符集合:

    纯数字 [[:digit:]]或[0-9] 

    小写字母 [[:lower:]]或[a-z]     大写字母 [[:upper:]]或[A-Z] 

    大小写字母 [[:alpha:]]或[a-zA-Z]     数字加字母 [[:alnum:]]或[0-9a-zA-Z] 

    空白字符 [[:space:]]      非空白字符[^[:space:]]

    标点符号 [[:punct:]] 

    【可以通过man tr查询这些字符集合】            

    3)匹配次数(贪婪模式):

*    匹配其前面的字符任意次 【0次或多次】

    .*    任意长度的任意字符

    .    表示.本身   \逃逸符

    ?    匹配其前面的字符0次或1次

    x{m}    匹配其前面的字符“x”m次(精确匹配) 

    x{m,}    匹配其前面的字符“x”至少m次    【{1,} 至少一次,多了不限】

    x{m,n}:匹配其前面的字符“x”至少m次,至多n次    【{0,3} 最多3次,少了不限】

    4)位置锚定:

    ^     锚定行首,此字符后面的任意内容必须出现在行首   【# grep '^r..t' /etc/passwd】

    $     锚定行尾,此字符前面的任意内容必须出现在行尾【# grep 'login$' /etc/passwd】

    ^$    空白行【# grep '^$' /etc/inittab 】

    <或\b     锚定词首,其后面的任意字符必须作为"单词的"首部出现       【# grep "<root" test2.txt】

    >或\b     锚定词尾,其前面的任意字符必须作为"单词的"尾部出现【# grep "root>" test2.txt】

    <xxx>或\bxxx\b     锚定单词例如 <root>

    5)分组:   \(\)   后向引用

    \(ab\)* # grep "\(b\)*" test.txt

    \1    引用第一个左括号以及与之对应的右括号所包括的所有内容

    \2    引用第二个左括号以及与之对应的右括号所包括的所有内容

    \3    引用第三个左括号以及与之对应的右括号所包括的所有内容

  扩展正则表达式:

+     匹配其前面的字符至少1次       类似:\{1,\}

    ?     匹配紧挨在其前面的字符0次或1次   类似:?    【不需要下斜线 ?】

    {m,n}     匹配前面字符至少m次至多n次 {1,}表示1至无限 {0,3}表示0-3    【不需要下斜线 {}】

    ()    分组    \1, \2, \3, ...     【不需要下斜线 】

    |      或者   【C|cat:    C或cat # grep -E "C|cat" test4.txt 】   (C|c)at:  Cat或cat# grep -E "(C|c)at" test4.txt

   注意:对于 <或\b      >或\b  使用扩展正则也不能去掉 \

*** 注意正则表达式和扩展正则表达式的区别

5、常用示例

  示例1:

    1、以数字结尾

grep"[[:digit:]]$" /etc/rc.sysinit

grep"[0-9]$" /etc/rc.sysinit

    2、以数字结尾,前面有一个或多个空白字符

grep"[[:space:]][0-9]$" /etc/rc.sysinit

grep"[[:space:]]{1,}[0-9]$" /etc/rc.sysinit

grep-E "[[:space:]]+[0-9]$" /etc/rc.sysinit

    3、以数字结尾,之前的内容中有一个空格或多个空格

grep"[[:space:]]{1,}.*[0-9]$" /etc/rc.sysinit

grep-E "[[:space:]]+.*[0-9]$" /etc/rc.sysinit

  示例2:

    1、有如下文本内容 test1.txt

He love his lover.

She like her lover.

He like his liker.

She love her liker.

She like he.

【请注意他们的不同信息】

grep "l..e" test1.txt

grep "l..e.*l..e" test1.txt

grep "\(l..e\).\1" test1.txt 【或者:grep -E"(l..e).\1" test1.txt】

    2、对文件/etc/rc.sysinit 文件按照如下规则匹配:

        a)结尾是数字    b)结尾的数字在该行中的其他地方有显示

    如: wrw35wetgerh3 

grep-E "([0-9]).*\1$" /etc/rc.sysinit

  示例3:

    1、显示/proc/meminfo文件中以不区分大小的s开头的行.

grep-i "^s" /proc/meminfo

grep-E "^(s|S)" /proc/meminfo

grep-E "^[s|S]" /proc/meminfo

    2、显示/etc/passwd中以nologin结尾的行.

grep"nologin$" /etc/passwd

    3、取出默认shell为/sbin/nologin的用户列表。

grep"/sbin/nologin$" /etc/passwd | cut -d: -f1

    4、取出默认shell为bash,且其用户ID号最大用户的用户名和用户编号。

grep"bash$" /etc/passwd | sort -t: -k3 -nr | head -1 | cut -d: -f1,3

    5、显示/etc/inittab中以#开头,且后面跟一个或多个空白字符,而后又跟了任意非空白字符的行.

grep"^#[[:space:]]{1,}[^[:space:]]{1,}" /etc/inittab

grep-E '^#[[:space:]]+[^[:space:]]+' /etc/inittab

    6、显示/etc/inittab中包含了:一个数字:(即两个冒号中间一个数字)的行.

grep-E "(:)[0-9]\1" /etc/inittab

grep":[0-9]:" /etc/inittab

grep"\(:[0-9]:\)" /etc/inittab

    7、显示/boot/grub/grub.conf文件中以一个或多个空白字符开头的行.

grep"^[[:space:]]{1,}" /boot/grub/grub.conf

grep-E "^[[:space:]]+" /boot/grub/grub.conf

    8、显示/etc/inittab文件中以一个数字开头并以一个与开头数字相同的数字结尾的行.

grep"^([0-9]).*\1$" /etc/inittab

grep-E "^([0-9]).*\1$" /etc/inittab

  示例4:

    1、找出某文件中的,1位数,或2位数.

grep"[0-9]{1,2}" /proc/cpuinfo 【错误】

grep"<[0-9]{1,2}>" /proc/cpuinfo 【正确】

    2、找出ifconfig命令结果中的1-255之间的整数。

    3、查找当前系统上名字为hive(必须出现在行首)的用户的帐号的相关信息, 文件为/etc/passwd

grep"^<hive>" /etc/passwd

示例5:

    1、分析/etc/inittab文件中如下文本中前两行的特征(每一行中出现在数字必须相同),请写出可以精确找到类似两行的模式:

l1:1:wait:/etc/rc.d/rc1

l3:3:wait:/etc/rc.d/rc3

grep'^l([0-9]):\1.*\1 /etc/inittab

grep-E "^l([0-9]):\1.*\1$" /etc/inittab

    2、找出/boot/grub/grub.conf文件中1-255之间的数字;

grep-E '<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])>'

/boot/grub/grub.conf

    3、找出ifconfig中0-255之间的数字;

#ifconfig | egrep --color '<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])>'

    4、找出ifconfig中所有的IP地址

ifconfig |egrep --color

'(<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])>.){3}<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])>'

其他示例:

1、关闭开启多余的启动项【开机启动项优化】

[root@oldboy ~]# chkconfig --list | grep '3:on' abrt-ccpp 0:off 1:off 2:off 3:on 4:off 5:on 6:off abrtd 0:off 1:off 2:off 3:on 4:off 5:on 6:off acpid 0:off 1:off 2:on 3:on 4:on 5:on 6:off atd 0:off 1:off 2:off 3:on 4:on 5:on 6:off auditd 0:off 1:off 2:on 3:on 4:on 5:on 6:off blk-availability 0:off 1:on 2:on 3:on 4:on 5:on 6:off cpuspeed 0:off 1:on 2:on 3:on 4:on 5:on 6:off crond 0:off 1:off 2:on 3:on 4:on 5:on 6:off # 需要 haldaemon 0:off 1:off 2:off 3:on 4:on 5:on 6:off ip6tables 0:off 1:off 2:on 3:on 4:on 5:on 6:off irqbalance 0:off 1:off 2:off 3:on 4:on 5:on 6:off kdump 0:off 1:off 2:off 3:on 4:on 5:on 6:off lvm2-monitor 0:off 1:on 2:on 3:on 4:on 5:on 6:off messagebus 0:off 1:off 2:on 3:on 4:on 5:on 6:off netfs 0:off 1:off 2:off 3:on 4:on 5:on 6:off network 0:off 1:off 2:on 3:on 4:on 5:on 6:off # 需要 postfix 0:off 1:off 2:on 3:on 4:on 5:on 6:off rsyslog 0:off 1:off 2:on 3:on 4:on 5:on 6:off # 需要 sshd 0:off 1:off 2:on 3:on 4:on 5:on 6:off # 需要 sysstat 0:off 1:on 2:on 3:on 4:on 5:on 6:off # 需要 udev-post 0:off 1:on 2:on 3:on 4:on 5:on 6:off 思路: 1、关闭全部,然后开启需要的 #chkconfig --list | grep '3:on' #chkconfig --list | grep '3:on' | awk '{print $1}' #chkconfig --list | grep '3:on' | awk '{print "chkconfig",$1,"off"}' #chkconfig --list | grep '3:on' | awk '{print "chkconfig",$1,"off"}' | bash # 关闭全部服务 #chkconfig --list | grep '3:on' #chkconfig --list | grep -E 'crond|network|rsyslog|sshd|sysstat' #chkconfig --list | grep -E 'crond|network|rsyslog|sshd|sysstat' | awk '{print "chkconfig",$1,"on"}' #chkconfig --list | grep -E 'crond|network|rsyslog|sshd|sysstat' | awk '{print "chkconfig",$1,"on"}' | bash # 开启指定服务 #chkconfig --list | grep '3:on' crond 0:off 1:off 2:on 3:on 4:on 5:on 6:off network 0:off 1:off 2:on 3:on 4:on 5:on 6:off rsyslog 0:off 1:off 2:on 3:on 4:on 5:on 6:off sshd 0:off 1:off 2:on 3:on 4:on 5:on 6:off sysstat 0:off 1:on 2:on 3:on 4:on 5:on 6:off

2、除了需要的,其他的全部关闭【下面是步骤】  推荐使用 #chkconfig --list | grep '3:on' #chkconfig --list | grep '3:on' | grep -E 'crond|network|rsyslog|sshd|sysstat' #chkconfig --list | grep '3:on' | grep -Ev 'crond|network|rsyslog|sshd|sysstat' #chkconfig --list | grep '3:on' | grep -Ev 'crond|network|rsyslog|sshd|sysstat' | awk '{print $1}' #chkconfig --list | grep '3:on' | grep -Ev 'crond|network|rsyslog|sshd|sysstat' | awk '{print "chkconfig",$1,"off"}' #chkconfig --list | grep '3:on' | grep -Ev 'crond|network|rsyslog|sshd|sysstat' | awk '{print "chkconfig",$1,"off"}' | bash #chkconfig --list | grep '3:on' crond 0:off 1:off 2:on 3:on 4:on 5:on 6:off network 0:off 1:off 2:on 3:on 4:on 5:on 6:off rsyslog 0:off 1:off 2:on 3:on 4:on 5:on 6:off sshd 0:off 1:off 2:on 3:on 4:on 5:on 6:off sysstat 0:off 1:on 2:on 3:on 4:on 5:on 6:off

6、当前命令所在位置和类型 

[oldboy@moban ~]$ which grep /bin/grep [oldboy@moban ~]$ type grep grep is /bin/grep 7、参考文章

    每天一个linux命令(39):grep 命令

    linux grep命令详解

    linux中grep命令

    Linux正则表达式语法 ———————————————— 版权声明:本文为CSDN博主「LightZhang666」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/woshizhangliang999/article/details/46859161/

这本阿里P8撰写的算法笔记,再次推荐给大家,身边不少朋友学完这本书最后加入大厂:

Github 疯传!史上最强悍!阿里大佬「LeetCode刷题手册」开放下载了!

以上就是良许教程网为各位朋友分享的Linux相关知识。

<think>我们正在回答用户关于Linuxgrep命令的使用问题。根据引用内容,grep是一个强大的文本搜索工具,支持正则表达式。首先,我们需要介绍grep的基本用法,然后逐步介绍常用选项和示例。注意:引用中提供了多个选项和示例,我们需要整理并清晰呈现。步骤:1.解释grep命令的基本作用。2.介绍基本语法格式。3.详细说明常用选项(参数)。4.提供一些常见的使用示例。根据引用[1][2][3][4],我们了解到:-grep用于在文件中搜索特定的字符串模式(支持正则表达式)。-常用选项包括:-c,-i,-h,-l,-n,-s,-v,--color等。-还提到了一些正则表达式的元字符,如^、$、.、*等。注意:用户要求使用中文回答,并且按照系统级指令处理数学表达式(但本问题不涉及数学表达式,所以不需要使用$...$或$$...$$)。另外,用户要求生成相关问题,放在最后。由于引用中已经有一些示例,我们可以整理并补充一些常见的例子。回答结构:1.概述2.基本语法3.常用选项说明4.示例5.相关问题</think>### 如何在 Linux 中使用 grep 命令 `grep` 是 Linux 中强大的文本搜索工具,支持正则表达式匹配。其基本语法为: ```bash grep [选项] "搜索模式" [文件名] ``` #### 🔍 核心功能与常用选项 1. **基本搜索** ```bash grep "error" log.txt # 在 log.txt 中搜索含 "error" 的行 ``` 2. **常用选项** - `-i`:忽略大小写 ```bash grep -i "warning" system.log ``` - `-n`:显示匹配行号 ```bash grep -n "root" /etc/passwd ``` - `-v`:反向匹配(排除模式) ```bash grep -v "#" config.cfg # 过滤掉注释行 ``` - `-c`:统计匹配行数 ```bash grep -c "success" report.log ``` - `--color`:高亮显示匹配内容 ```bash grep --color "TODO" *.py ``` 3. **正则表达式支持** - `^`:行首锚点 ```bash grep "^start" file.txt # 匹配以 "start" 开头的行 ``` - `$`:行尾锚点 ```bash grep "end$" file.txt # 匹配以 "end" 结尾的行 ``` - `.`:匹配任意字符(需转义字面点) ```bash grep "192\.168" hosts # 匹配 IP 地址段 ``` - `*`:匹配前字符 0 次或多次 ```bash grep "ca*t" file # 匹配 "ct", "cat", "caat" 等 ``` #### 📂 文件与目录操作 - **多文件搜索** ```bash grep "panic" /var/log/*.log # 搜索目录下所有 .log 文件 ``` - **递归搜索目录** ```bash grep -r "function" ~/projects/ # 递归搜索目录内容 ``` - **仅显示文件名**(`-l`) ```bash grep -l "deprecated" *.c # 列出包含匹配项的文件名 ``` #### ⚠️ 注意事项 - 正则元字符(如 `.`、`*`、`$`)需用 `\` 转义以匹配字面值 [^3]。 - 使用 `-F` 可禁用正则,按固定字符串搜索 [^4]。 - 管道操作示例: ```bash dmesg | grep -i "usb" # 在命令输出中搜索 ``` #### 💡 实用技巧 ```bash # 搜索包含 3 位数字的行 grep "[0-9]\{3\}" data.txt # 提取邮箱地址(-o 仅输出匹配部分) grep -o "[a-zA-Z0-9._]\+@[a-zA-Z]\+\.com" contacts.txt ``` > 引用说明:本文功能描述基于 Linux 的 GNU grep 实现,具体参数可能因发行版差异略有不同 [^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值