计算机原理概念:
1、CPU和内存中的存储单元通信线路称为总线(BUS),总线是被指令和数据复用的,所以也称为前端总线。
2、计算机中计算频率的时间标准即晶体振荡器原理,精确计算时间长度,根据相同的时间统计变化的次数,即保持时钟同步。
3、每一个芯片在厂家生产时都有一个以微码(汇编语言)形式存在内置接口,完成一定意义上的智能操作。
4、CPU中控制器在未从存储器中提取全部数据交给运算器运算的过程中,已提取的数据存放
的位置叫寄存器,全部数据提取完之后才交给运算器进行运算(举例:1+1=?)。
5、北桥是高速总线(即类似于CPU和存储器的本地总线)的连接设备;南桥是慢速设备(类
似于键鼠、USB、硬盘等)的连接设备,并且连接到北桥,通过北桥再与CPU通信。
6、主板上显卡、硬盘等的插槽被称为适配器或控制器。
7、将输入设备和输出设备(外围I/O设备),尤其输入设备连接起来,随时通知CPU停下来
处理数据的芯片称为中断控制器;CPU识别中断控制器的标识即中断向量。
计算机操作系统发展历史:
为了解决穿孔机时代CPU在同一时间只能处理一个程序(批处理和脱机批处理)的问题,GE(通用电气),MIT(麻省理工学院),AT&T(美国电话电报公司)的Bell实验室共同研发了多用户、多任务、多层次的多用途通用系统——multics ,由于MULTICS比较昂贵和巨大,工程师们迷失,不知道该往哪个方向发展,导致GE、MIT退出,只剩下AT&T,Bell实验室习惯了使用multics,所以做出了multics运行
在mainframe,通过分频器,多个用户使用同一个计算机mainframe,假如Bell实验室的工程师从AT&T脱离出来,就不能使用了,而实验室的的ken有一个游戏space travel,要运行,就得自己有一个个multics,然后当时计算机很昂贵,所以ken在bell实验室发现了一台淘汰的PDP-7(DEC公司生产),并且使用汇编语言写了一个小系统,由于系统比较小,比较简单,所以他同事给系统起名为unics(单一的),并且其他同事对这个系统很感兴趣。
由于计算机的程序和计算机的CPU是密切相关的,所以在PDP-7上开发的系统不能再PDP-11上运行,因为CPU的针脚不一样,所以要运行,必须进行重新编译(代码移植),ken在研究激光照排系统时拥有了PDP-11的使用权,所以Unics流行起来,引起另外一个同事的注意,对其很感兴趣,所以一起和ken研究,最后简化重命名为unix,由于多次移植很痛苦,所以把B语言进行升级,升级后命名为C语言,用C这个高级语言重写Unix的源程序,只要有编译器,就可以根据不同CPU编译源程序之后运行在各种计算机上。1974年,这两人在杂志上发表了UNIX,所以很多学计算机的人很感兴趣,由于UNIX属于AT&T,然后AT&T被美国*反垄断法裁定,不能销售电报电话意外的任何商品,所以KEN在别人要UNIX系统的时候要一笔邮费,别人可以学习,并且很多其他人对其研发了很多新功能。1976年ken到加州大学伯克利分校任教,当时该学校已经拥有UNIX代码,并且有个小组(BSRG)专门研究UNIX,并且引进了很多新特性,加上其他人研发公布出来的新特性,研发了一种人机交互的接口csh,该系统叫做BSD(伯克利分校分发版本),并且进行销售。1980前后,Bell实验室再次由于反垄断法从AT&T分拆出来,就开始销售自己UNIX的System V系统(4W美元),由于版权法和昂贵的价格,一些人不使用System V,导致Bell实验室和BSD打起了官司,差不多十年。
当时,其他公司也看到BSD的利益,也自己打包UNIX开始发售,包括SGI、IBM(AIX)、SUN(solaris)、HP(HP-UX),当时在西雅图有家公司叫microsoft,也卖UNIX,叫XENIX。当时IBM已经有了PC机,使用inter80286的CPU,并且很丑陋,UNIX不能再其上运行,而当时UNIX的系统都使用摩托罗拉的CPU,M68000。IBM的PC机没有系统使用,而当时比尔盖茨的一个联合创世人的一个同学仿造称作PL/M的操作系统,花了四周时间研发了一个系统,这时比尔盖茨通过其创始人花了5W美元买了这个操作系统,比尔盖茨的母亲是IBM的董事会成员,所以通过他母亲找到IBM,向IBM卖许可证(license),一个license5美元,并且IBM同意比尔盖斯把这个license也卖给其他生产PC机的厂商,大概一年,就赚上千万美元,并且去掉了这个系统的原有标识,打进了microsoft的标识,称其系统为DOS(Disk Operating System)。IBM研发PC兼容机的时候,美国另一个公司apple公司,也专门卖PC兼容机,它使用的CPU是powerpc,并且系统源代码是封闭的,apple机也很漂亮,powerpc系统很稳定,而且运行了unix系统BSD,所以苹果公司PC机大卖特卖,由于创始人乔布斯人格比较偏激,结果被董事会赶出了apple公司,乔布斯离开apple之后又创建了pix动画公司,后来买给了迪士尼。由于apple在乔布斯离开之后一路走低,举步维艰,又请回了乔布斯。在APPLE公司创立不久,属于施乐公司的PARK实验室研发出来了一个程序GUI,研发了鼠标。由于施乐公司是做复印机,打印机的,害怕有了GUI没人使用打印机,所以停止了GUI的研发。而乔布斯一次进入park实验室发现了GUI,向施乐公司申请,买了GUI的一份儿拷贝,乔布斯组织团队,研发GUI,使用BSD内核,研发出了称为MAC的图形界面系统。这是比尔盖茨知道了,所以就可怜巴巴的找乔布斯,买了一份GUI拷贝说回去研究学习,并且偷偷的研发。当乔布斯准备与一家公司签约的时候,被比尔盖斯挖墙脚抢走了,并且比尔盖茨给自己的图形界面系统起名叫windows。由于比尔盖斯没有拿到MAC的核心技术,只是拿到了GUI,所以windows是运行在DOS的基础上,而DOS本来很丑陋,是个单用户单任务的系统,所以windows经常蓝屏。在这期间,UNIX仍在打仗,当发现apple和windows如此强大时,UNIX悔之晚矣。
DEC公司当时研发的是小型机PDP系列和VAX系列,VAX运行的是VMS系统,由于UNIX在小型机很流行,所以当DEC向别人销售的时候买家要求安装UNIX系统,所以DEC只好委屈的在VAX上安装UNIX,放弃了VMS系统,VMS研发团队被打入冷宫。由于windows经常蓝屏,技术不行,所以比尔盖茨找到VMS的项目负责人,并且带来了整个团队和VMS的技术,这帮人硬是把windows和VMS的核心技术结合在了一起,出现了windowsNT,并且出现了server版本,因此,也敲响了Novell公司(netware)的丧钟,因为微软服务器系统的傻瓜化和其图形操作界面,但是windows是一个补丁补起来的系统,所以系统不够稳定。在windowsNT诞生的时候,微软与IBM共同研发叫做OS2的操作系统,由于windowsNT的出现并且很火,所以微软退出了OS2的研发,结果IBM也未研发成功。当apple的界面越来越漂亮的时候,比尔盖茨又找IBM购买了OS2进行研发,即windows vista。
UNIX闭源以后,芬兰的一所大学里面的一个教授,通过UNIX讲授自己写的一个完全兼容UNIX,并且只有4000多行代码的新系统,在整个欧洲教授其系统,此系统叫做Minix。而别人又针对其系统开发了很多驱动之类的程序,想运行在Minix上,而这个教授为了保证其系统的纯净不允许,所以这些人就很郁闷,包括自己的一个学生linus。linus20岁生日的时候,他的外公(工作在相当于中国的工信部的部长)送给其一个80386的PC机,linus安装Minix,自己的一些驱动教授又不让安装,所以就干脆抹掉整个系统,自己写了一个操作系统,放在了当时的电子公告牌上公布出去,改名linux,并且完全兼容UNIX,和UNIX很像,所以称为类UNIX。由于闭源的问题,很多人不能使用UNIX,当时MIT中第一个人Richard Stallman,举起了*的大旗,认为软件属于大众,所以倡导*软件运动,任何人开发的源程序,*获取,*改编,*分发,*使用。当*软件运动发起之后,受到了世界上黑客的追捧,所以就开发了很多程序(比如vi、gcc等),当时由于没有开源的操作系统,很讽刺的是,开源程序只能运行在封闭的操作系统,在报国无门的时候,linux出现了,linux系统结合开源程序,迅速发展起来。但是linux不是给普通用户使用的,所以其入门很难,学习曲线比较陡峭,至许多人望而生畏,并且其好多功能普通用户使用不到,所以只覆盖在服务器领域。*软件运动当时被称为GNU,即GNU is not UNIX。system V在和BSD打官司,收回了公开权限,并且卖license,引起了黑客的一致反对。此时,GNU的一些代表成立了一些遵循*软件运动的协议,即GPL(举例,***的共产主义宣言),此协议规定遵循此协议的软件,必须要公开程序的源代码,第三方*获取,*改编,*分发,*使用,并且不能有任何商业利益,即使只是用了其1%的源码,也不能进行商业利益。由于GPL协议,很多第三方对开发程序失去积极性,所以GNU又规定了LGPL协议,此协议是GNU的妥协,任何第三方的个人或公司要使用别人的程序,在进行商业利益时,即使使用了别人1%的源码,也不能对其进行更改,但可以进行调用。GPL协议过于严苛,所以修订有了GPL V2,GPL V3版本。其他开源运动的组织倡导了其他开源协定,比如BSD也有了BSD协定,所以GNU只是开源运动的一个组成部分和重要生命军。由于BSD协定比GPL宽松很多,所以现在好多人遵循BSD协定。开源的目的是*free,但是开源并不定是免费,开源可以*使用,但是出现问题不进行负责,所以很多公司和作者就是卖服务。由于无论如何,程序不能跨平台运行,(除非是java和C#运行在虚拟机上的更高级语言开发),所以普通用户根据自己的平台编译程序是很困难的,没几个人能完成,因此有人专门针对不同的平台专门编译,并且专门开发一个安装程序,把二进制程序和安装程序放在一块,通过安装程序把编译的二进制程序安装到硬件上(比如一个软件有windows版本,有linux版本,有32位和64位的版本之分)。
专门包装发行linux发行版的公司有,Redhat(Linux+GNU+安装程序)、Slackware、Debian,现金全球三大linux发行版包装公司有Redhat、Debian(ubuntu)、SUSE,其他版本都是在这三个版本的基础上二次发行、三次发行,并且添加自己的公司标识。由于这些版本遵循GPL协议,所以这些公司卖服务,如果公开的系统有漏洞,它提供补丁的源码包,不提供编译好的二进制,所以如果不买服务,则自己编译的补丁能不能打上就是问题。加州大学伯克利分校的一个人为了不使此事发生,使用这些厂家的源码包,使用相同的方式进行编译,比如CentOS,所以CentOS发行时间大概比Redhat迟一个月。由于商业利益,这些公司像windows一样给发行版里面包装 了很多自己开发的程序,所以高级用户使用纯净的Slackware和Gentoo,更高级最纯净的版本为LFS(书,菜谱,告诉你去哪里下载相关的文件),自己做linux系统,内核及每一个程序需要自己编译,当然时间需要很长,可能需要几天。这些包装公司一般的版本有ALPBA(内测版),Beta(公测版),RC(发行候选)。BSD和贝尔实验室的System v打官司之后,BSD去掉了system V的代码,最后停止开发,有黑客开发为FreeBSD、OpenBSD、NetBSD,System V卖给Novell公司,Novell最后卖给了开源基金会,至今BSD和System V都不存在,而IBM、HP、SUN的UNIX仍存在。现在的Android:linux内核+java虚拟机;ios:FreeBSD+objectC。
总结:
*软件
1、为任何目的运行程序的*
2、学习和修改源程序的*
3、重新分发程序的*
4、基于某源程序开发衍生版的*
基本法则:
1、一切皆文件
2、体积渺小且目的的单一的程序
3、组合小程序,完成复杂任务
4、尽可能避免捕获用户接口
5、配置数据保存至文本文件
linux内核调度机制:
如果只有一个linux内核,而没有编译器类似的程序,只有内核是不能在硬件上运行的,所以linux内核提供了开源程序的平台,开源程序又催生了linux的发展,而底层的硬件要被上层应用使用,又需要驱动程序。
在多程序运行时,CPU进行时间分片(timeslice)分配给每个程序,并且程序要运行,必须在内存中,但是内存分片会形成内存碎片,所以最后出现了线性地址和物理地址。多程序同时运行时进行交替,简称切换,为了保证多个程序不互相打搅,在内存切换按时有序,所以把在内存中程序的副本,称为进程,实现对运行中程序资源分配的单位,所以一个基本内核,最基本的功能,应该具有:CPU时间分配、内存管理、进程管理、安全管理、驱动硬件,因此,每个硬件都必须有驱动程序,一些常用的驱动程序可以集成在内核中,不常用的就需要安装第三方驱动。
操作系统基本上分三个层次,最底层硬件-内核-应用程序,操作系统起来之后需要一个机制供用户操作(比如桌面,为人机接口),有一个程序供用户去管理其他应用程序,即shell,SHELL分两类:GUI图形用户接口和CLI命令行接口。为了保证内核的功能够底层,够简洁,够通用,内核将底层硬件的功能通过系统调用(system call)向上层应用程序提供,系统调用即函数。为了简化程序员的工作,将相应系统调用进行封装,形成通用功能,被称为库(被调用以后的程序)。库的调用方式有两种:静态编译和动态编译(例如windows中以.dll结尾的文件,linux中为C语言提供基本的底层运行库为glibc)。
在系统运行之后,内存中有一段空间只有内核才能访问,用户是无法访问的,用户是不能跟内核空间打交道的。比如说用户执行rm /tmp/test.txt,用户空间执行程序之后,发现需要删除文件,要操作硬件,而删除需要内核进行,所以CPU要陷入到内核模式,CPU分级别,用户空间在3,内核空间为0,只有在0级别下才能进行操作删除。所以不同平台的库调用机制不一样,库也不一样,所以不同程序在不能平台不能使用,因而为了保证库UNIX和LINUX库的兼容性,可移植性,形成了一个标准,即调用方式和输出结果是一样的,称作POS(可移植操作系统),后改名为POSIX,像POSIX规范,叫API规范(应用编程接口)。但API相同,ABI(应用二进制接口)不同,即在LINUX中编译好的程序在UNIX中不能执行,也就是执行格式不一样,如果重新编译,即可使用,然后ABI取决于库和内核。
文件类型及FHS:
高级格式化:申请一个区域,用于存放文件的索引,并且将整块磁盘划分成一个一个固定大小的可存储数据的磁盘块的过程,也叫做创建文件系统的过程
linux文件类型:
1、普通文件 -,d
2、目录文件 d
3、链接文件
符号链接(软链接)l
硬链接
4、特殊文件,用于作为硬件设备访问入口的文件
块设备,能够随机,按块进行存取的设备 b
字符设备,线性的按字符逐个存取的设备 c
5、套接字文件(socket) s
6、命名管道文件(prpe) p
FHS:文件系统层次结构标准(fhs-2.3-pdf)
/bin:二进制,为所有用户使用
/sbin:二进制,为管理员使用
/boot:内核,bootloader的存放位置
/dev:设备文件的存放位置
/etc:配置文件
/home:普通用户的家目录
/lib:基本共享库和内核模块
/media,/mnt:挂载点
/opt:可选的软件安装路径(用的不多,除非oracle等)
/root:管理员的家目录
/srv:某服务运行的中间数据
/tmp:临时文件,公共场所
/usr:
/usr/share
/usr/bin
/usr/lib
/usr/include
/usr/src
/usr/local/bin
/usr/local/sbin
/usr/local/lib
/var:经常发生变化的文件
/var/log:日志文件
/var/spool:缓冲文件(比如打印机的打印队列)
/var/run:服务的守护进程文件
/var/lock:
/var/mail:
/proc:伪文件目录,系统运行起来放在内存中的内核信息
/sys:伪文件目录,跟硬件设备相关的内核信息
/misc:杂项,不便归类的目录
/selinux:跟selinux相关的文件
命令:
内部命令:由shell程序自带的命令叫做内部命令;
外部命令:在系统的某个路径下,有一个与命令同名的可执行程序叫做外部命令。
查看内外部命令的命令:type 命令
命令选项:用于调整命令执行行为的开关。长选项,如果需要参数的话,通常需要使用等号,例如--size=1G
[]可选内容;<>必选内容;|多选一;...可以有多个;{}可展开。
文件系统,即文件管理系统,对文件管理的方式;定位文件的方式叫路径,pwd显示当前工作目录。
获取命令帮助信息:
内部命令,help
外部命令,--help、man、info
一、man:手册,是分章节的,一般有8个相关章节,常见的有1、5、8。如果在查看时有乱码,则可执行export LANG=en,即将语言设为英文
1、用户命令
2、系统调用
3、库调用
4、特殊文件,例如/dev/tty1
5、文件格式(命令的配置文件的语法)
6、游戏相关
7、杂项(不便归类的)
8、管理员命令
man的使用:翻屏操作:页,向后:Space 向前:b;行,向后:Enter,向前:k;退出:q
二、info:有超链接的文档,比man的信息更多,但是比较复杂,不常用。
三、一般应用程序在/usr/share/doc/app_name-version中有README帮助文档;INSTALLATION,安装信息、INSTALL等
四、google:
linux常用命令:
RHEL中:minge程序生成tty,
1、hwclock 查看主板时间;hwclock -w 以系统时间为准设定主板时间;hwclock -s 以主板时间为准设定系统时间
2、cal 显示日历;cal -3显示当前月及前后各一个月;cal 2014显示2014年的日历;cal -3 2014显示2014年3月份的日历;
3、halt关机命令;halt -p关闭系统时关闭电源,执行halt时默认会加上-p
4、reboot重启系统
5、shutdown 关机命令,选项较多;shutdown -r重启;shutdown -h关机;shutdown -c在执行关机或重启命令时取消关机;
6、cd改变目录;cd ;cd ~;cd ~wingkeung;cd .;cd ..;cd -在上次的目录和当前目录来回切换,cd在执行时有两个环境变量$PWD和$OLDPWD,分别用于保存当前目录和上次的目录,所以cd -才能在来回切换。
7、file/mkdir/rm/ls
8、ls:
-a,-A
-l
文件类型 文件权限 文件硬链接的个数(文件1个目录2个) 文件的属主 文件的属组 文件的大小 文件最近一次被修改的时间 文件名
-h 人性化
-d 只显示目录本身
-r 逆序
-R 递归查询
-i 节点,索引号码
9、mkdir:创建目录;mkdir -p创建递归目录;mkdir -v显示创建目录的过程;mkdir /tmp/{p,q}/{a,b}
10、rmdir:删除空目录;rmdir -p递归删除目录
11、tree:展示目录结构,比如tree /tmp
12、rm:删除文件及目录;rm -r递归删除;rm -f强制删除
13、cp:复制文件和目录;
cp -r递归复制目录;
cp -i复制时提醒,默认存在;
cp -p复制时保留原有的权限、属主和时间戳,一般只有管理员才能使用;
cp -a保留所有原有属性,相当于-drp选项
14、mv:移动或重命名文件和目录;
15、touch:改变时间戳,文件有三个时间,最近一次的访问时间;最近一次的修改时间(文件数据的改变);最近一次的改变时间(文件属性的改变)
16、stat:用于显示文件的所有元数据(属性)信息
17、nano:最简单的文本编辑器
18、file:后跟文件,用于显示用户文件内容的类型
19、cat:查看文本内容;cat -n显示文本内容行号;cat -E显示非打印字符,比如换行符;
20、tac:与cat查看的文本内容相倒,即逆序显示文本内容
21、more:分屏查看文本内容,文件尾部后直接退出
22、less:分屏查看文本内容,可以使用man中的翻屏查找功能
23、head:默认只查看文本前10行内容;head -3查看前三行
24、tail:默认只查看文本后10行内容;tail -3查看后三行;tail -f动态查看文件内容,对文件内容进行跟踪
25、cut:剪切文档的某些字段;例如cut -d: -f1,3 /etc/passwd,-d指定分隔符-f指定所剪切的分段;-d' '以空格为分隔符;
26、tr:对字符进行替换或删除;例如tr 'abc' 'ABC' < mytest.txt将小写abc替换为大写ABC;tr -d 'a' < mytest.txt删除文档中的a;
27、wc:文本统计命令;-l 行数;-w 单词数;-c 字符数;例如wc -l /etc/passwd统计/etc/passwd的行数;
28、sort:文本排序;sort /etc/fstab对/etc/fstab进行升序排列;sort -r /etc/fstab对其进行降序排序;-n按数值大小进行排序,默认按照字符进行排序;例如sort -n -t' ' -k3 /etc/passwd以空格分隔,以第三个字段进行排序;
29、hash:命令缓存表,查找速度非常快;hash -d wc清除wc的缓存;hash -r清空所有命令缓存
30、history:!24执行命令历史中的第24条;!!执行上一条命令;!-n执行倒数第n条命令;!echo执行倒数最近一次以echo开始的命令;按键盘Esc松开后按.、Alt+.或!$调用上一条命令的最后一个参数;export HISTCONTROL=ignorespace/ignoredups/ignoreboth;
history -c清空历史记录;
history -w保存缓存中的命令至历史文件;
history -d 16 3从第16条开始删除3条历史命令;
31、通配符,glob,特殊字符,元字符,不表示字符的表面意义,而是能匹配符合特征的字符串;
*:任意长度的任意字符;
?任意单个字符;
[]匹配指定范围内的任意单个字符,例如a[axy]b,a[a-zA-Z]b;
[^]指定范围之外的任意单个字符,例如[^a-z]=[^[:lower:]]
[[:alpha:]]=[a-zA-Z],
[[:digit:]]=[0-9],
[[:lower:]]=[a-z],
[[:upper:]]=[A-Z],
[[:alnum:]]=[a-zA-Z0-9],
[[:space:]]=空格,
[[:punct:]]相当于等号;
32、man 7 glob查看通配符的man说明
33、echo:显示字符;echo -n没有换行符;echo -e "hello\tworld"让转义符生效,\t表示制表符;
34、seq:
35、uniq:除掉重复切连续的行,只保留一行相同内容(和sort -u相同)
36、tee:既输出到管道又保留在屏幕上;COMMAND | tee FILE | COMMAND 例如:ls /etc | tee /tmp/tee.out | tr 'A-Z' 'a-z'
vim文本编辑器
文本编辑器
行编辑器:sed(流编辑器)
全屏幕编辑器:nano,emacs,vi,vim
vim(vi):模式化编辑器
编辑模式(命令模式):
输入模式:
末行模式:
vim启动:
vim [option] FILE…… 例如:vim /tmp/a.txt
option:
+# 打开时光标定位在第#行第一个字符
+ 打开时光标定位在最后一行第一个字符
vim退出:
:q
:q! 强制退出
:wq 保存退出 等同于:x
:w! 强制保存
模式转换:
编辑模式 --> 输入模式
i:当前光标所在字符前面插入
a:当前光标所在字符后面插入
o:当前光标所在行的下方新增空白行并输入
I:当前光标所在行的行首插入
A:当前光标所在行的行尾插入
O:当前光标所在行的上方新增空白行并输入
输入模式 --> 编辑模式
Esc
编辑模式 --> 末行模式
:
末行模式 --> 编辑模式
Esc
光标跳转:
h 左
j 下
k 上
l 右
词间跳转:
w 下个单词的词首
e 跳转至词尾
b 和e相反
行首、行尾:
^行首的第一个非空白字符
0 绝对行首
$ 绝对行尾
行间跳转:
#G 跳转到#行 gg跳转到第一行
G 跳转至文件尾部(最后一行)
末行模式下跳转:
:# 跳转到#行
翻屏操作:
ctrl+f 向文件尾部跳一屏
ctrl+b 和ctrl+f相反
ctrl+d 向文件尾部跳半屏
ctrl+u 和ctrl+d相反
删除:
x 删除光标前的一个字符
dd 删除当前所在行
#dd 删除从光标所在行开始的#行内容
d^ 删除光标之前到行首
d$ 删除光标到行尾
复制:
yy 复制当前行
#yy 复制从光标所在行开始的#行
y^ 复制光标之前到行首
y$ 复制光标到行尾
粘贴:
p 粘贴到光标所在位置之后
P 粘贴到光标所在位置之前
可视化模式:(选定)
v 按字符选取
V 按行选取
撤销编辑操作:
u 撤销上一次编辑操作
#u 撤销最近的#次操作
ctrl+r 对最近一次的撤销操作进行撤销
U 撤销对当前行所做的所有编辑
查找:
/搜索的词 向后搜索
?搜索的词 向前搜索
查找并替换:
末行模式下使用s命令格式:
:定界s/查找的内容/替换成的内容/gi
定界
% 全文查找
n,m
查找的内容
支持正则表达式
替换成的内容
不支持正则表达式,但可使用前向引用
g 全局替换
i 忽略大小写
& 用于引用查找到的整个字符串
注意:在查找时遇见和分隔符相同的字符必须用转义符进行转义
和shell交互:
末行模式下:
!shell command例如::!ls /var/spool/mail
将某些行进行另存为,例如::n,m /tmp/a.txt
水平拆分窗口:ctrl+w然后松开按s
垂直拆分窗口:ctrl+w然后松开按v
拆分窗口来回切换:ctrl+w然后松开按方向键
关闭某个窗口:ctrl+w然后松开按q
同时打开多个文件时,在末行模式下切换:
:next 切换至后一个文件
:prev 切换至前一个文件
:first 切换至第一个文件
:last 切换至最后一个文件
:wall 保存所有
:qall退出所有
:q!qll 强制退出所有
:e 新文件 打开新的文件
:r 新文件读入新文件
打开多个文件并拆分显示:
-o
-O
定制vim的工作属性:(末行模式下)
:set nu 显示行号
:set nonu 关闭行号
:set ai 自动缩进
:set noai 关闭缩进
:set 显示帮助
:set all显示所有属性
:set ic 忽略大小写
:set noic 关闭ic
:syntax on|off开启关闭语法高亮显示
:set hlsearch 打开查找高亮
:set nohlsearch关闭查找高亮
vim配置文件:
全局 /etc/vimrc
个人 ~/.vimrc(不存在,自己创建)
vimtotur:vim的练习题
用户和组的创建及其权限:
whatis shadow
man 5 shadow
Redhat用户密码默认加密方式:单项加密
单向加密的特性是:
定长输出
雪崩效应
明文一直,结果一直
不可逆
单向加密的类型:
md5:message degist,128bit
shal:secure hash algorithm,160bit
密码设定策略:
随机密码
至少应该包含四类字符中的三种
长度8位以上
定期修改
用户:
/etc/passwd
用户名:密码占位符:UID:GID:用户finger信息(为空):用户的家目录:用户默认使用的shell
/etc/shadow
用户名:密码(!!用户禁用):密码最近一次的修改时间:密码最短使用期限:密码最长使用期限:密码过期前向用户发警告的天数:用户账号的非活动期限:用户账号有限期限:保留
创建用户:useradd [option]…… 用户名
option:
-u 指定UID
-g GID为用户指定一个事先已经存在的组为基本组
-G GID为用户指定一个或多个已经存在的附加组
-c "COMMENT注释"
-d 指定用户的家目录
-s 指定用户的shell(可用shell,一般要求是出现在/etc/shells中的shell)
-e 指定用户账号的有效期
-M 不给用户创建家目录
-p 给用户指定加密以后的密码串(即密码是加密后的密码串,不能使明文密码)
-r 创建系统用户,1-499
创建用户是默认目录的文件/etc/default/useradd
设定密码:passwd [option] [用户名]
option:
-l 锁定用户
-u 解锁用户
--stdin 标准输入,例如:echo "hello" | passwd --stdin wingkeung > /dev/null
查看用户信息:
id [option] 用户名
-g 基本组GID
-G 用户所有组的GID
finger 用户名
who、w、whoami
修改用户属性:
usermod [用户名]
option:
-u
-g
-a -G
-c
-s
-m -d
-l
-L 锁定用户
-U 解锁用户
chage [option] [用户名]
chfn [用户名],改用户的finger(注释)信息
chsh [用户名],改用户的shell
删除用户:
userdel [option] 用户名
option:
-r 删除用户的家目录
组:
/etc/group
组名:组密码占位符:GID:以此组为其额外组用户的用户列表::::::
/etc/gshadow
创建组:groupadd [option]…… 组名
option:
-g 指定GID
-r 创建系统组,1-499
修改组:groupmod [option] 组名
删除组:groupdel 组名
设定组密码:gpasswd 组名
newgrp 组名,切换基本组
权限:
属主 属组 其他
u g o
r-x rwx r-- 574
rwx:
---,000,0
--x,001,1
-w-,010,2
-wx,011,3
r--,100,4
r-x,101,5
rw-,110,6
rwx,111,7
更改文件权限:
chmod [option] perm FILE………
option:
-R 递归权限
perm的指定方法:
例如:chmod 660 /tmp/a.txt
chmod u=rx /tmp/a.txt
chmod a=r /tmp/a.txt
更改文件属主,属组:
只有管理员才有权限改变文件的属主、属组
chown [option] 属主:属组 FILE……
chgrp [option] 属组 FILE……
用户切换命令:su
su 用户名非登录时切换
su - 用户名登录时切换
su -l 用户名登录时切换
su 用户名 -c ‘COMMAND’
sudo:
显示信息:
echo:
-n
-e
\n
\t
\033[3(1-7) 例如:echo -e "\033[3mabc\033[0m";echo -e "Time is \033[31m`date`\033[0m"
echo -e "\033[1;5;31mWarning\033[0m,change the password"
printf:
附加权限:
set位权限:s,只对文件有意义,多用于给可执行的程序或脚本文件进行设置,例如paaawd
粘滞位权限:t,对目录(公共目录,例如/tmp)有意义,设置粘滞位权限后,即使用户对该目录有写入权限,也不能删除该目录中其他用户的文件数据。
练习一:
1、创建一个账户jack,其ID为2002,基本组为hdpos(GID为3003),附加组为linux
2、创建一个用户fedora,其全名为Fedora Community,默认shell为csh
3、修改jack的ID号为4004,基本组为linux,附加组为hdpos和fedora
4、给fedora加密码,并设定其密码最短使用期限为2天,最长为50天
5、将jack的默认shell改为/bin/bash
练习二、
1、新建用户jerry,然后复制/etc/skel目录到/tmp,并重名为jerry,要求为/tmp/jerry目录指定权限,要求如下:
(1)、属主数组均为jerry,包含内部的所有文件
(2)、/tmp/jerry及其内部的所有文件的属组没有任何权限,其他用户也没有任何权限
(3)、将jerry的家目录修改为/tmp/jerry,并通过登录验证
df、du、fdisk:Linux磁盘管理三板斧
df命令:用于检查文件系统磁盘占用情况
df命令可以获取硬盘被占用了多少空间,目前还剩下多少空间等信息,它也可以显示所有文件系统对i节点和磁盘块的使用情况。
选项:
-a:显示所有文件系统的磁盘使用情况,包括0块(block)的文件系统,如/proc文件系统。
-k:以k字节为单位显示。
-i:显示i节点信息,而不是磁盘块。
-t:显示各指定类型的文件系统的磁盘空间使用情况。
-x:列出不是某一指定类型文件系统的磁盘空间使用情况(与t选项相反)。
-T:显示文件系统类型。
-P:显示时不自动换行。
-h: 进行单位换算显示。
举例:
1、列出各文件系统的磁盘空间使用情况
#df
Filesystem 1k-blocks Used Available Use% Mounted on
/dev/hda5 381139 332921 28540 93% /
/dev/hda1 46636 6871 37357 16% /boot
/dev/hda3 10041144 6632528 2898556 70% /home
none 127372 0 127372 0% /dev/shm
/dev/hda2 27474876 24130460 1948772 93% /usr
/dev/hda6 256667 232729 10686 96% /var
2、列出各文件系统的i节点使用情况
#df -ia
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/hda5 98392 23919 74473 25% /
none 0 0 0 - /proc
/dev/hda1 12048 38 12010 1% /boot
none 0 0 0 - /dev/pts
/dev/hda3 1275456 355008 920448 28% /home
none 31843 1 31842 1% /dev/shm
/dev/hda2 3489792 133637 3356155 4% /usr
/dev/hda6 66264 9876 56388 15% /var
3、列出文件系统的类型
#df -T
Filesystem Type 1k-blocks Used Available Use% Mounted on
/dev/hda5 ext3 381139 332921 28540 93% /
/dev/hda1 ext3 46636 6871 37357 16% /boot
/dev/hda3 ext3 10041144 6632528 2898556 70% /home
none tmpfs 127372 0 127372 0% /dev/shm
/dev/hda2 ext3 27474876 24130460 1948772 93% /usr
/dev/hda6 ext3 256667 232729 10686 96% /var2
du命令:检查磁盘空间占用情况
du的英文原义为“disk usage”,含义为显示磁盘空间的使用情况,统计目录(或文件)所占磁盘空间的大小。该命令的功能是逐级进入指定目录的每一个子目录并显示该目录占用文件系统数据块(1024字节)的情况。若没有给出指定目录,则对当前目录进行统计。
选项:
-s:对每个Names参数只给出占用的数据块总数。
-a:递归地显示指定目录中各文件及子目录中各文件占用的数据块数。若既不指定-s,也不指定-a,则只显示Names中的每一个目录及其中的各子目录所占的磁盘块数。
-b:以字节为单位列出磁盘空间使用情况(系统默认以k字节为单位)。
-k:以1024字节为单位列出磁盘空间使用情况。
-c:最后再加上一个总计(系统默认设置)。
-l:计算所有的文件大小,对硬链接文件,则计算多次。
-x:跳过在不同文件系统上的目录不予统计。
-h: 进行单位换算显示。
举例:
1、查看/mnt目录占用磁盘空间的情况
#du –abk /mnt
1 /mnt/cdrom
1 /mnt/floppy
3 /mnt
2、列出各目录所占的磁盘空间,但不详细列出每个文件所占的空间
#du
3684 ./log
84 ./libnids-1.17/doc
720 ./libnids-1.17/src
32 ./libnids-1.17/samples
1064 ./libnids-1.17
4944 .
输出清单中的第1列是以块为单位计的磁盘空间容量,第2列列出目录中使用这些空间的目录名称。
3、列出所有文件和目录所占的空间(使用a选项),并以字节为单位(使用b选项)来计算大小
#du –ab /root/mail
6144 mail/sent-mail
1024 mail/saved-messages
8192 mail
4、这可能是一个很长的清单,有时只需要一个总数。这时可在du命令中加-s选项来取得总数
#du –s /mnt
3 /mnt
fdisk命令:用于磁盘分区
下面给出使用Fdisk命令进行磁盘分区的操作帮助
#fdisk /dev/had //使用/dev/had作为默认的分区设备
Command (m for help): m //选择命令选项,用户通过提示键入“m”,可以显示Fdisk命令各个参数的说明
Command action
a toggle a bootable flag
b edit bsd disklabel
c toggle the dos compatibility flag
d delete a partition
l list known partition types
m print this menu
n add a new partition
o create a new empty DOS partition table
p print the partition table
q quit without saving changes
s create a new empty Sun disklabel
t change a partition's system id
u change display/entry units
v verify the partition table
w write table to disk and exit
x extra functionality (experts only)
正则表达式及linux文本处理三剑客(grep,sed,awk):
正则表达式(RE):
Basic RE(基本正则表达式):
.:匹配任意单个字符
[]:匹配指定范围内的任意单个字符
[^]:匹配指定范围外的任意单个字符
*:匹配其前的字符0,1或多次(次数匹配,贪婪模式下),例如:ab*c,abbc,ac,abbbc
?:匹配其前的字符0或1次(次数匹配),例如:ab?c
.*:匹配任意长度的任意字符
\{m,n\}:匹配其前m到n次(次数匹配),例如:a[a-z]\{0,2\}c
\{m,\}:至少m次
\{0,n\}:最多n次
\{m\}:精确匹配m次
锚定符:
单词锚定
\<:锚定词首,例如\<r..t,root
\>:锚定词尾,例如root\>
^:行首锚定,例如^root,^[[:space:]]*root
$:行尾锚定,例如root$,root[[:punct:]]\{0,1\}$
分组:
例如xa*b*y,xay,xby,xy,xaby
\(\),x\(ab\)*y
前向引用,\1,\2,\3
例如:grep.txt
he love his lover
she like her liker
he love his liker
she like her lover
grep --color=auto 'l..e.*l..er' grep.txt
grep --color=auto '\(l..e\).*\1(数字1)r' grep.txt
Extended RE(扩展正则表达式)
元字符
.
[]
[^]
个数
*
\?
+ 至少一次
{m,n}
锚定符
同基本正则表达式相同
或者:
|: 例如:a|b
分组:
()
linux文本处理三剑客:grep,sed,awk
grep命令:
Global RE(Regular Expression) Printing,文本过滤工具,能够实现根据指定的模式(pattern)逐行搜索文件内容,并将匹配到的行显示出来。
格式:
grep [option]……'PATTERN' FILE
模式:是由正则表达式的元字符,其它字符组成的匹配条件
选项:
-v 取反
--color=auto 颜色自动
-i 不区分字符大小写
-o 只显示匹配到的串,例如:ifconfig | grep -o 'inet addr:[[:space:]]*' | cut -d: -f2 | grep -v '127.0.0.1'
-A 2 匹配行向后多2行
-B 2 匹配行向前多2行
-C 2 匹配行前后多2行
-E 把元字符解释到扩展正则表达式
egrep 等同于 grep -E
举例:ifconfig | egrep -o '\<[1-9] | [1-9][0-9]\>'
fgrep 快速grep,不解析正则表达式,直接搜索文本
sed命令:
流式编辑器,行编辑器,不会更改源文件
格式:sed [option] 'script' input_file
sed -f 'script_file' input_file
命令:
d:删除 例如:sed '1d' /etc/fstab 删除/etc/fstab的第一行
p:打印、显示 例如:sed '1,3p' /etc/fstab 打印/etc/fstab的1到3行
a:追加,附加 例如:sed '/^\/a \# this is a / line' /etc/fstab
i:插入,和a相反,即在行前插入 例如:sed '/^\/i \# this is a /line. \n# hello world' /etc/fstab
c:和a、i类似,只是替换
r:/path/to/somefile
w:/path/to/somefile
s/PATTERN/string/,s@@@,s###
g:全局修改
i:不区分字符大小写
前向引用:
&
\1,\2
=:用于显示指定行的行号 例如:sed '/^\//=' /etc/fstab
y/source/dest/:逐个字符对应替换,类似于tr 'a-z' 'A-Z'
选项:
-n:静默模式 例如:sed -n '1,3p' /etc/fstab 只显示fstab的1到3行
-i:直接修改源文件
-e:一次性处理多次 例如:sed -e 's/^[[:space:]]\{1,\}\([^[:space:]]\{1,\}\)/\1/' -e 's/default/DEFAULT/' /boot/grup/grub.conf
-f /path/to/script_file 例如:sed -f sedscript /boot/grup/grup.conf (sedscript文件中存放-e后面的那两个编辑命令)
-r:支持扩展正则表达式
awk命令:
awk:是一种可以处理数据、产生格式化报表的语言,功能相当强大。awk的工作方式是读取数据文件,将每一行数据视为一条记录,每笔记录以字段分隔符分成若干字段,然后输出各个字段的值。
格式: awk [options' 'script' FILE1,FILE2……
awk [options] 'PATTERN {ACTION}' FILE1,FILE2……
举例:awk '{print $1}' a.txt
模式:
1、Regexp:正则表达式,格式为/regular expression/
2、expresssion:表达式,其值非0或为非空字符时满足条件,如:$1 ~ /foo或$1 == "magedu" ,用运算符~{匹配}和!~{不匹配}
3、Ranges:指定的匹配范围,格式为pat1,pat2
4、BEGIN/END:特殊模式,仅在awk命令执行前运行一次货结束前运行一次
5、Empty{空模式}:匹配任意输入行
常见的ACTION:
1、Expressions
2、control statements
3、compound statements
4、Input statements
5、Output statements
一、print:
选项:
-F 字段分隔符 例如:awk -F:'{print $1}' /etc/passwd
-v 声明一个变量 例如:awk -v FS=: '{print $NF}' /etc/passwd
内置变量:
NF 显示每行的最后一个字段 例如:awk '{print $NF}' /etc/passwd
FS 指定读入时的分隔符 例如: awk -v FS=: '{print $NF}' /etc/passwd
OFS 指定输出时的分隔符,则只能分隔本来以空白字符分隔的文本 例如:awk -v OFS=: '{print $1,$2}' /tmp/a.txt
二、printf
格式:printf format item1,item2,……
要点:
1、其与print命令的最大不同时,printf需要指定format
2、format用于指定后面的每个item的输出格式
3、printf语句不会自动打印换行符\n
format格式的指示符是以%开头,后跟一个字符,如下
%c 显示字符的ASCII码
%d,%i 十进制整数
%e,%E 科学计数法表示数值
%f 显示浮点数
%g,%G 以科学计数法的格式或浮点数的格式显示数值
%s 显示字符串
%u 无符号整数
%% 显示%自身
修饰符:
N 显示宽度(数字)
- 左对齐(默认右对齐)
+ 显示数值符号
举例:awk -F: '{printf "%-10s%s\n",$1,$2}' /etc/passwd
awk -F: '{printf "%-15S %i\n,$1,$3" > "/dev/stderr"} /etc/passwd
awk -F: '/bash/{print $1}' /etc/passwd
awk -F: '$3>=500{print $1,$3}' /etc/passwd
awk -F: 'BEGIN{print "Username UID"}{printf "%-15s%s\n",$1,$3}END{print "Over"}' /etc/passwd
练习一:
1、显示/proc/meminfo文件中以不区分大小的a开头的行
2、显示/etc/passwd中以nologin结尾的行
3、显示/etc/inittab中以#开头,且后面限一个或多个空白字符,而后又跟了任意非空白字符的行
4、显示/etc/inittab中包含了:一个数字:即两个 冒号中间一个数字的行
5、显示/boot/grub/grub.conf文件中以一个或多个空白字符开头的行
6、显示/etc/inittab文件中以一个数字开头并以一个与开头数字相同的数字结尾的行
练习二:
1、找出某文件中的,1位数,或2位数:/proc/cupinfo,/proc/meminfo
2、找出ifconfig命令结果中的1-255之间的整数
3、查找当前系统上名字为student(必须出现在行首)的用户的账号的相关信息,文件为/etc/passwd
练习三:
分析/etc/inittab文件中如下文本中前两行的特征(每一行中出现的数字必须相同),请写出可以精确找出类似两行的模式
11:1:wait:/etc/rc.d/rc 1
13:3:wait:/etc/rc.d/rc 3
11:1:wait:/etc/rc.d/rc 3
13:1:wait:/etc/rc.d/rc 3