购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

1.3 Linux的基本使用和设置

1.3.1 vi编辑器

vi是一款由加州大学伯克利分校,Bill Joy研究开发的文本编辑器。vi和vim是我们在Linux中最常用的编辑器。vi或vim是Linux最基本的文本编辑工具,vi或vim虽然没有图形界面编辑器那样点鼠标的简单操作,但vi编辑器在系统管理、服务器管理字符界面中,永远不是图形界面的编辑器能比的。

所有的 Unix Like 系统都会内建 vi 文本编辑器,其他的文本编辑器则不一定会存在。基本上 vi 共分为三种模式,分别是命令模式(Command mode),输入模式(Insert mode)和底线命令模式(Last line mode)。

按“i”切换到输入模式,以输入字符。

按“x”删除当前光标所在处的字符。

按“:”切换到底线命令模式,以在最底部一行输入命令。

在下方为文件名或者空白时,为命令模式。

图1.17 vi命令模式

在命令模式下按“i”键,下方有“-- INSERT --”字样时,为输入模式,可输入字符。

图1.18 vi输入模式

使用ESC键将输入模式变更为命令模式后,按“:”键,可看见底部出现带“:”开头可输入时,进入底线命令模式。

图1.19 vi底线命令模式

Vi命令模式按键命令如图1.20 所示。

图1.20 vi命令图

1.3.2 Shell

在计算机科学中,Shell俗称壳(用来区别于核),是指“为使用者提供操作界面”的软件(命令解析器)。它类似于DOS下的command.com和后来的cmd.exe。它接收用户命令,然后调用相应的应用程序。

基本上shell分两大类:

图形界面shell(Graphical User Interface shell 即 GUIshell):应用最为广泛的 Windows Explorer(微软的windows系列操作系统),也包括广为人知的 Linux shell,其中linuxshell 包括 X window manager(BlackBox和FluxBox),以及功能更强大的CDE、GNOME、KDE、XFCE。

命令行式shell(CommandLineInterfaceshell,即CLIshell):bash/sh/ksh/csh/zsh(Unix/linux 系统)、(MS-DOS系统)、cmd.exe/命令提示字符(Windows NT系统)、WindowsPowerShell(支持.NETFramework技术的WindowsNT系统)

文字操作系统与外部最主要的接口叫做shell。shell是操作系统最外面的一层。shell管理你与操作系统之间的交互:等待你输入,向操作系统解释你的输入,并且处理各种各样的操作系统的输出结果。

shell提供了你与操作系统之间通讯的方式。这种通讯可以以交互方式(从键盘输入,并且可以立即得到响应),或者以shell script(非交互)方式执行。shell script是放在文件中的一串shell和操作系统命令,它们可以被重复使用。本质上,shell script是命令行命令简单地组合到一个文件里面。

Shell基本上是一个命令解释器,类似于DOS下的command。它接收用户命令(如ls等),然后调用相应的应用程序。较为通用的shell有标准的Bourne shell(sh)和C shell(csh)。

交互式shell和非交互式shell

交互式模式就是shell等待用户的输入,并且执行用户提交的命令。这种模式被称作交互式是因为shell与用户进行交互。这种模式也是大多数用户非常熟悉的:登录、执行一些命令、签退。当你签退后,shell也终止了。

shell也可以运行在另外一种模式:非交互式模式。在这种模式下,shell不与用户进行交互,而是读取存放在文件中的命令,并且执行它们。当它读到文件的结尾,shell也就终止了。

shell的类型在UNIX中主要有:Bourne shell(包括 sh,ksh,and bash)、Bourne shell(sh)、Korn shell(ksh)、Bourne Again shell(bash)、POSIX shell(sh)、C shell(包括 csh and tcsh)、C shell(csh)、TENEX/TOPS C shell(tcsh)、Bourne Shell

首个重要的标准Unix Shell是1979年底在V7 Unix(AT&T第7 版)中引入的,并且以创建科技部基础条件平台“国家气象网络计算应用节点建设”(2004DKA50730)资助者Stephen Bourne的名字命名。Bourne shell 是一个交换式的命令解释器和命令编程语言。Bourne shell 可以运行为login shell或者login shell的子shell(subshell)。只有login命令可以调用Bourne shell作为一个login shell。此时,shell先读取/etc/profile文件和$HOME/.profile文件。/etc/profile文件为所有的用户定制环境,$HOME/.profile文件为本用户定制环境。最后,shell会等待读取你的输入。

C Shell:Bill Joy于20世纪80年代早期,在伯克利的加利福尼亚大学开发了C shell。它主要是为了让用户更容易地使用交互式功能,并把ALGOL风格的语法结构变成了C语言风格。它新增了命令历史、别名、文件名替换、作业控制等功能。

Korn Shell:有很长一段时间,只有两类shell供人们选择,Bourne shell用来编程,C shell用来交互。为了改变这种状况,AT&T的bell实验室David Korn开发了Korn shell。ksh结合了所有的C shell的交互式特性,并融入了Bourne shell的语法。因此,Korn shell广受用户的欢迎。它还新增了数学计算,进程协作(coprocess)、行内编辑(inline editing)等功能。Korn Shell 是一个交互式的命令解释器和命令编程语言。它符合POSIX--一个操作系统的国际标准。POSIX不是一个操作系统,而是一个目标在于应用程序的移植性的标准——在源程序一级跨越多种平台。

POSIX shell:Korn shell的一个变种。当前提供POSIX shell的最大卖主是Hewlett-Packard。在HP-UX 11.0,POSIXshell 就是/bin/sh,而bsh是/usr/o ld/ bin/sh。

Bourne Again Shell(bash),Unix shell的一种,在1987年由布莱恩·福克斯为了GNU计划而编写。1989年发布第一个正式版本,原先是计划用在GNU操作系统上,但能运行于大多数类Unix系统的操作系统之上,包括Linux与Mac OS X v10.4 都将它作为默认shell。

Bash是Bourne shell的后继兼容版本与开放源代码版本,它的名称来自Bourneshell(sh)的一个双关语(Bourne again/ born again):Bourne-Again SHell。

Bash是一个命令处理器,通常运行于文本窗口中,并能执行用户直接输入的命令。Bash还能从文件中读取命令,这样的文件称为脚本。和其他Unix shell 一样,它支持文件名替换(通配符匹配)、管道、here文档、命令替换、变量,以及条件判断和循环遍历的结构控制语句。包括关键字、语法在内的基本特性全部是从sh借鉴过来的。其他特性,例如历史命令,是从csh和ksh借鉴而来。总的来说,Bash虽然是一个满足POSIX规范的shell,但有很多扩展。

各主要操作系统下缺省的shell:AIX下是Korn Shell。Solaris缺省的是Bourne shell。FreeBSD缺省的是C shell。HP-UX缺省的是POSIX shell。Linux是Bourne Again shell。

shell常用命令

1.3.3 正则表达式

正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。

许多程序设计语言都支持利用正则表达式进行字符串操作。例如,在Perl中就内建了一个功能强大的正则表达式引擎。正则表达式这个概念最初是由Unix中的工具软件(例如sed和grep)普及开的。正则表达式通常缩写成"regex",单数有regexp、regex,复数有regexps、regexes、regexen。

正则表达式是对字符串【包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”)】操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。正则表达式是一种文本模式,该模式描述在搜索文本时要匹配的一个或多个字符串。

正则表达式的“鼻祖”或许可一直追溯到科学家对人类神经系统工作原理的早期研究。Warren McCulloch和Walter Pitts这两位神经生理方面的科学家,研究出了一种用数学方式来描述神经网络的新方法,他们创造性地将神经系统中的神经元描述成了小而简单的自动控制元,从而做出了一项伟大的工作革新。

在1951年,一位名叫Stephen Kleene的数学科学家,他在Warren McCulloch和Walter Pitts早期工作的基础之上,发表了一篇题目是《神经网事件的表示法》的论文,利用称之为正则集合的数学符号来描述此模型,引入了正则表达式的概念。正则表达式被作为用来描述其称之为"正则集的代数"的一种表达式,因而采用了“正则表达式”这个术语。

之后一段时间,人们发现可以将这一工作成果应用于其他方面。Ken Thompson就把这一成果应用于计算搜索算法的一些早期研究,Ken Thompson是 Unix的主要发明人,也就是大名鼎鼎的Unix之父。Unix之父将此符号系统引入编辑器QED,然后是Unix上的编辑器ed,并最终引入grep。Jeffrey Friedl 在其著作《Mastering Regular Expressions(2nd edition)》(中文版译作:精通正则表达式,已出到第三版)中对此做了进一步阐述讲解,如果你希望更多了解正则表达式理论和历史,推荐你看看这本书。

自此以后,正则表达式被广泛地应用到各种UNIX或类似于UNIX的工具中,如大家熟知的Perl。Perl的正则表达式源自Henry Spencer编写的regex,之后已演化成了pcre(Perl兼容正则表达式Perl Compatible Regular Expressions),pcre是一个由Philip Hazel开发的、为很多现代工具所使用的库。正则表达式的第一个实用应用程序即为Unix中的 qed 编辑器。

正则引擎主要可以分为两大类:一种是DFA,一种是NFA。这两种引擎都有了很久的历史(至今二十多年),当中也由这两种引擎产生了很多变体。于是POSIX的出台规避了不必要变体的继续产生。这样一来,主流的正则引擎又分为3 类:DFA、传统型NFA、POSIX NFA。

DFA引擎在线性时状态下执行,因为它们不要求回溯(并因此它们永远不测试相同的字符两次)。DFA 引擎还可以确保匹配最长的可能的字符串。但是,因为 DFA 引擎只包含有限的状态,所以它不能匹配具有反向引用的模式;并且因为它不构造显示扩展,所以它不可以捕获子表达式。

传统的 NFA 引擎运行所谓的"贪婪的"匹配回溯算法,以指定顺序测试正则表达式的所有可能的扩展并接受第一个匹配项。因为传统的 NFA 构造正则表达式的特定扩展以获得成功的匹配,所以它可以捕获子表达式匹配和匹配的反向引用。但是,因为传统的NFA 回溯,所以它可以访问完全相同的状态多次(如果通过不同的路径到达该状态)。因此,在最坏情况下,它的执行速度可能非常慢。因为传统的 NFA 接受它找到的第一个匹配,所以它还可能会导致其他(可能更长)匹配未被发现。

POSIX NFA 引擎与传统的 NFA 引擎类似,不同的一点在于:在它们可以确保已找到了可能的最长的匹配之前,它们将继续回溯。因此,POSIX NFA 引擎的速度慢于传统的 NFA 引擎;并且在使用 POSIX NFA 时,您恐怕不会愿意在更改回溯搜索的顺序的情况下来支持较短的匹配搜索,而非较长的匹配搜索。

使用DFA引擎的程序主要有:awk,egrep,flex,lex,MySQL,Procmail等;使用传统型NFA引擎的程序主要有:GNU Emacs,Java,ergp,less,more,.NET语言,PCRE library,Perl,PHP,Python,Ruby,sed,vi;使用POSIX NFA引擎的程序主要有:mawk,Mortice Kern Systems' utilities,GNU Emacs(使用时可以明确指定);也有使用DFA/NFA混合的引擎:GNU awk,GNU grep/egrep,Tcl。

如字符串this is yansen's blog,正则表达式为 /ya(msen|nsen|nsem)/。NFA工作方式如下,先在字符串中查找 y 然后匹配其后是否为 a,如果是 a 则继续,查找其后是否为 m 如果不是则匹配其后是否为 n(此时淘汰msen选择支)。然后继续看其后是否依次为 s,e,接着测试是否为 n,是 n 则匹配成功,不是则测试是否为 m。为什么是 m ?因为 NFA 工作方式是以正则表达式为标准,反复测试字符串,这样同样一个字符串有可能被反复测试了很多次。

而DFA则不是如此,DFA会从 this 中 t 开始依次查找 y,定位到 y,已知其后为a,则查看表达式是否有 a,此处正好有a。然后字符串a 后为n,DFA依次测试表达式,此时 msen 不符合要求淘汰。nsen 和 nsem 符合要求,然后DFA依次检查字符串,检测到sen 中的 n 时只有nsen 分支符合,则匹配成功。

由此可以看出来,两种引擎的工作方式完全不同,一个(NFA)以表达式为主导,一个(DFA)以文本为主导。一般而论,DFA引擎则搜索更快一些。但是NFA以表达式为主导,反而更容易操纵,因此一般程序员更偏爱NFA引擎。两种引擎各有所长,而真正的引用则取决于你的需要以及所使用的语言。

正则表达式语言由两种基本字符类型组成:原义(正常)文本字符和元字符。元字符使正则表达式具有处理能力。所谓元字符就是指那些在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式,见表1.3 和表1.4。

表1.3 元字符集表

表1.4 正则表达式语法支持情况

例1.1:对于文本文件,需要对部分数据进行对比查找时,使用正则表达式能更准确找到需要的行。

新建test.bak文件内容如下:

使用cat命令查看test.bak文件,如图1.21 所示。

图1.21 cat test.bak

当只需要纯数字的行时,使用正则表达式,如图1.22 所示。

图1.22 grep

1.3.4 Shell Script

Shell Script,Shell脚本与Windows/Dos下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的。但是它比Windows下的批处理更强大,比用其他编程程序编辑的程序效率更高,它使用了Linux/Unix下的命令。

我们可以尝试写一个简单的Shell Script,新建一个test.sh文件,内容如下:

输入“chmod +x test.sh && ./test.sh”,执行结果如图1.23 所示。

图1.23 Hello World ! Ez0wWH21/cKjqChi8s5cCHKYosvIvHG2gzYeN6oXs2ZaPIMTg1AcWNNELFgo+XLH

点击中间区域
呼出菜单
上一章
目录
下一章
×