HelloCoder HelloCoder
首页
《Java小白求职之路》
《小白学Java》
计算机毕设
  • 一些免费计算机资源
  • 脚手架工具
  • 《从0到1学习Java多线程》
  • 《从0到1搭建服务器》
随笔
关于作者
首页
《Java小白求职之路》
《小白学Java》
计算机毕设
  • 一些免费计算机资源
  • 脚手架工具
  • 《从0到1学习Java多线程》
  • 《从0到1搭建服务器》
随笔
关于作者
  • Linux

    • 10个实用的Linux技巧
    • Centos使用教程
    • Linux三剑客之awk命令
    • Linux三剑客之grep命令
    • Linux三剑客之seq命令
    • Linux之用户管理
    • Linux保姆级入门详细教程
    • Linux入门到进阶路线
    • centos开机流程详解
    • shell编程学习
    • vim快捷键
    • 八个能提升效率的Linux快捷键
    • 占用几分钟时间,让你掌握top命令
  • 其他
  • Linux
#Linux #grep #三剑客之 #命令
码农阿雨
2022-05-26
目录

Linux三剑客之grep命令

grep是Linux三大文本(awk,sed,grep)处理工具之一,有着强大的过滤功能。

grep命令常配合awk命令一起使用。

语法:

grep [参数] [文件或目录...]

grep命令常用参数:

  • -A n:显示匹配到的字符串所在的行及其后n行,after
  • -B n:显示匹配到的字符串所在的行及其前n行,before
  • -C n:显示匹配到的字符串所在的行及其前后各n行,context
  • -c 或 --count : 计算符合样式的列数。
  • -d <动作> 或 --directories=<动作> : 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep指令将回报信息并停止动作。
  • -E 或 --extended-regexp : 将样式为延伸的正则表达式来使用。
  • -i : 忽略字符大小写的差别。
  • -l :列出包含指定模式的文件的文件名
  • -n : 在显示符合样式的那一行之前,标示出该行的列数编号。
  • -o : 只显示模式匹配到的字符串内容。
  • -v 或 --invert-match : 显示不包含匹配文本的所有行,反过来(invert),只打印没有匹配的,而匹配的反而不打印。
  • -w : 只显示全字符合的,被匹配的文本只能是单词,而不能是单词中的某一部分,如文本中有liker,而我搜寻的只是like,就可以使用-w选项来避免匹配liker
  • -x : 只显示全列符合的列。

除此之外还有两个符号:

  • ^ 符号:输出所有以某指定模式开头的行
  • $ 符号 :输出所有以指定模式结尾的行

如果不加任何参数,默认显示含有该字符串的行。

下面详细演示一下:

# 1、不加参数 在文件中查找模式(单词)

常用的用法:

[root@VM-8-8-centos ~]# grep 'echo' /root/test_tomcat_restart.sh
echo "有进程:$ps_pid"
echo "-------开始杀进程--------"
echo "正在杀进程: $id"
echo "-------杀进程完成--------"
echo "-------重启项目......--------"

还可以进一步输出,在输出的基础上再查找:

[root@VM-8-8-centos ~]# grep 'echo' /root/test_tomcat_restart.sh | grep 'id'
echo "有进程:$ps_pid"
echo "正在杀进程: $id"

竖线| 左右被理解为简单命令,即前一个(左边)简单命令的标准输出指向后一个(右边)标准命令的标准输入

同样地,我们可以在输出结果中查询:

[root@VM-8-8-centos ~]# ifconfig | grep 'inet'
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 0.0.0.0
        inet6 fe80::42:60ff:fe60:e84e  prefixlen 64  scopeid 0x20<link>
        inet 10.0.8.8  netmask 255.255.252.0  broadcast 10.0.11.255
        inet6 fe80::5054:ff:fe17:41dd  prefixlen 64  scopeid 0x20<link>
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>

# 3、使用 -E 正则查找

查找包含 echo 或者 pid 字符串的行

[root@VM-8-8-centos ~]#  grep -E 'echo|pid' /root/test_tomcat_restart.sh
ps_pid=`ps -ef | grep "$NAME" | grep -v grep | awk '{print $2}'`
#kill -9 ${ps_pid}
echo "有进程:$ps_pid"
echo "-------开始杀进程--------"
for id in $ps_pid
echo "正在杀进程: $id"
echo "-------杀进程完成--------"
echo "-------重启项目......--------"

以上等同于egrep命令

egrep 'echo|pid' /root/test_tomcat_restart.sh

# 4、使用-v 参数输出不包含指定模式的行

参数可以一起使用,查找不包含 echo 或者不包含 id 的行,并且显示行号

[root@VM-8-8-centos ~]#  grep -vEn 'echo|id' /root/test_tomcat_restart.sh
1:
2:
3:#!/bin/bash
4:NAME="/var/www/web/apache-tomcat-8.0.53/"    #想要杀死的进程
8:
11:do
14:done
17:cd /var/www/web/apache-tomcat-8.0.53/bin
18:./startup.sh
19:

# 5、使用 -n 显示查找结果

[root@VM-8-8-centos ~]#  grep -n 'echo' /root/test_tomcat_restart.sh
7:echo "有进程:$ps_pid"
9:echo "-------开始杀进程--------"
13:echo "正在杀进程: $id"
15:echo "-------杀进程完成--------"
16:echo "-------重启项目......--------"

# 6、使用 ^ 符号输出所有以某指定模式开头的行

显示以echo "- 开头的行:

[root@VM-8-8-centos ~]# grep '^echo "-' /root/test_tomcat_restart.sh
echo "-------开始杀进程--------"
echo "-------杀进程完成--------"
echo "-------重启项目......--------"

# 7、使用 $ 符号输出所有以指定模式结尾的行

[root@VM-8-8-centos ~]# grep 'pid$' /root/test_tomcat_restart.sh
for id in $ps_pid

可以利用^$查询一下空行:

[root@VM-8-8-centos ~]# grep -n ^$ /root/test_tomcat_restart.sh
1:
2:
19:

# 8、使用 .* 可以匹配中间未知的内容

[root@VM-8-8-centos ~]# grep -E 'echo.*pid' /root/test_tomcat_restart.sh
echo "有进程:$ps_pid"

# 9、使用 -l 参数列出指定文件的文件名

在多个文件中,出现该字符串的文件列表。

[root@VM-8-8-centos ~]# grep -l 'echo' /root/test_tomcat_restart.sh /root/tomcat_restart.sh
/root/test_tomcat_restart.sh
/root/tomcat_restart.sh

# 10、使用 -r 参数递归查询

在 /var/www/web/HaCBlog 目录下及其子目录的所有文件中,查询匹配的字符串 异步线程发生异常:

[root@VM-8-8-centos ~]# grep -r '异步线程发生异常' /var/www/web/HaCBlog
/var/www/web/HaCBlog/info.log:2021-03-21 21:24:46 [com.hac.blog.framework.config.AsyncConfig$SpringAsyncExceptionHandler:47] ERROR - 异步线程发生异常!Method [sendToAdmin],Error Message [Mail server connection failed; nested exception is com.sun.mail.util.MailConnectException: Couldn't connect to host, port: xxx, 465; timeout 50000;
/var/www/web/HaCBlog/info.log:2021-03-21 21:24:46 [com.hac.blog.framework.config.AsyncConfig$SpringAsyncExceptionHandler:47] ERROR - 异步线程发生异常!Method [asyncSaveSystemLog],Error Message [null]

# 11、-c 参数查询行数

查询服务器有多少个核心:

[root@VM-8-8-centos ~]# grep -c "model name" /proc/cpuinfo
1

# 12、-C n 参数列出前后n行

[root@VM-8-8-centos ~]# grep -C 2 -n "model name" /proc/cpuinfo
3-cpu family    : 23
4-model         : 49
5:model name    : AMD EPYC 7K62 48-Core Processor
6-stepping      : 0
7-microcode     : 0x1000065

# 13、-w 参数完全匹配

[root@VM-8-8-centos ~]# grep -w "model name" /proc/cpuinfo
model name      : AMD EPYC 7K62 48-Core Processor
[root@VM-8-8-centos ~]# grep -w "model nam" /proc/cpuinfo
[root@VM-8-8-centos ~]#
阅读全文
×

(为防止恶意爬虫)
扫码或搜索:HelloCoder
发送:290992
即可永久解锁本站全部文章

解锁
#Linux#grep#三剑客之#命令
上次更新: 2025-02-21 06:04:57
最近更新
01
《LeetCode 101》
02-21
02
IDEA、Golang、Pycharm破解安装
02-21
03
《LeetCode CookBook》
02-21
更多文章>
Theme by Vdoing | Copyright © 2020-2025 码农阿雨
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式