Linux grep命令详解(多图、多示例)

news2024/11/7 7:13:07

文章目录

  • grep基本说明
  • grep参数
  • 简单示例列举参数
    • -v(反选)
    • -r -l -H -i(目录子目录、只打印匹配文件、输出文件名、忽略大小写)
    • -c -n -o(匹配次数、输出行号、只打印匹配)
    • -A -B -C(前后行)
  • 正则表达式
    • 基本正则表达式与扩展正则表达式
  • grep示例
  • 附录:正则表达式
    • 基本字符
    • 特殊字符
    • Perl模式正则

grep基本说明

grep是grep、awk、sed这三剑客中最常用的命令了,相对也简单一些。

灵活应用grep能帮我们省很多事,例如很多日志可以直接在服务器查看了,就不用再单独下载下来。

很多日志文件很大,下载慢,文本文件打开也非常慢。所以我们尽量通过grep、awk、sed这三剑客直接在服务器上查看处理了。

grep的基本结构如下:

grep [选项] 匹配模式 file1 file2…

最好的grep文档:

man grep

grep参数

参数说明
-c只统计匹配的行数
-v反选,排除匹配结果
-n显示匹配行与行号
-i不区分大小写
-o只输出匹配的内容
-r递归匹配
-w只匹配单词
-x匹配整行
-l小写L,只输出文件名,不输出匹配内容
-H匹配内容带上文件名
-An匹配内容的后n行也输出
-Bn匹配内容的前n行也输出
-Cn匹配内容的前后n行也输出
-E使用扩展正则表达式,痛egrep
-F不使用正则表达式,同fgrep
-P使用perl模式正则表达式,和我们平常常用的正则最像
-color=auto为grep过滤结果添加颜色

简单示例列举参数

-v(反选)

-v参数是反选,最常用的就是在ps -ef | grep xxx的时候会把grep本身也打印出来,这时就可以用-v参数过滤掉grep

ps -ef | grep java | grep -v grep

Linux grep 反选

-r -l -H -i(目录子目录、只打印匹配文件、输出文件名、忽略大小写)

Liinux grep 忽略大小写

-c -n -o(匹配次数、输出行号、只打印匹配)

Linux grep 统计匹配次数

-A -B -C(前后行)

-A:after 后几行
-B:before前几行
-C:前后几行

Linux grep 打印前后行

正则表达式

要想解锁grep的完全形态,正则表达式肯定少不了。

基本正则表达式与扩展正则表达式

首先我们要区分2个概念,不然容易混乱:

  1. 基本正则表达式(BRE):grep模式
  2. 扩展正则表达式(ERE):grep -E、egrep模式

基本正则表达式(BRE)支持元字符:

  1. .:匹配任意1个字符
  2. *:匹配前1个字符0次或多次
  3. ^:行开头
  4. $:行结尾
  5. []:可选,如[az]匹配字符a或z
  6. -:区间,如[a-z]匹配字符a到z
  7. [^]:反选,如[^0-9]匹配非数字

扩展正则表达式(ERE)基本上和我们平常使用的正则表达式支持的元字符一样。

有一个反直觉的点:

ERE(egrep)中使用反斜杠转义表示普通字符,例如,要匹配?就得使用?
BRE(grep)中使用? 反而变成了正则表达式

之所以有这种情况,是因为grep在识别到?自动转为了egrep模式。

测试文件内容:

ab a. c? [ee] (dd) a* +a+ a|b
11 33 abc22
hello world Luck day
luck boy
44:22:33
long loong looong loop lo?ng
# grep 匹配字符串lo?ng
grep lo?ng grep.txt
# grep 匹配字符串lo?ng
grep "lo?ng" grep.txt

# grep 双引号中\?是转义字符,变成正则符号了
grep "lo\?ng" grep.txt

# 正则匹配
egrep lo?ng grep.txt
# 正则匹配
egrep lo\?ng grep.txt

# egrep 双引号\?被转义,变成普通字符匹配了
egrep "lo\?ng" grep.txt

上面的双引号换成单引号也可以,在引号中\表示转义。

Linux grep egrep

是不是有点乱,所以,为了避免混淆,建议正则直接使用egrep吧。

grep示例

# 查找日志文件中error和warn日志,及其前后5行,忽略大小写
egrep -C5 -i "error|warn" app.log

# 统计指定时间段的访问数量
egrep "2024-11-01 06(:[0-9]{2}){2}" access.log | wc -l


# 打印8点到10点的日志,根本不用计算时间不要显然思维误区
grep -P '2024-11-01 (08|09|10):\d{2}' app.log
# 打印7点过8分到10分的日志
egrep '2024-10-13 07:(08|09|10)' app.log

# 如果是sed,要输出10点日志就不能只到10,因为结束用的是第1个匹配
# sed有一个问题就是 如果灭有匹配到2024-11-01 11:00,就直接干到最后去了
sed -n '/2024-11-01 08:00/,/2024-11-01 11:00/p' app.log
sed -n '/2024-10-13 07:08/,/2024-10-13 07:11/p' app.log

# 打印连接的本地ip和远程ip
ss | grep -Po '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}'
# 打印连接本地ip端口及其对应远程ip端口
ss | grep -Po '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}:\d+\s+\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}:\d+'

Linux grep 过滤ip

附录:正则表达式

基本字符

元字符含义
.匹配除换行符以外的任何单个字符
^锚定到字符串的开始位置
$锚定到字符串的结束位置
*前面的字符匹配零次或多次
+前面的字符匹配一次或多次
{n}前面的字符恰好匹配 n 次
{n,}前面的字符至少匹配 n 次
{,m}前面的字符最多匹配 m 次
{n,m}前面的字符至少匹配 n 次,最多匹配 m 次
?前面的字符匹配零次或一次
()分组,允许将多个字符或表达式组合
[]字符集合,匹配其中的任意一个字符,如[0-9]匹配数字
[^]排除字符集合,匹配不在括号内的任意一个字符,如[^0-9]匹配非数字字符
# 匹配空白字符
egrep [ \t\n\r\f\v] grep.txt

# 匹配非空白字符
egrep [^ \t\n\r\f\v] grep.txt

# 匹配变量字符
egrep [a-zA-Z_][a-zA-Z0-9_]* grep.txt

特殊字符

表达式含义
[:alnum:]大小写字母数字[a-zA-Z0-9]
[:lower:]小写字母[a-z]
[:upper]大写字母
[:alpha:]大小写字母[a-zA-Z]
[:blank:]space(空格)、tab
[:cntrl:]控制键CR、LF等
[:digit:]数字[0-9]
[:graph:]非空格键[^:blank:]
[:print:]可打印字符
[:punct:]标点符号[:";?!'#$^&*()等]
[:space:]空白字符,Tab space CR等
[:xdigit:]16进制数

[:space:]包含:

  1. ‌空格(Space):普通的空格字符
  2. ‌制表符(Tab):表示一个制表位
  3. ‌换行符(NL,New Line):表示文本的一行结束
  4. ‌回车符(CR,Carriage Return):在Windows系统中,回车符表示一行的结束
  5. ‌垂直制表符(VT,Vertical Tab):用于垂直对齐文本
  6. ‌换页符(FF,Form Feed):用于分页
# grep egrep都支持,匹配数字
egrep [[:digit:]] grep.txt
grep [[:digit:]] grep.txt

Perl模式正则

Perl模式更偏向于我们熟悉的模式,更简介一些,除了支持基本字符,还支持下面这些表达式:

表达式描述
\d匹配一个数字的字符,[0-9]
\D非数字,[^0-9]
\w英文字母、数字、下划线,[a-zA-Z0-9_]
\W[^a-zA-Z0-9_]
\s[\n\t\r\f空格]
\S[^\n\t\r\f空格]
\b匹配以英文字母,数字为边界的字符串
\B匹配不以英文字母,数值为边界的字符串
# 匹配数字就不需要使用[[:digit:]]这种了,直接\d就可以
# 注意有\转义,需要用引号包起来
grep -P "\d" grep.txt
grep -P '\d' grep.txt

# 提取日志时间
grep -oP '\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}' app.log

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2234860.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

力扣:225 用队列实现栈

栈、队列 栈: 弹夹,后进先出 队列: 排队,先进先出 描述: var MyStack function () {// 定义两个数组,模拟队列this.queue []this._queue [] };/** * param {number} x* return {void}*/ MyStack.protot…

【MFC编程(一)】MFC概述

文章目录 MFC概述MFC组成MFC对比Windows APIMFC类库基类CObject命令发送类CCmdTarget应用程序结构类应用程序线程支持类CWinThread/CWinApp文档类CDocument文档模板类CDocTemplate 窗口类窗口基类CWnd边框窗口类CFrameWnd视图类CView MFC概述 MFC(Microsoft Founda…

【客观理性深入讨论国产中间件及数据库-科创基础软件】

随着国产化的进程,越来越多的国企央企开始要求软件产品匹配过程化的要求, 最近有一家银行保险的科技公司对行为验证码产品就要求匹配国产中间件, 于是开始了解国产中间件都有哪些厂家 一:国产中间件主要产品及厂商 1 东方通&…

基于Python的校园爱心帮扶管理系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…

pycharm小游戏贪吃蛇及pygame模块学习()

由于代码量大,会逐渐发布 一.pycharm学习 在PyCharm中使用Pygame插入音乐和图片时,有以下这些注意事项: 插入音乐: - 文件格式支持:Pygame常用的音乐格式如MP3、OGG等,但MP3可能需额外安装库&#xf…

A018基于Spring Boot的民宿租赁系统

🙊作者简介:在校研究生,拥有计算机专业的研究生开发团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹 赠送计算机毕业设计600…

​基于学习的地铁客流动态预测智能调度方法

1 文章信息 文章题为“A Learning Based Intelligent Train RegulationMethod With Dynamic Prediction forthe Metro Passenger Flow”,该文于2023年发表至“IEEE TRANSACTIONS ON INTELLIGENT TRANSPORTATION SYSTEMS”。文章的核心观点是提出了一种基于学习的智…

SpringBoot+FileBeat+ELK8.x版本收集日志

一、准备环境 1、ElasticSearch:8.1.0 2、FileBeat:8.1.0 3、Kibana:8.1.0 4、logstach:8.1.0 本次统一版本:8.1.0,4个组件,划分目录,保持版本一致。 说明:elasticsearch和kib…

【大数据学习 | HBASE】habse的表结构

在使用的时候hbase就是一个普通的表,但是hbase是一个列式存储的表结构,与我们常用的mysql等关系型数据库的存储方式不同,mysql中的所有列的数据是按照行级别进行存储的,查询数据要整个一行查询出来,不想要的字段也需要…

论文速读:动态再训练-更新用于无源目标检测的Mean Teacher(ECCV2024)

原文标题:Dynamic Retraining-Updating Mean Teacher for Source-Free Object Detection 中文标题:动态再训练-更新用于无源目标检测的Mean Teacher 本篇文章为论文速读,以帮助大家快速了解大意,具体详解可以看这篇分享。ECCV2024…

科研绘图系列:R语言带有面积区域的折线图(linechart)

文章目录 介绍加载R包数据画图准备图1图2图3图4图5图6图7图8图9图10合并所有图形系统信息介绍 带有面积区域的折线图通常被称为面积图(Area Chart)。面积图结合了折线图和条形图的特点,通过在折线下方的区域填充颜色或纹理,来展示一个或多个组的数值如何随第二个变量(通常…

Golang--文件操作

1、文件 文件:文件用于保存数据,是数据源的一种 os包下的File结构体封装了对文件的操作(记得包os包) 2、File结构体--打开文件和关闭文件 2.1 打开文件 打开文件,用于读取(函数): 传…

Ubuntu学习笔记 - Day3

文章目录 学习目标:学习内容:学习笔记:vim简介vim键盘图工作模式 vim移动光标操作上下左右移动翻页 vim替换和删除操作替换删除 vim插入模式详解进入模式搜索 vim底行模式操作保存退出行号 学习目标: 一周掌握 Linux基本使用技巧 …

Java中的JDBC的详解

数据库驱动包 Java提出的一套关于数据库操作的接口 各个数据库厂商要把自己的api对接到/适配到jdbc上 程序员只需要掌握一套api就可以操作不同的数据库了 数据库厂商提供的这个原生api适配到jdbc转换程序,称为“数据库驱动包” 1)创建数据源 //1,创…

Apache-Hive数据库使用学习

前期准备 Hadoop-分布式部署(服务全部在线) Mysql-node1节点部署(确认安装正常) apache-hive -node1节点部署(需要与MySQL元数据联动存储) 参考博客: Hadoop Hadoop集群搭建-完全分布式_hadoop完…

【极客兔兔-Web框架Gee详解】Day2 上下文Context

文章目录 一、框架结构二、设计上下文(Context):day2-context/gee/context.go1. 设计Context必要性1.1 接口粒度过细:1.2 缺乏扩展性:2. 代码3. 优势三、路由(Router): day2-context/gee/router.go四、框架入口:day2-context/gee/gee.go1. 代码五、框架使用: day2-context/m…

LeetCode17. 电话号码的字母组合(2024秋季每日一题 59)

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 示例 1: 输入:digits “23” 输出:[“…

DApp开发定制:合约设计与源码搭建支持快速上线

随着区块链技术的飞速发展,去中心化应用(DApp)已经成为区块链生态中不可或缺的一部分。DApp不仅改变了传统互联网应用的运作方式,还通过去中心化的理念和智能合约的支持,赋能了用户和开发者。无论是金融、游戏、社交、…

【C++】手动实现C++ vector容器:深入理解动态数组的工作原理

💯个人主页: 起名字真南 💯个人专栏:【数据结构初阶】 【C语言】 【C】 【OJ题解】 目录 1. 引言2. 实现思路3. vector 容器的代码实现4. 代码详解4.1 构造与析构函数4.2 容量管理4.3 迭代器与访问操作4.4 增删操作 5.测试代码6. 时间和空间复杂度分析7.…

深入探讨钉钉与金蝶云星空的数据集成技术

钉钉报销数据集成到金蝶云星空的技术案例分享 在企业日常运营中,行政报销流程的高效管理至关重要。为了实现这一目标,我们采用了轻易云数据集成平台,将钉钉的行政报销数据无缝对接到金蝶云星空的付款单系统。本次案例将重点介绍如何通过API接…