首页
关于
Search
1
给你10个市场数据调研报告的免费下载网站!以后竞品数据就从这里找!
141 阅读
2
php接口优化 使用curl_multi_init批量请求
131 阅读
3
2024年备考系统架构设计师
102 阅读
4
《从菜鸟到大师之路 ElasticSearch 篇》
102 阅读
5
PHP 文件I/O
89 阅读
php
thinkphp
laravel
工具
开源
mysql
数据结构
总结
思维逻辑
令人感动的创富故事
读书笔记
前端
vue
js
css
书籍
开源之旅
架构
消息队列
docker
教程
代码片段
redis
服务器
nginx
linux
科普
java
c
ElasticSearch
测试
php进阶
php基础
登录
Search
标签搜索
php函数
php语法
性能优化
安全
错误和异常处理
问题
vue
Composer
Session
缓存
框架
Swoole
api
并发
异步
正则表达式
php-fpm
mysql 索引
开发规范
协程
dafenqi
累计撰写
785
篇文章
累计收到
8
条评论
首页
栏目
php
thinkphp
laravel
工具
开源
mysql
数据结构
总结
思维逻辑
令人感动的创富故事
读书笔记
前端
vue
js
css
书籍
开源之旅
架构
消息队列
docker
教程
代码片段
副业
redis
服务器
nginx
linux
科普
java
c
ElasticSearch
测试
php进阶
php基础
页面
关于
搜索到
785
篇与
的结果
2023-08-30
基础科普!大白话详解HTTPS
基础科普!大白话详解HTTPS
2023年08月30日
10 阅读
0 评论
0 点赞
2023-08-30
高可用的一些解决方案
高可用的一些解决方案后台服务可以划分为两类,有状态和无状态。高可用对于无状态的应用来说是比较简单的,无状态的应用,只需要通过F5或者任何代理的方式就可以很好的解决。后文描述的主要是针对有状态的服务进行分析。服务端进行状态维护主要是通过磁盘或内存进行保存,比如MySQL数据库,redis等内存数据库。除了这两种类型的维护方式,还有jvm的内存的状态维持,但jvm的状态生命周期通常很短。高可用的一些解决方案高可用,从发展来看,大致经过了这几个过程:冷备双机热备同城双活异地双活异地多活在聊异地多活的时候,还是先看一些其他的方案,这有利于我们理解很多设计的缘由。冷备冷备,通过停止数据库对外服务的能力,通过文件拷贝的方式将数据快速进行备份归档的操作方式。简而言之,冷备,就是复制粘贴,在linux上通过cp命令就可以很快完成。可以通过人为操作,或者定时脚本进行。有如下好处:简单快速备份(相对于其他备份方式)快速恢复。只需要将备份文件拷贝回工作目录即完成恢复过程(亦或者修改数据库的配置,直接将备份的目录修改为数据库工作目录)。更甚,通过两次mv命令就可瞬间完成恢复。可以按照时间点恢复。比如,几天前发生的拼多多优惠券漏洞被人刷掉很多钱,可以根据前一个时间点进行还原,“挽回损失”。以上的好处,对于以前的软件来说,是很好的方式。但是对于现如今的很多场景,已经不好用了,因为:服务需要停机。n个9肯定无法做到了。然后,以前我们的停机冷备是在凌晨没有人使用的时候进行,但是现在很多的互联网应用已经是面向全球了,所以,任何时候都是有人在使用的。数据丢失。如果不采取措施,那么在完成了数据恢复后,备份时间点到还原时间内的数据会丢失。传统的做法,是冷备还原以后,通过数据库日志手动恢复数据。比如通过redo日志,更甚者,我还曾经通过业务日志去手动回放请求恢复数据。恢复是极大的体力活,错误率高,恢复时间长。冷备是全量备份。全量备份会造成磁盘空间浪费,以及容量不足的问题,只能通过将备份拷贝到其他移动设备上解决。所以,整个备份过程的时间其实更长了。想象一下每天拷贝几个T的数据到移动硬盘上,需要多少移动硬盘和时间。并且,全量备份是无法定制化的,比如只备份某一些表,是无法做到的。如何权衡冷备的利弊,是每个业务需要考虑的。双机热备热备,和冷备比起来,主要的差别是不用停机,一边备份一边提供服务。但还原的时候还是需要停机的。由于我们讨论的是和存储相关的,所以不将共享磁盘的方式看作双机热备。Active/Standby模式相当于1主1从,主节点对外提供服务,从节点作为backup。通过一些手段将数据从主节点同步到从节点,当故障发生时,将从节点设置为工作节点。数据同步的方式可以是偏软件层面,也可以是偏硬件层面的。偏软件层面的,比如mysql的master/slave方式,通过同步binlog的方式;sqlserver的订阅复制方式。偏硬件层面,通过扇区和磁盘的拦截等镜像技术,将数据拷贝到另外的磁盘。偏硬件的方式,也被叫做数据级灾备;偏软件的,被叫做应用级灾备。后文谈得更多的是应用级灾备。双机互备本质上还是Active/Standby,只是互为主从而已。双机互备并不能工作于同一个业务,只是在服务器角度来看,更好的压榨了可用的资源。比如,两个业务分别有库A和B,通过两个机器P和Q进行部署。那么对于A业务,P主Q从,对于B业务,Q主P从。整体上看起来是两个机器互为主备。这种架构下,读写分离是很好的,单写多读,减少冲突又提高了效率。其他的高可用方案还可以参考各类数据库的多种部署模式,比如mysql的主从、双主多从、MHA;redis的主从,哨兵,cluster等等。同城双活前面讲到的几种方案,基本都是在一个局域网内进行的。业务发展到后面,有了同城多活的方案。和前面比起来,不信任的粒度从机器转为了机房。这种方案可以解决某个IDC机房整体挂掉的情况(停电,断网等)。同城双活其实和前文提到的双机热备没有本质的区别,只是“距离”更远了,基本上还是一样(同城专线网速还是很快的)。双机热备提供了灾备能力,双机互备避免了过多的资源浪费。在程序代码的辅助下,有的业务还可以做到真正的双活,即同一个业务,双主,同时提供读写,只要处理好冲突的问题即可。需要注意的是,并不是所有的业务都能做到。业界更多采用的是两地三中心的做法。远端的备份机房能更大的提供灾备能力,能更好的抵抗地震,恐袭等情况。双活的机器必须部署到同城,距离更远的城市作为灾备机房。灾备机房是不对外提供服务的,只作为备份使用,发生故障了才切流量到灾备机房;或者是只作为数据备份。原因主要在于:距离太远,网络延迟太大。如上图,用户流量通过负载均衡,将服务A的流量发送到IDC1,服务器集A;将服务B的流量发送到IDC2,服务器B;同时,服务器集a和b分别从A和B进行同城专线的数据同步,并且通过长距离的异地专线往IDC3进行同步。当任何一个IDC当机时,将所有流量切到同城的另一个IDC机房,完成了failover。当城市1发生大面积故障时,比如发生地震导致IDC1和2同时停止工作,则数据在IDC3得以保全。同时,如果负载均衡仍然有效,也可以将流量全部转发到IDC3中。不过,此时IDC3机房的距离非常远,网络延迟变得很严重,通常用户的体验的会受到严重影响的。上图是一种基于Master-Slave模式的两地三中心示意图。城市1中的两个机房作为1主1从,异地机房作为从。也可以采用同城双主+keepalived+vip的方式,或者MHA的方式进行failover。但城市2不能(最好不要)被选择为Master。异地双活同城双活可以应对大部分的灾备情况,但是碰到大面积停电,或者自然灾害的时候,服务依然会中断。对上面的两地三中心进行改造,在异地也部署前端入口节点和应用,在城市1停止服务后将流量切到城市2,可以在降低用户体验的情况下,进行降级。但用户的体验下降程度非常大。所以大多数的互联网公司采用了异地双活的方案。上图是一个简单的异地双活的示意图。流量经过LB后分发到两个城市的服务器集群中,服务器集群只连接本地的数据库集群,只有当本地的所有数据库集群均不能访问,才failover到异地的数据库集群中。在这种方式下,由于异地网络问题,双向同步需要花费更多的时间。更长的同步时间将会导致更加严重的吞吐量下降,或者出现数据冲突的情况。吞吐量和冲突是两个对立的问题,你需要在其中进行权衡。例如,为了解决冲突,引入分布式锁/分布式事务;为了解决达到更高的吞吐量,利用中间状态、错误重试等手段,达到最终一致性;降低冲突,将数据进行恰当的sharding,尽可能在一个节点中完成整个事务。对于一些无法接受最终一致性的业务,饿了么采用的是下图的方式:对于个别一致性要求很高的应用,我们提供了一种强一致的方案(Global Zone),Globa Zone是一种跨机房的读写分离机制,所有的写操作被定向到一个 Master 机房进行,以保证一致性,读操作可以在每个机房的 Slave库执行,也可以 bind 到 Master 机房进行,这一切都基于我们的数据库访问层(DAL)完成,业务基本无感知。也就是说,在这个区域是不能进行双活的。采用主从而不是双写,自然解决了冲突的问题。实际上,异地双活和异地多活已经很像了,双活的结构更为简单,所以在程序架构上不用做过多的考虑,只需要做传统的限流,failover等操作即可。但其实双活只是一个临时的步骤,最终的目的是切换到多活。因为双活除了有数据冲突上的问题意外,还无法进行横向扩展。异地多活根据异地双活的思路,我们可以画出异地多活的一种示意图。每个节点的出度和入度都是4,在这种情况下,任何节点下线都不会对业务有影响。但是,考虑到距离的问题,一次写操作将带来更大的时间开销。时间开销除了影响用户体验以外,还带来了更多的数据冲突。在严重的数据冲突下,使用分布式锁的代价也更大。这将导致系统的复杂度上升,吞吐量下降。所以上图的方案是无法使用的。回忆一下我们在解决网状网络拓扑的时候是怎么优化的?引入中间节点,将网状改为星状:改造为上图后,每个城市下线都不会对数据造成影响。对于原有请求城市的流量,会被重新LoadBalance到新的节点(最好是LB到最近的城市)。为了解决数据安全的问题,我们只需要针对中心节点进行处理即可。但是这样,对于中心城市的要求,比其他城市会更高。比如恢复速度,备份完整性等,这里暂时不展开。我们先假定中心是完全安全的。如果我们已经将异地多活的业务部署为上图的结构,很大程度解决了数据到处同步的问题,不过依然会存在大量的冲突,冲突的情况可以简单认为和双活差不多。那么还有没有更好的方式呢?回顾一下前文提到的饿了么的GlobalZone方案,总体思路就是“去分布式”,也就是说将写的业务放到一个节点的(同城)机器上。阿里是这么思考的:实际上我猜测很多业务也是按照上图去实现的,比如滴滴打车业务这种,所有的业务都是按城市划分开的。用户、车主、目的地,他们的经纬度通常都是在同一个城市的。单个数据中心并不需要和其他数据中心进行数据交互,只有在统计出报表的时候才需要,但报表是不太注重实时性的。那么,在这种情况下,全国的业务其实可以被很好的sharding的。但是对于电商这种复杂的场景和业务,按照前文说的方式进行sharding已经无法满足需求了。因为业务线非常复杂,数据依赖也非常复杂,每个数据中心相互进行数据同步的情况无可避免。淘宝的解决方式和我们切分微服务的方式有点类似:注意看图中的数据同步箭头。以交易单元为例,属于交易单元的业务数据,将与中心单元进行双向同步;不属于交易单元的业务数据,单向从中心单元同步。中心单元承担了最复杂的业务场景,业务单元承担了相对单一的场景。对于业务单元,可以进行弹性伸缩和容灾;对于中心单元,扩展能力较差,稳定性要求更高。可以遇见,大部分的故障都会出现在中心单元。按照业务进行单元切分,已经需要对代码和架构进行彻底的改造了(可能这也是为什么阿里要先从双活再切到多活,历时3年)。比如,业务拆分,依赖拆分,网状改星状,分布式事务,缓存失效等。除了对于编码的要求很高以外,对测试和运维也有非常大的挑战。如此复杂的情况,如何进行自动化覆盖,如何进行演练,如何改造流水线。这种级别的灾备,不是一般公司敢做的,投入产出也不成正比。不过还是可以把这种场景当作我们的“假想敌”,去思考我们自己的业务,未来会怎么发展,需要做到什么级别的灾备。相对而言,饿了么的多活方案可能更适合大多数的企业。本文只是通过画图的方式进行了简单的描述,其实异地多活是需要很多很强大的基础能力的。比如,数据传输,数据校验,数据操作层(简化客户端控制写和同步的过程)等。
2023年08月30日
9 阅读
0 评论
0 点赞
2023-08-30
PHP 微服务开发框架
PHP 微服务开发框架从近年来的业界架构演进来看,微服务已经逐渐成为趋势。伴随着微服务架构的这种快速发展节奏,各种开发语言各种类型的微服务开发框架相继出现,据各家使用微服务框架的情况,可以看到主要分为四种模式:无服务治理类:gRPC、brpc 为代表单语言带服务治理类:Dubbo、Spring Cloud 为代表,主要适用于 Java 语言多语言带服务治理类:TARSService Mesh:SideCar 模式,仍在发展成熟期目前PHP相关的微服务框架不多,基本上都是基于Swoole开发, 下面介绍几种网络上信息相对较多的几款PHP微服务开发框架。腾讯TarsTars是基于名字服务使用Tars协议的高性能RPC开发框架,同时配套一体化的服务治理平台,帮助个人或者企业快速的以微服务的方式构建自己稳定可靠的分布式应用。官网:https://tars.tencent.com/base/tars_index/cn/index.html项目地址:https://gitee.com/TarsCloud/TarsPHP产品介绍:https://www.oschina.net/news/108987/tars-php-the-roadPHP-msfPHP-msf是Camera360社区服务器端团队基于Swoole自主研发现代化的PHP协程服务框架,是Swoole的工程级企业应用框架,经受了Camera360自拍相机亿级用户高并发大流量的考验。产品说明:https://www.oschina.net/p/php-msf项目地址:https://github.com/pinguo/php-msf-docsSwoftSwoft是基于swoole协程2.x的高性能PHP微服务框架,内置http服务器。框架全协程实现,性能优于传统的php-fpm模式。官网:https://www.swoft.org/文档:https://www.swoft.org/docs项目地址:https://github.com/swoft-cloud/swoftHyperfHyperf是基于 Swoole 4.4+ 实现的高性能、高灵活性的PHP协程框架,内置协程服务器及大量常用的组件,性能较传统基于PHP-FPM的框架有质的提升。框架组件库除了常见的协程版的 MySQL 客户端、Redis 客户端,还提供了协程版的 Eloquent ORM、WebSocket 服务端及客户端、JSON RPC 服务端及客户端、GRPC 服务端及客户端、Zipkin/Jaeger (OpenTracing) 客户端、Guzzle HTTP 客户端、Elasticsearch 客户端、Consul 客户端、ETCD 客户端、AMQP 组件、Apollo 配置中心、阿里云 ACM 应用配置管理、ETCD 配置中心、基于令牌桶算法的限流器、通用连接池、熔断器、Swagger 文档生成、Swoole Tracker、Blade 和 Smarty 视图引擎、Snowflake 全局ID生成器 等组件,省去了自己实现对应协程版本的麻烦。官网:https://www.hyperf.io/文档:https://doc.hyperf.io项目地址:https://github.com/hyperf-cloud/hyperf其他语言 15 种微服务架构框架
2023年08月30日
16 阅读
0 评论
0 点赞
2023-08-30
进程、线程、进程池、进程三态、同步、异步、并发、并行、串行
进程、线程、进程池、进程三态、同步、异步、并发、并行、串行一.进程, 线程1.🌵进程🍹什么是进程?开发写的代码我们称为程序,那么将开发的代码运行起来。我们称为进程。明白点: 当我们运行一个程序,那么我们将运行的程序叫进程。👉精简重点👈进程是申请一块内存空间,将数据放到内存空间中去, 是申请数据的过程是最小的资源管理单元进程是线程的容器🍹程序与进程的区别程序是数据和指令的集合, 是一个静态的概念, 就是一堆代码, 可以长时间的保存在系统中进程是程序运行的过程, 是一个动态的概念, 进程存在着生命周期, 也就是说进程会随着程序的终止而销毁, 不会永久存在系统中🍹进程之间交互进程之间通过 TCP/IP 端口实现2.🌵线程🍹什么是线程线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。👉精简重点👈是进程的一条流水线, 只用来执行程序,而不涉及到申请资源, 是程序的实际执行者最小的执行单元🍹线程之间交互多个线程 共享同一块内存 ,通过共享的内存空间来进行交互3.🌵进程与线程的关系🍹例子我们打开一个聊天软件,这就是开启了一个进程当我们在软件里面打开一些功能,比如空间, 扫一扫, 设置...,这些操作就是线程所以可以说 "进程" 包含 "线程", "线程" 是 "进程" 的子集🍹进程是线程的容器工厂流水线例子4.🌵总结进程:指在系统中正在运行的一个应用程序;程序一旦运行就是进程; 进程——资源分配的最小单位。线程:系统分配处理器时间资源的基本单元,或者说进程之内独立执行的一个单元执行流。 线程——程序执行的最小单位。进程要分配一大部分的内存,而线程只需要分配一部分栈就可以了.一个程序至少有一个进程,一个进程至少有一个线程.一个线程可以创建和撤销另一个线程,同一个进程中的多个线程之间可以并发执行.二.并行, 并发, 串行并发: 多个任务看起来是同时进行, 这是一种假并行单核下使用多道技术实现并行: 多个任务同时进行并行必须有多核才能实现,否则只能实现并发(伪并行)串行: 一个程序完完整整的运行完,再运行下一个进程三.任务运行的三种状态进程在运行的过程中不断地改变其运行状态 通常一个运行的进程必须具有三种状态:就绪态, 运行态, 阻塞态1.就绪态 (Ready)当进程已分配到除CPU以外的所有必要的资源后,只要再获得CPU, 便可执行程序, 进程这时的状态就称为就绪态,在一个系统中处于就绪态的进程可能有多个 , 通常将他们排成一个队列, 这就叫 就绪队列2.运行态 (Running)当进程已经获得CPU操作权限, 其程序正在运行, 着就叫做运行态在单核操作系统中, 只有一个进程处于运行态 , 多核操作系统有多个进程处于运行态3.阻塞态 (Blocked)(sleep)正在执行的进程, 由于等待某个事件而无法执行时, 便被操作系统剥夺了cpu的操作时间, 这是就是阻塞态引起阻塞的 原因 多种, 例如: 等待I/O操作, 更高优先级的任务抢走了CPU权限等.4.进程三种状态 间的转换一个进程在运行期间, 会不断地在一种状态切换到另一只种状态 他可以是多次处于就绪态和运行态, 也可以多次处于阻塞态, 下图是三种状态的转换图就绪态➠➠运行态处于就绪态的进程, 当进程调度程序为之分配了CPU的时间片后, 该进程就会由就绪态转变成运行态运行态➠➠就绪态处于运行态的进程在运行过程中, 因为分配的时间片用完了, 于是失去了CPU的使用权限, 运行态就会重新转为就绪态运行态➠➠阻塞态正在运行的进程由于遇到I/O操作或被更高优先级的任务抢走CPU使用权限而无法继续执行, 便从运行态转为阻塞态阻塞态➠➠就绪态处于阻塞态的进程, 若其等待的事情已经处理完毕, 于是进程从阻塞态转为就绪态四.任务提交的两种方式1.同步同步是指发送方发送数据后, 等接收方发回响应后才发下一个数据报的通讯方式同步是指 两个程序的运行是相关的 , 其中一个线程在阻塞需要等待状态, 那另一个线程才运行2.异步异步是指发送方发出数据后, 不等接收方发回响应, 接着就发下个数据报的通讯方式异步是指 两个线程毫无相关 , 自己运行自己的3.例子同步你叫我去吃饭, 我听到了就立即和你去吃饭, 如果没有听到, 你就不停的叫, 直到我告诉你听到了, 才一起去吃饭打电话好比同步, 两边是同时进行不能再打给另一个人异步你叫我去吃饭, 然后自己去吃饭了, 我得到消息后可能立即走, 也可能过会儿走发消息好比异步, 和一个人发完消息就可能和另一个人发消息五.进程池1.什么是进程池?👉 进程池是资源进程, 管理进程组成的技术的应用.2.为什么要有进程池?忙时会有成千上万的任务需要被执行,闲时可能只有零星任务。 那么在成千上万个任务需要被执行的时候,我们就需要去创建成千上万个进程么? 首先,创建进程需要消耗时间,销毁进程也需要消耗时间。第二即便开启了成千上万的进程,操作系统也不能让他们同时执行,这样反而会影响程序的效率。因此我们不能无限制的根据任务去开启或者结束进程。那么我们要怎么做呢?3.进程池的概念定义一个池子,在里面放上固定数量的进程,有需求来了,就拿一个池中的进程来处理任务 等到处理完毕,进程并不关闭,而是将进程再放回进程池中继续等待任务 如果有很多任务需要执行,池中的进程数量不够,任务就要等待之前的进程执行任务完毕归来,拿到空闲进程才能继续执行。重点来了 ,也就是说, 进池中进程的数量是固定的,那么同一时间最多有固定数量的进程在运行 这样不会增加操作系统的调度难度,还节省了开关进程的时间,也一定程度上能够实现 并发 效果。4.资源进程预先创建好的空闲进程 ,管理进程(好比池子🏊)会把工作分发到空闲进程来处理。5.管理进程🏊管理进程 负责创建资源进程,把工作交给空闲资源进程处理,回收已经处理完工作的资源进程。资源进程与管理进程的交互管理进程如何有效的管理资源进程,分配任务给资源进程? 通过IPC,信号,信号量,消息队列,管道等进行交互。
2023年08月30日
15 阅读
0 评论
0 点赞
2023-08-30
Linux命令之grep
Linux命令之grep命令简介文本查找或搜索工具 。用于查找内容包含指定的范本样式的文件,如果发现某文件的内容符合所指定的范本样式,预设grep会把含有范本样式的那一列显示出来。若不指定任何文件名称,或是所给予的文件名为 -,则grep会从标准输入设备读取数据。同样可以配合正则表达式来搜索文本,并将匹配的行打印输出,也可用于过滤与搜索特定字符串,使用十分灵活常用参数-a #不要忽略二进制数据-A #除了显示符合范本样式的那一行之外,并显示该行之后的内容-b #在显示符合范本样式的那一行之外,并显示该行之前的内容-B #除了显示符合样式的那一行之外,并显示该行之前的内容-c #计算符合范本样式的列数-C #除了显示符合范本样式的那一列之外,并显示该列之前后的内容-d #当指定要查找的是目录而非文件时,必须使用这项参数,否则grep命令将回报信息并停止动作-e #指定字符串作为查找文件内容的范本样式-E #将范本样式为延伸的普通表示法来使用,意味着使用能使用扩展正则表达式-f #指定范本文件,其内容有一个或多个范本样式,让grep查找符合范本条件的文件内容,格式为每一列的范本样式-F #将范本样式视为固定字符串的列表-G #将范本样式视为普通的表示法来使用-h #在显示符合范本样式的那一列之前,不标示该列所属的文件名称-H #在显示符合范本样式的那一列之前,标示该列的文件名称-i #忽略字符大小写的差别-l #列出文件内容符合指定的范本样式的文件名称-L #列出文件内容不符合指定的范本样式的文件名称-n #在显示符合范本样式的那一列之前,标示出该列的编号-q #不显示任何信息-R/-r #此参数的效果和指定“-d recurse”参数相同-s #不显示错误信息-v #反转查找-V #显示版本信息 -w #只显示全字符合的列-x #只显示全列符合的列-y #此参数效果跟“-i”相同-o #只输出文件中匹配到的部分正则表达式^ #匹配以XX开头的行$ #匹配以XX结尾的行常用实例1、在多个文件中查找:grep "file" file_1 file_2 file_32、输出除之外的所有行 -v 选项:grep -v "file" file_name3、标记匹配颜色 --color=auto 选项:grep "file" file_name --color=auto4、使用正则表达式 -E 选项:grep -E "[1-9]+" egrep "[1-9]+"5、只输出文件中匹配到的部分 -o 选项:echo this is a test line. | grep -o -E "[a-z]+." line. echo this is a test line. | egrep -o "[a-z]+." line.6、统计文件或者文本中包含匹配字符串的行数-c 选项:grep -c "text" file_name 27、输出包含匹配字符串的行数 -n 选项:grep "text" -n file_name 或 cat file_name | grep "text" -n8、多个文件grep "text" -n file_1 file_29、搜索多个文件并查找匹配文本在哪些文件中:grep -l "text" file1 file2 file3...10、grep递归搜索文件在多级目录中对文本进行递归搜索:grep "text" . -r -n11、忽略匹配样式中的字符大小写:echo "hello world" | grep -i "HELLO" hello12、选项 -e 指定多个匹配样式:echo this is a text line | grep -e "is" -e "line" -o is line13、也可以使用 -f 选项来匹配多个样式,在样式文件中逐行写出需要匹配的字符。cat patfile aaa bbb echo aaa bbb ccc ddd eee | grep -f patfile -o14、在grep搜索结果中包括或者排除指定文件:只在目录中所有的.php和.html文件中递归搜索字符"main()"grep "main()" . -r --include *.{php,html}15、在搜索结果中排除所有README文件grep "main()" . -r --exclude "README"16、在搜索结果中排除filelist文件列表里的文件grep "main()" . -r --exclude-from filelist实例grep "San" testfile #过滤有San的行 grep '^J' testfile #显示以J开头的行 grep '70$' testfile #显示以70结尾的行 grep -v "834" testfile #显示所有不包括834的行 grep ':12/' testfile #显示:12/的行 grep ':498-' testfile #显示:498-的行 grep '[A-Z][a-z]{4}:[[:space:]][A-Z]' testfile #显示这样的行,一个大写字母+四个小写字母+空格+一个大写字母 grep '[a-z]{1,}[[:space:]][Kk]' testfile #显示包括K k的行 grep -n '[0-9]{6,}$' testfile #显示6位数字的行,并打印行号 grep -i "lincoln" testfile #显示有lincoln的行,不区分大小写
2023年08月30日
17 阅读
0 评论
0 点赞
1
...
62
63
64
...
157