1、pwd
目前所在的工作目录的绝对路径名称
#pwd
/root/linuxdaxue.com/testDir
2、mkdir和mkdir -p的区别
mkdir -p xx/yy 的好处就是一次可以创建多级文件夹。若 xx 文件夹不存在,则先创建 xx 文件夹,然后在 xx 文件夹下创建 yy 文件夹。
3、tee命令
ls | tee ls.txt
将会在终端上显示ls命令的执行结果,并把执行结果输出到ls.txt文件中,将会覆盖原文件的内容,若无ls.txt
文件,将会自动创建该文件ls | tee -a ls.txt
保留ls.txt文件中原来的内容,并把ls命令的执行结果追加到ls.txt文件的最后,不覆盖原来的内容
ls | tee file1.txt file2.txt
将执行结果同时保存到file1和file2中。
4、cat和more操作
转自:https://www.cnblogs.com/duhuo/p/6026506.html
Linux 查看文件 cat与 more 用法 1、cat 显示文件连接文件内容的工具; cat 是一个文本文件查看和连接工具。查看一个文件的内容,用cat比较简单,就是cat 后面直接接文件名。 比如: [root@localhost ~]# cat /etc/fstab 为了便于新手弟兄灵活掌握这个工具,我们多说一点常用的参数; 1.0 cat 语法结构; cat [选项] [文件]... 选项 -A, --show-all 等价于 -vET -b, --number-nonblank 对非空输出行编号 -e 等价于 -vE -E, --show-ends 在每行结束处显示 $ -n, --number 对输出的所有行编号 -s, --squeeze-blank 不输出多行空行 -t 与 -vT 等价 -T, --show-tabs 将跳格字符显示为 ^I -u (被忽略) -v, --show-nonprinting 使用 ^ 和 M- 引用,除了 LFD 和 TAB 之外 --help 显示此帮助信息并离开 1.1 cat 查看文件内容实例; [root@localhost ~]# cat /etc/profile 注:查看/etc/目录下的profile文件内容; [root@localhost ~]# cat -b /etc/fstab 注:查看/etc/目录下的profile内容,并且对非空白行进行编号,行号从1开始; [root@localhost ~]# cat -n /etc/profile 注:对/etc目录中的profile的所有的行(包括空白行)进行编号输出显示; [root@localhost ~]# cat -E /etc/profile 注:查看/etc/下的profile内容,并且在每行的结尾处附加$符号; cat 加参数-n 和nl工具差不多,文件内容输出的同时,都会在每行前面加上行号; [root@localhost ~]# cat -n /etc/profile [root@localhost ~]# nl /etc/profile cat 可以同时显示多个文件的内容,比如我们可以在一个cat命令上同时显示两个文件的内容; [root@localhost ~]# cat /etc/fstab /etc/profile cat 对于内容极大的文件来说,可以通过管道|传送到more 工具,然后一页一页的查看; [root@localhost ~]# cat /etc/fstab /etc/profile | more 1.2 cat 的创建、连接文件功能实例; cat 有创建文件的功能,创建文件后,要以EOF或STOP结束; [root@localhost ~]# cat > linuxsir.org.txt << EOF 注:创建linuxsir.org.txt文件; > 我来测试 cat 创建文件,并且为文件输入内容; 注:这是为linuxsir.org.txt文件输入内容; > 北南南北 测试; 注:这是为linuxsir.org.txt文件输入内容; > EOF 注:退出编辑状态; [root@localhost ~]# cat linuxsir.org.txt 注:我们查看一下linuxsir.org.txt文件的内容; 我来测试 cat 创建文件,并且为文件输入内容; 北南南北 测试; cat 还有向已存在的文件追加内容的功能; [root@localhost ~]# cat linuxsir.txt 注:查看已存在的文件linuxsir.txt 内容; I am BeiNanNanBei From LinuxSir.Org . 注:内容行 我正在为cat命令写文档 [root@localhost ~]# cat >> linuxsir.txt << EOF 注:我们向linuxsir.txt文件追加内容; > 我来测试cat向文档追加内容的功能; 注:这是追回的内容 > OK? > OK~ > 北南 呈上 > EOF 注:以EOF退出; [root@localhost ~]# cat linuxsir.txt 注:查看文件内容,看是否追回成功。 I am BeiNanNanBei From LinuxSir.Org . 我正在为cat命令写文档 我来测试cat向文档追加内容的功能; OK? OK~ 北南 呈上 cat 连接多个文件的内容并且输出到一个新文件中; 假设我们有sir01.txt、sir02.tx和sir03.txt ,并且内容如下; [root@localhost ~]# cat sir01.txt 123456 i am testing [root@localhost ~]# cat sir02.txt 56789 BeiNan Tested [root@localhost ~]# cat sir03.txt 09876 linuxsir.org testing 我想通过cat 把sir01.txt、sir02.txt及sir03.txt 三个文件连接在一起(也就是说把这三个文件的内容都接在一起)并输出到一个新的文件sir04.txt 中。 注意:其原理是把三个文件的内容连接起来,然后创建sir04.txt文件,并且把几个文件的内容同时写入sir04.txt中。特别值得一提的是,如果您输入到一个已经存在的sir04.txt 文件,会把sir04.txt内容清空。 [root@localhost ~]# cat sir01.txt sir02.txt sir03.txt > sir04.txt [root@localhost ~]# more sir04.txt 123456 i am testing 56789 BeiNan Tested 09876 linuxsir.org testing cat 把一个或多个已存在的文件内容,追加到一个已存在的文件中 [root@localhost ~]# cat sir00.txt linuxsir.org forever [root@localhost ~]# cat sir01.txt sir02.txt sir03.txt >> sir00.txt [root@localhost ~]# cat sir00.txt linuxsir.org forever 123456 i am testing 56789 BeiNan Tested 09876 linuxsir.org testing 警告:我们要知道>意思是创建,>>是追加。千万不要弄混了。造成失误可不是闹着玩的; 2、more 文件内容或输出查看工具; more 是我们最常用的工具之一,最常用的就是显示输出的内容,然后根据窗口的大小进行分页显示,然后还能提示文件的百分比; [root@localhost ~]# more /etc/profile 2.1 more 的语法、参数和命令; more [参数选项] [文件] 参数如下: +num 从第num行开始显示; -num 定义屏幕大小,为num行; +/pattern 从pattern 前两行开始显示; -c 从顶部清屏然后显示; -d 提示Press space to continue, 'q' to quit.(按空格键继续,按q键退出),禁用响铃功能; -l 忽略Ctrl+l (换页)字符; -p 通过清除窗口而不是滚屏来对文件进行换页。和-c参数有点相似; -s 把连续的多个空行显示为一行; -u 把文件内容中的下划线去掉 退出more的动作指令是q 2.2 more 的参数应用举例; [root@localhost ~]# more -dc /etc/profile 注:显示提示,并从终端或控制台顶部显示; [root@localhost ~]# more +4 /etc/profile 注:从profile的第4行开始显示; [root@localhost ~]# more -4 /etc/profile 注:每屏显示4行; [root@localhost ~]# more +/MAIL /etc/profile 注:从profile中的第一个MAIL单词的前两行开始显示; 2.3 more 的动作指令; 我们查看一个内容较大的文件时,要用到more的动作指令,比如ctrl+f(或空格键) 是向下显示一屏,ctrl+b是返回上一屏; Enter键可以向下滚动显示n行,要通过定,默认为1行; 我们只说几个常用的; 自己尝试一下就知道了; Enter 向下n行,需要定义,默认为1行; Ctrl+f 向下滚动一屏; 空格键 向下滚动一屏; Ctrl+b 返回上一屏; = 输出当前行的行号; :f 输出文件名和当前行的行号; v 调用vi编辑器; ! 命令 调用Shell,并执行命令; q 退出more 当我们查看某一文件时,想调用vi来编辑它,不要忘记了v动作指令,这是比较方便的; 2.4 其它命令通过管道和more结合的运用例子; 比如我们列一个目录下的文件,由于内容太多,我们应该学会用more来分页显示。这得和管道 | 结合起来,比如: [root@localhost ~]# ls -l /etc |more 3、less 查看文件内容 工具; less 工具也是对文件或其它输出进行分页显示的工具,应该说是linux正统查看文件内容的工具,功能极其强大;您是初学者,我建议您用less。由于less的内容太多,我们把最常用的介绍一下; 3.1 less的语法格式; less [参数] 文件 常用参数 -c 从顶部(从上到下)刷新屏幕,并显示文件内容。而不是通过底部滚动完成刷新; -f 强制打开文件,二进制文件显示时,不提示警告; -i 搜索时忽略大小写;除非搜索串中包含大写字母; -I 搜索时忽略大小写,除非搜索串中包含小写字母; -m 显示读取文件的百分比; -M 显法读取文件的百分比、行号及总行数; -N 在每行前输出行号; -p pattern 搜索pattern;比如在/etc/profile搜索单词MAIL,就用 less -p MAIL /etc/profile -s 把连续多个空白行作为一个空白行显示; -Q 在终端下不响铃; 比如:我们在显示/etc/profile的内容时,让其显示行号; [root@localhost ~]# less -N /etc/profile 3.2 less的动作命令; 进入less后,我们得学几个动作,这样更方便 我们查阅文件内容;最应该记住的命令就是q,这个能让less终止查看文件退出; 动作 回车键 向下移动一行; y 向上移动一行; 空格键 向下滚动一屏; b 向上滚动一屏; d 向下滚动半屏; h less的帮助; u 向上洋动半屏; w 可以指定显示哪行开始显示,是从指定数字的下一行显示;比如指定的是6,那就从第7行显示; g 跳到第一行; G 跳到最后一行; p n% 跳到n%,比如 10%,也就是说比整个文件内容的10%处开始显示; /pattern 搜索pattern ,比如 /MAIL表示在文件中搜索MAIL单词; v 调用vi编辑器; q 退出less !command 调用SHELL,可以运行命令;比如!ls 显示当前列当前目录下的所有文件; 就less的动作来说,内容太多了,用的时候查一查man less是最好的。在这里就不举例子了; 4、head 工具,显示文件内容的前几行; head 是显示一个文件的内容的前多少行; 用法比较简单; head -n 行数值 文件名; 比如我们显示/etc/profile的前10行内容,应该是: [root@localhost ~]# head -n 10 /etc/profile 5、tail 工具,显示文件内容的最后几行; tail 是显示一个文件的内容的后多少行; 用法比较简单; tail -n 行数值 文件名; 比如我们显示/etc/profile的最后5行内容,应该是: [root@localhost ~]# tail -n 5 /etc/profile
6、显示文件某行
head -n 7777|tail -n 7776 文件名
显示文件前7777行的7776行的内容
5、chomd 755
chmod是Linux下设置文件权限的命令,后面的数字表示不同用户或用户组的权限。 一般是三个数字: 第一个数字表示文件所有者的权限 第二个数字表示与文件所有者同属一个用户组的其他用户的权限 第三个数字表示其它用户组的权限。 权限分为三种:读(r=4),写(w=2),执行(x=1)。综合起来还有可读可执行(rx=5=4+1)、可读可写(rw=6=4+2)、可读可写可执行(rwx=7=4+2+1)。 所以,chmod 755 设置用户的权限为: 1.文件所有者可读可写可执行 2.与文件所有者同属一个用户组的其他用户可读可执行 3.其它用户组可读可执行 chmod 4755与chmod 755 的区别在于开头多了一位,这个4表示其他用户执行文件时,具有与所有者相当的权限。 例如:root用户创建了一个上网认证程序netlogin,如果其他用户要上网也要用到这个程序,那就需要root用户运行chmod 755 netlogin命令使其他用户也能运行netlogin。 但是netlogin执行时可能需要访问一些只有root用户才有权访问的文件,那么其他用户执行netlogin时可能因为权限不够还是不能上网。 这种情况下,就可以用 chmod 4755 netlogin 设置其他用户在执行netlogin也有root用户的权限,从而顺利上网。 777就是rwxrwxrwx,意思是该登录用户(可以用命令id查看)、他所在的组和其他人都有最高权限 指令名称 : chmod 使用权限 : 所有使用者 使用方式 : chmod [-cfvR] [--help] [--version] mode file... 说明 : Linux/Unix 的档案存取权限分为三级 : 档案拥有者、群组、其他。利用 chmod 可以藉以控制档案如何被他人所存取。 参数格式 : mode : 权限设定字串,格式如下 : [ugoa...][[+-=][rwxX]...][,...],其中 u : 表示该档案的拥有者,g 表示与该档案的拥有者属于同一个群体(group)者,o 表示其他以外的人,a 表示这三者皆是。 + : 表示增加权限、- 表示取消权限、= 表示唯一设定权限。 r : 表示可读取,w 表示可写入,x 表示可执行,X 表示只有当该档案是个子目录或者该档案已经被设定过为可执行。 -c : 若该档案权限确实已经更改,才显示其更改动作 -f : 若该档案权限无法被更改也不要显示错误讯息 -v : 显示权限变更的详细资料 -R : 对目前目录下的所有档案与子目录进行相同的权限变更(即以递回的方式逐个变更) --help : 显示辅助说明 --version : 显示版本 范例 :将档案 file1.txt 设为所有人皆可读取 : chmod ugo+r file1.txt 将档案 file1.txt 设为所有人皆可读取 : chmod a+r file1.txt 将档案 file1.txt 与 file2.txt 设为该档案拥有者,与其所属同一个群体者可写入,但其他以外的人则不可写入 : chmod ug+w,o-w file1.txt file2.txt 将 ex1.py 设定为只有该档案拥有者可以执行 : chmod u+x ex1.py 将目前目录下的所有档案与子目录皆设为任何人可读取 : chmod -R a+r * 此外chmod也可以用数字来表示权限如 chmod 777 file 语法为:chmod abc file 其中a,b,c各为一个数字,分别表示User、Group、及Other的权限。 r=4,w=2,x=1 若要rwx属性则4+2+1=7; 若要rw-属性则4+2=6; 若要r-x属性则4+1=7。 范例: chmod a=rwx file 和chmod 777 file效果相同 chmod ug=rwx,o=x file和chmod 771 file效果相同 若用chmod 4755 filename可使此程式具有root的权限
6、tail
tail 命令可用于查看文件的内容,有一个常用的参数 -f 常用于查阅正在改变的日志文件。 tail -f filename 会把 filename 文件里的最尾部的内容显示在屏幕上,并且不断刷新,只要 filename 更新就可以看到最新的文件内容。 命令格式: tail [参数] [文件]
参数:
- -f 循环读取
- -q 不显示处理信息
- -v 显示详细的处理信息
- -c<数目> 显示的字节数
- -n<行数> 显示文件的尾部 n 行内容
- --pid=PID 与-f合用,表示在进程ID,PID死掉之后结束
- -q, --quiet, --silent 从不输出给出文件名的首部
- -s, --sleep-interval=S 与-f合用,表示在每次反复的间隔休眠S秒
实例
要显示 notes.log 文件的最后 10 行,请输入以下命令:
tail notes.log
要跟踪名为 notes.log 的文件的增长情况,请输入以下命令:
tail -f notes.log
此命令显示 notes.log 文件的最后 10 行。当将某些行添加至 notes.log 文件时,tail 命令会继续显示这些行。 显示一直继续,直到您按下(Ctrl-C)组合键停止显示。
显示文件 notes.log 的内容,从第 20 行至文件末尾:
tail +20 notes.log
显示文件 notes.log 的最后 10 个字符:
tail -c 10 notes.log
7、切换路径cd
cd .. 返回上一级目录 cd ../.. 返回上两级目录 cd或cd ~ 返回home目录 cd - 目录名 返回指定目录
cd da*:如果以da开头的是唯一的文件夹,就会进入到该文件夹下。
8、查看ls
ls :显示当前目录所有文件 ls -l:显示当前目录的所有文件及权限情况 ls -lrt:表示按修改时间倒序列出当前目录下的文件 ls da*:显示以da开头的文件(如果以da开头的是唯一的文件夹,会显示该文件夹下的文件) ls *da:显示以da结尾的文件
9、tar 转:https://www.cnblogs.com/yhongji/p/9348487.html
Linux tar命令 tar功能,1)将多个文文件打包为一个文件,2)将文件打包并压缩,3)将打包的文件解包,4)将打包压缩的文件解压 1、用法 tar [选项] [文件..] 2、命令选项 -A, --catenate 追加 tar 文件至归档 -c, --create 创建一个新归档 -r, --append 追加文件至归档结尾 -u, --update 仅追加比归档中副本更新的文件 -x, --extract, --get 从归档中解出文件 -t, --list 列出归档内容 -z, --gzip, --gunzip, --ungzip 通过 gzip 压缩归档 -j, --bzip2 通过 bzip2 压缩归档 -J, --xz 通过 xz 过滤归档 --lzip 通过 lzip 过滤归档 --lzma 通过 lzma 过滤归档 -Z, --compress, --uncompress 通过 compress 压缩归档 -v, --verbose 详细地列出处理的文件过程 -k, --keep-old-files 保留源文件不覆盖 -m, --touch 不要解压文件的修改时间 -W, --verify 在写入以后尝试校验归档 f, --file=ARCHIVE 使用归档文件或 ARCHIVE 设备,这个参数是最后一个,后面只接文件名 -b, --blocking-factor=BLOCKS 设置每个记录 BLOCKS x 512 字节 -C, --directory=DIR 改变至目录 DIR --help 显示帮助信息 --version 显示版本信息 3、实例 1)将 1.txt 2.txt 3.txt 4.txt 文件打包为 test.tar [root@mini ~]# ls 1.txt 2.txt 3.txt 4.txt anaconda-ks.cfg [root@mini ~]# tar -cvf test.tar *.txt 1.txt 2.txt 3.txt 4.txt [root@mini ~]# ls 1.txt 2.txt 3.txt 4.txt anaconda-ks.cfg test.tar 2)将 1.txt 2.txt 3.txt 4.txt 文件打包并压缩为 test.tar.gz [root@mini ~]# ls 1.txt 2.txt 3.txt 4.txt anaconda-ks.cfg test.tar [root@mini ~]# tar -zcvf test.tar.gz *.txt 1.txt 2.txt 3.txt 4.txt [root@mini ~]# ls 1.txt 2.txt 3.txt 4.txt anaconda-ks.cfg test.tar test.tar.gz 3)将 1.txt 2.txt 3.txt 4.txt 文件打包并压缩为 test.tar.bz2 [root@mini ~]# ls 1.txt 2.txt 3.txt 4.txt anaconda-ks.cfg test.tar test.tar.gz [root@mini ~]# tar -jcvf test.tar.bz2 *.txt 1.txt 2.txt 3.txt 4.txt [root@mini ~]# ls 1.txt 2.txt 3.txt 4.txt anaconda-ks.cfg test.tar test.tar.bz2 test.tar.gz 4)列出 test.tar 里的文件 [root@mini ~]# tar -tf test.tar 1.txt 2.txt 3.txt 4.txt 5)将 test.tar 解包 [root@mini ~]# ls anaconda-ks.cfg test.tar test.tar.bz2 test.tar.gz [root@mini ~]# tar -xvf test.tar 1.txt 2.txt 3.txt 4.txt [root@mini ~]# ls 1.txt 2.txt 3.txt 4.txt anaconda-ks.cfg test.tar test.tar.bz2 test.tar.gz 6)将 test.tar.gz 解压 [root@mini ~]# ls anaconda-ks.cfg test.tar test.tar.bz2 test.tar.gz [root@mini ~]# tar -zxvf test.tar.gz 1.txt 2.txt 3.txt 4.txt [root@mini ~]# ls 1.txt 2.txt 3.txt 4.txt anaconda-ks.cfg test.tar test.tar.bz2 test.tar.gz 7)将 test.tar.bz2 解压 [root@mini ~]# ls anaconda-ks.cfg test.tar test.tar.bz2 test.tar.gz [root@mini ~]# tar -jxvf test.tar.bz2 1.txt 2.txt 3.txt 4.txt [root@mini ~]# ls 1.txt 2.txt 3.txt 4.txt anaconda-ks.cfg test.tar test.tar.bz2 test.tar.gz
10、diff
将目录/tmp/下的文件"test.txt"与当前目录下的文件"test.txt"进行比较,输入如下命令:
diff /tmp/test.txt test.txt #使用diff指令对文件进行比较
diff是Unix系统的一个很重要的工具程序。
它用来比较两个文本文件的差异,是代码版本管理的基石之一。你在命令行下,输入:
1
|
$ diff <变动前的文件> <变动后的文件> |
diff比较两个文件或文件集合的差异,并记录下来,生成一个diff文件,这也是我们常说的补丁文件。也使用patch命令对相应的文件打补丁。它的显示结果不太好懂,下面我就来说明,如何读懂diff。
1
2
3
4
5
6
7
8
|
FILES的格式: FILE1 FILE2 :源是一个文件,目标也是文件。这两个文件必须是文本文件。以逐行的方式,比较文本文件的异同处。 DIR1 DIR2 :源是一个目录,目标是目录。diff 命令会比较两个目录下名字相同的文本文件,依照字母次序排序,列出不同的二进制文件,列出公共子目录,列出只在一个目录出现的文件。 FILE DIR :源是一个文件,目标是目录。diff命令把源文件与目标目录下的同名文件比较。 DIR FILE :源是一个目录,目标是文件(不是目录)。源目录下所有文件中与目标文件同名的文件,将用来与目标文件比较。 FILE 可以是“-”,代表由标准输入设备读入的文本。DIR不能是 "-" 。 被指定的文件不能是标准的输入。 |
短选项 | 长选项 | 含义 |
---|---|---|
-i | --ignore-case | 忽略文件内容大小写的区别 |
--ignore-file-name-case | 忽略文件名大小写的区别 | |
--no-ignore-file-name-case | 不忽略文件名大小写的区别 | |
-E | --ignore-tab-expansion | 忽略由制表符宽度造成的差异 |
-b | --ignore-space-change | 忽略由空格数不同造成的差异 |
-w | --ignore-all-space | 忽略所有空格 |
-B | --ignore-blank-lines | 忽略任何因空行而造成的差异 |
-I | --ignore-matching-lines=RE | 如果某行匹配正则表达式,则忽略由该行造成的差异 |
-a | --text | 所有文件都以文本方式处理 |
--strip-trailing-cr | 去除输入内容每行末端的 carriage return 字符 | |
-c 或 或 -C 行数 | --context[=行数] | 显示指定<行数>(默认 3 行)copied 格式的上下文 |
-u 或 -U 行数 | --unified[=行数] | 显示指定<行数>(默认 3 行)unified 格式的上下文(合并的方式) |
--label 标识 | 使用<标识>代替文件名称 | |
-p | --show-c-function | 显示和每个差异有关的 C 函数名称 |
-F | --show-function-line=RE | 显示最接近而符合<正则表示式>的一行 |
-q | --brief | 只显示文件是否不同 |
-e | --ed | 以 ed script 方式输出 |
--normal | 以正常的 diff 方式输出 | |
-n | --rcs | 以 RCS diff 格式输出 |
-y | --side-by-side | 以两列并排的方式显示 |
-W | --width=NUM | 每行显示最多 NUM (默认 130) 个字符 |
--left-column | 当有两行相同时只显示左边的一行 | |
--suppress-common-lines | 当有两行相同时不会显示 | |
-D | --ifdef=NAME | 输出的内容以‘#ifdef NAME’方式标明差异 |
--GTYPE-group-format=GFMT | 效果类似,但会以 GFMT 格式处理 GTYPE 输入的行 可以是LTYPE的选择或是‘changed’ |
|
--line-format=LFMT | 效果类似,但会以 LFMT 格式处理每一行资料 | |
--LTYPE-line-format=LFMT | 效果类似,但会以 LFMT 格式处理 LTYPE 输入的行 LTYPE 可以是‘old’、‘new’或‘unchanged’。 |
|
-l | --paginate | 将输出送至‘pr’指令来分页 |
-t | --expand-tabs | 将输出中的 tab 转换成空格 |
-T | --initial-tab | 每行先加上 tab 字符,使 tab 字符可以对齐 |
--tabsize=NUM | 定位字符 (tab) 的宽度,默认为 8 个空格宽 | |
--suppress-blank-empty | suppress space or tab before empty output lines | |
-r | --recursive | 递归比较子目录中的文件 |
-N | --new-file | 不存在的文件以空文件方式处理 |
--unidirectional-new-file | 若第一文件案不存在,以空文件处理 | |
-s | --report-identical-files | 文件相同则报告,否则无任何提示 |
-x | --exclude=PAT | 排除匹配 PAT 的文件 |
-X | --exclude-from=FILE | 排除所有匹配在 FILE 中列出的模式的文件 |
-S | --starting-file=FILE | 当比较目录時,由 FILE 开始比较 |
--from-file=FILE1 | 将 FILE1 和操作数中的所有文件/目录作比较。FILE1 可以是目录 | |
--to-file=FILE2 | 将操作数中的所有文件/目录和 FILE2 作比较。FILE2 可以是目录 | |
--horizon-lines=NUM | keep NUM lines of the common prefix and suffix | |
-d | --minimal | 尽可能找出最小的差异 |
--speed-large-files | 假设文件十分大而且其中含有许多微小的差异 |
一、diff的三种格式
由于历史原因,diff有三种格式:
1
2
3
|
* 正常格式(normal diff) * 上下文格式(context diff) * 合并格式(unified diff) |
我们依次来看。
二、示例文件
为了便于讲解,先新建两个示例文件。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
log2014. log 内容 2013-01 2013-02 2014-03 2013-04 2013-05 2013-06 2013-07 2013-07 2013-09 2013-10 2013-11 2013-12 log2013. log 内容 2013-01 2013-02 2013-03 2013-04 2013-05 2013-06 2013-07 2013-08 2013-09 2013-10 |
三、正常格式的diff
diff输出格式(默认):
n1 a n3,n4 表示在文件1的n1行后面添加n3到n4行
n1,n2 d n3 表示删除n1到n2行,合并到目标文件的n3行
n1,n2 c n3,n4 表示把n1,n2行用n3,n4行替换掉
字母a:表示附加(add)
字符c:表示修改(change)
字符d:表示删除(delete)
字母前的是源文件,字母后是目标文件。Nx表示行号。
以”<”打头的行属于第一个文件,以”>”打头的行属于第二个文件。
比较两个文件
1
2
3
4
5
6
7
8
9
10
11
12
|
[root@localhost test3]# diff log2014. log log2013. log 3c3 < 2014-03 --- > 2013-03 8c8 < 2013-07 --- > 2013-08 11,12d10 < 2013-11 < 2013-12 |
上面的“3c3”和“8c8”表示log2014.log和log20143log文件在3行和第8行内容有所不同;"11,12d10"表示第一个文件比第二个文件多了第11和12行。
以”<”打头的行属于第一个文件,以”>”打头的行属于第二个文件。
并排格式输出
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
[root@localhost test3]# diff log2014. log log2013. log -y -W 50 2013-01 2013-01 2013-02 2013-02 2014-03 | 2013-03 2013-04 2013-04 2013-05 2013-05 2013-06 2013-06 2013-07 2013-07 2013-07 | 2013-08 2013-09 2013-09 2013-10 2013-10 2013-11 < 2013-12 < [root@localhost test3]# diff log2013. log log2014. log -y -W 50 2013-01 2013-01 2013-02 2013-02 2013-03 | 2014-03 2013-04 2013-04 2013-05 2013-05 2013-06 2013-06 2013-07 2013-07 2013-08 | 2013-07 2013-09 2013-09 2013-10 2013-10 > 2013-11 > 2013-12 |
说明:
“|”表示前后2个文件内容有不同
“<”表示后面文件比前面文件少了1行内容
“>”表示后面文件比前面文件多了1行内容
四、上下文格式的diff
上个世纪80年代初,加州大学伯克利分校推出BSD版本的Unix时,觉得diff的显示结果太简单,最好加入上下文,便于了解发生的变动。因此,推出了上下文格式的diff。
它的使用方法是加入c参数(代表context)。
1
|
[root@localhost test3]# diff log2013. log log2014. log -c |
显示结果如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
*** log2013. log 2012-12-07 16:36:26.000000000 +0800 --- log2014. log 2012-12-07 18:01:54.000000000 +0800 *************** *** 1,10 **** 2013-01 2013-02 ! 2013-03 2013-04 2013-05 2013-06 2013-07 ! 2013-08 2013-09 2013-10 --- 1,12 ---- 2013-01 2013-02 ! 2014-03 2013-04 2013-05 2013-06 2013-07 ! 2013-07 2013-09 2013-10 + 2013-11 + 2013-12 |
这种方式在开头两行作了比较文件的说明,这里有三中特殊字符:
“+” 比较的文件的后者比前着多一行
“-” 比较的文件的后者比前着少一行
“!” 比较的文件两者有差别的行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
[root@localhost test3]# diff log2014. log log2013. log -c *** log2014. log 2012-12-07 18:01:54.000000000 +0800 --- log2013. log 2012-12-07 16:36:26.000000000 +0800 *************** *** 1,12 **** 2013-01 2013-02 ! 2014-03 2013-04 2013-05 2013-06 2013-07 ! 2013-07 2013-09 2013-10 - 2013-11 - 2013-12 --- 1,10 ---- 2013-01 2013-02 ! 2013-03 2013-04 2013-05 2013-06 2013-07 ! 2013-08 2013-09 2013-10 |
五、合并格式的diff
如果两个文件相似度很高,那么上下文格式的diff,将显示大量重复的内容,很浪费空间。1990年,GNU diff率先推出了"合并格式"的diff,将比较文件的上下文合并在一起显示。
它的使用方法是加入u参数(代表unified)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
[root@localhost test3]# diff log2014. log log2013. log -u --- log2014. log 2012-12-07 18:01:54.000000000 +0800 +++ log2013. log 2012-12-07 16:36:26.000000000 +0800 @@ -1,12 +1,10 @@ 2013-01 2013-02 -2014-03 +2013-03 2013-04 2013-05 2013-06 2013-07 -2013-07 +2013-08 2013-09 2013-10 -2013-11 -2013-12 |
第一部分,也是文件的基本信息:
--- log2014.log 2012-12-07 18:01:54.000000000 +0800
+++ log2013.log 2012-12-07 16:36:26.000000000 +0800
"---"表示变动前的文件,"+++"表示变动后的文件。
第二部分,变动的位置用两个@作为起首和结束
@@ -1,12 +1,10 @@
前面的"-1,12"分成三个部分:减号表示第一个文件(即log2014.log),"1"表示第1行,"12"表示连续12行。意思:第一个文件从第1行开始的连续12行。
同样的,"+1,10" 表示第二个文件从第1行开始的连续10行。
11、cp
将当前目录下的a.sh文件拷贝到 /home/shell 目录下:
cp a.sh /home/shell/
12、rm
-r 就是向下递归,不管有多少级目录,一并删除 -f 就是直接强行删除,不作任何提示的意思 删除文件夹实例: rm -rf /var/log/httpd/access 将会删除/var/log/httpd/access目录以及其下所有文件、文件夹 删除文件使用实例: rm -f /var/log/httpd/access.log 将会强制删除/var/log/httpd/access.log这个文件
13、topsa
TOPAS命令详解 Topas命令可以监控系统活动――memory,I/O,paging space,cpu,process。 此命令包含在perfagent.tools文件集里面
14、vmstat https://www.cnblogs.com/ftl1012/p/vmstat.html
vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存、进程、CPU活动进行监控。是对系统的整体情况进行统计,不足之处是无法对某个进程进行深入分析。 物理内存和虚拟内存区别 我们知道,直接从物理内存读写数据要比从硬盘读写数据要快的多,因此,我们希望所有数据的读取和写入都在内存完成,而内存是有限的,这样就引出了物理内存与虚拟内存的概念。 物理内存就是系统硬件提供的内存大小,是真正的内存,相对于物理内存,在linux下还有一个虚拟内存的概念,虚拟内存就是为了满足物理内存的不足而提出的策略,它是利用磁盘空间虚拟出的一块逻辑内存,用作虚拟内存的磁盘空间被称为交换空间(Swap Space)。 作为物理内存的扩展,linux会在物理内存不足时,使用交换分区的虚拟内存,更详细的说,就是内核会将暂时不用的内存块信息写到交换空间,这样以来,物理内存得到了释放,这块内存就可以用于其它目的,当需要用到原始的内容时,这些信息会被重新从交换空间读入物理内存。 linux的内存管理采取的是分页存取机制,为了保证物理内存能得到充分的利用,内核会在适当的时候将物理内存中不经常使用的数据块自动交换到虚拟内存中,而将经常使用的信息保留到物理内存。 要深入了解linux内存运行机制,需要知道下面提到的几个方面: 首先,Linux系统会不时的进行页面交换操作,以保持尽可能多的空闲物理内存,即使并没有什么事情需要内存,Linux也会交换出暂时不用的内存页面。这可以避免等待交换所需的时间。 其次,linux进行页面交换是有条件的,不是所有页面在不用时都交换到虚拟内存,linux内核根据”最近最经常使用“算法,仅仅将一些不经常使用的页面文件交换到虚拟内存,有时我们会看到这么一个现象:linux物理内存还有很多,但是交换空间也使用了很多。其实,这并不奇怪,例如,一个占用很大内存的进程运行时,需要耗费很多内存资源,此时就会有一些不常用页面文件被交换到虚拟内存中,但后来这个占用很多内存资源的进程结束并释放了很多内存时,刚才被交换出去的页面文件并不会自动的交换进物理内存,除非有这个必要,那么此刻系统物理内存就会空闲很多,同时交换空间也在被使用,就出现了刚才所说的现象了。关于这点,不用担心什么,只要知道是怎么一回事就可以了。 最后,交换空间的页面在使用时会首先被交换到物理内存,如果此时没有足够的物理内存来容纳这些页面,它们又会被马上交换出去,如此以来,虚拟内存中可能没有足够空间来存储这些交换页面,最终会导致linux出现假死机、服务异常等问题,linux虽然可以在一段时间内自行恢复,但是恢复后的系统已经基本不可用了。 因此,合理规划和设计linux内存的使用,是非常重要的。 虚拟内存原理 在系统中运行的每个进程都需要使用到内存,但不是每个进程都需要每时每刻使用系统分配的内存空间。当系统运行所需内存超过实际的物理内存,内核会释放某些进程所占用但未使用的部分或所有物理内存,将这部分资料存储在磁盘上直到进程下一次调用,并将释放出的内存提供给有需要的进程使用。 在Linux内存管理中,主要是通过“调页Paging”和“交换Swapping”来完成上述的内存调度。调页算法是将内存中最近不常使用的页面换到磁盘上,把活动页面保留在内存中供进程使用。交换技术是将整个进程,而不是部分页面,全部交换到磁盘上。 分页(Page)写入磁盘的过程被称作Page-Out,分页(Page)从磁盘重新回到内存的过程被称作Page-In。当内核需要一个分页时,但发现此分页不在物理内存中(因为已经被Page-Out了),此时就发生了分页错误(Page Fault)。 当系统内核发现可运行内存变少时,就会通过Page-Out来释放一部分物理内存。尽管Page-Out不是经常发生,但是如果Page-out频繁不断的发生,直到当内核管理分页的时间超过运行程式的时间时,系统效能会急剧下降。这时的系统已经运行非常慢或进入暂停状态,这种状态亦被称作thrashing(颠簸)。 常见命令展示 1 vmstat 5 5 【在5秒时间内进行5次采样】 image 字段说明: Procs(进程): r: 运行队列中进程数量 b: 等待IO的进程数量 Memory(内存): swpd: 使用虚拟内存大小 free: 可用内存大小 buff: 用作缓冲的内存大小 cache: 用作缓存的内存大小 Swap: si: 每秒从交换区写到内存的大小 so: 每秒写入交换区的内存大小 IO:(现在的Linux版本块的大小为1024bytes) bi: 每秒读取的块数 bo: 每秒写入的块数 系统: in: 每秒中断数,包括时钟中断。【interrupt】 cs: 每秒上下文切换数。 【count/second】 CPU(以百分比表示): us: 用户进程执行时间(user time) sy: 系统进程执行时间(system time) id: 空闲时间(包括IO等待时间),中央处理器的空闲时间 。以百分比表示。 wa: 等待IO时间 备注: 如果r经常大于4,id经常少于40,表示cpu的负荷很重。 如果bi,bo长期不等于0,表示内存不足。 如果disk经常不等于0,且在b中的队列大于3,表示io性能不好。 Linux在具有高稳定性、可靠性的同时,具有很好的可伸缩性和扩展性,能够针对不同的应用和硬件环境调整,优化出满足当前应用需要的最佳性能。因此企业在维护Linux系统、进行系统调优时,了解系统性能分析工具是至关重要的。 显示活跃和非活跃内存 vmstat -a 2 5 【-a 显示活跃和非活跃内存,所显示的内容除增加inact和active】 image 显示从系统启动至今的fork数量 vmstat -f 【 linux下创建进程的系统调用是fork】 image 说明: 信息是从/proc/stat中的processes字段里取得的 查看内存使用的详细信息 vmstat -s 【显示内存相关统计信息及多种系统活动数量】 image 说明:这些信息的分别来自于/proc/meminfo,/proc/stat和/proc/vmstat 查看磁盘的读/写 vmstat -d 【查看磁盘的读写】 image 说明:这些信息主要来自于/proc/diskstats. 查看/dev/sda1磁盘的读/写 vmstat -p /dev/sda1 【显示指定磁盘分区统计信息】 image 说明:这些信息主要来自于/proc/diskstats. reads:来自于这个分区的读的次数。 read sectors:来自于这个分区的读扇区的次数。 writes:来自于这个分区的写的次数。 requested writes:来自于这个分区的写请求次数。 查看系统的slab信息 vmstat -m 说明:这些信息主要来自于/proc/slabinfo slab:由于内核会有许多小对象,这些对象构造销毁十分频繁,比如i-node,dentry,这些对象如果每次构建的时候就向内存要一个页(4kb),这样就会非常浪费,为了解决这个问题,就引入了一种新的机制来处理在同一个页框中如何分配小存储区,而slab可以对小对象进行分配,这样就不用为每一个对象分配页框,从而节省了空间,内核对一些小对象创建析构很频繁,slab对这些小对象进行缓冲,可以重复利用,减少内存分配次数。 查看进程路径 [root@localhost ~]# netstat -an | grep 2158 [root@localhost ~]# ll /proc/2158 image cwd符号链接的是进程运行目录; exe符号连接就是执行程序的绝对路径; cmdline就是程序运行时输入的命令行命令; environ记录了进程运行时的环境变量; fd目录下是进程打开或使用的文件的符号连接。 lsof -p 2158 image 作者:小a玖拾柒 出处:http://www.cnblogs.com/ftl1012/ ------------------------------------------- 个性签名: 所有的事情到最後都是好的,如果不好,那說明事情還沒有到最後~ 本文版权归作者【小a玖拾柒】和【博客园】共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利!
15、df
df用来检查linux服务器的文件系统的磁盘空间占用情况。可以利用df来获取硬盘被占用了多少空间,剩多少空间。 功能: 显示指定文件的可用空间。如果没有文件名被指定,则所有当前被挂在的文件系统的可用空间将被显示。 默认情况下,磁盘空间将以1KB为单位进行显示,除非环境变量POSIXLY_CORRECT被指定,那样将以512字节为单位显示。 常用选项: -a,--all:全部文件系统列表 -B, --block-size=SIZE:指定分区块大小 -h:人类可阅读的方式显示 -i:以inode模式来显示磁盘使用情况 -k:区块为1024字节 -m:区块为1048576字节 -l:只显示本地文件系统 --no-sync:忽略sync命令 -P:输出格式为POSIX --sync:在取得磁盘信息前,先执行sync命令 -T:文件系统类型 -t<文件系统类型>只显示指定类型文件系统的磁盘信息 -x<文件系统类型>不示指定类型文件系统的磁盘信息 df:
第一列:代表文件系统对应的设备文件的路径名 第二列:给出分区包含的数据块(1024字节)的数目 第三,四列:分别是已用和可用的数据块数目 第三四列数目之和不等于第二列,这是因为缺省的每个分区都留了少量空间供管理员使用;即使遇到管理员空间已满的情况下,管理员仍能登陆和留有解决问题所需的 工作空间。清单中,Use%表示普通用户所占的百分比,既使这一数字达到百分之百,分区仍能留有管理员使用的空间。Mounted on表示文件系统的挂载点。 df -i:以inode来显示磁盘使用情况
df -ia:列出各文件系统i节点使用情况
df -t:显示指定类型磁盘 df -T:累出文件系统类型
16.vi https://blog.csdn.net/cyl101816/article/details/82026678
vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指令。由于对Unix及Linux系统的任何版本,vi编辑器是完全相同的,因此您可以在其他任何介绍vi的地方进一步了解它。Vi也是Linux中最基本的文本编辑器,学会它后,您将在Linux的世界里畅行无阻。 1、vi的基本概念 基本上vi可以分为三种状态,分别是命令模式(command mode)、插入模式(Insert mode)和底行模式(last line mode),各模式的功能区分如下: 1) 命令行模式command mode) 控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到 last line mode。 2) 插入模式(Insert mode) 只有在Insert mode下,才可以做文字输入,按「ESC」键可回到命令行模式。 3) 底行模式(last line mode) 将文件保存或退出vi,也可以设置编辑环境,如寻找字符串、列出行号……等。 不过一般我们在使用时把vi简化成两个模式,就是将底行模式(last line mode)也算入命令行模式command mode)。 2、vi的基本操作 a) 进入vi 在系统提示符号输入vi及文件名称后,进入vi之后,是处于「命令行模式(command mode)」,您要切换到「插入模式(Insert mode)」才能够输入文字。初次使用vi的人都会想先用上下左右键移动光标,结果电脑一直哔哔叫,把自己气个半死,所以进入vi后,先不要乱动,转换到「插入模式(Insert mode)」再说吧! b) 切换至插入模式(Insert mode)编辑文件 在「命令行模式(command mode)」下按一下字母「i」就可以进入「插入模式(Insert mode)」,这时候你就可以开始输入文字了。 c) Insert 的切换 目前处于「插入模式(Insert mode)」,就只能一直输入文字,如果发现输错了字!想用光标键往回移动,将该字删除,就要先按一下「ESC」键转到「命令行模式(command mode)」再删除文字。 d) 退出vi及保存文件 在「命令行模式(command mode)」下,按一下「:」冒号键进入「Last line mode」,例如: : w filename (输入 「w filename」将文章以指定的文件名filename保存) : wq (输入「wq」,存盘并退出vi) : q! (输入q!, 不存盘强制退出vi) 3、命令行模式(command mode)功能键 1). 插入模式 按「i」切换进入插入模式「insert mode」,按"i"进入插入模式后是从光标当前位置开始输入文件; 按「a」进入插入模式后,是从目前光标所在位置的下一个位置开始输入文字; 按「o」进入插入模式后,是插入新的一行,从行首开始输入文字。 2). 从插入模式切换为命令行模式 按「ESC」键。 3). 移动光标 vi可以直接用键盘上的光标来上下左右移动,但正规的vi是用小写英文字母「h」、「j」、「k」、「l」,分别控制光标左、下、上、右移一格。 按「ctrl」+「b」:屏幕往"后"移动一页。 按「ctrl」+「f」:屏幕往"前"移动一页。 按「ctrl」+「u」:屏幕往"后"移动半页。 按「ctrl」+「d」:屏幕往"前"移动半页。 按数字「0」:移到文章的开头。 按「G」:移动到文章的最后。 按「$」:移动到光标所在行的"行尾"。 按「^」:移动到光标所在行的"行首" 按「w」:光标跳到下个字的开头 按「e」:光标跳到下个字的字尾 按「b」:光标回到上个字的开头 按「#l」:光标移到该行的第#个位置,如: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行行首。 4、Last line mode下命令简介 在使用「last line mode」之前,请记住先按「ESC」键确定您已经处于「command mode」下后,再按「:」冒号即可进入「last line mode」。 A) 列出行号 「set nu」:输入「set nu」后,会在文件中的每一行前面列出行号。 B) 跳到文件中的某一行 「#」:「#」号表示一个数字,在冒号后输入一个数字,再按回车键就会跳到该行了,如输入数字15,再回车,就会跳到文章的第15行。 C) 查找字符 「/关键字」:先按「/」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按「n」会往后寻找到您要的关键字为止。 「?关键字」:先按「?」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按「n」会往前寻找到您要的关键字为止。 D) 保存文件 「w」:在冒号输入字母「w」就可以将文件保存起来。 E) 离开vi 「q」:按「q」就是退出,如果无法离开vi,可以在「q」后跟一个「!」强制离开vi。 「qw」:一般建议离开时,搭配「w」一起使用,这样在退出的时候还可以保存文件。 5、vi命令列表 1、下表列出命令模式下的一些键的功能: h 左移光标一个字符 l 右移光标一个字符 k 光标上移一行 j 光标下移一行 ^ 光标移动至行首 0 数字"0",光标移至文章的开头 G 光标移至文章的最后 $ 光标移动至行尾 Ctrl+f 向前翻屏 Ctrl+b 向后翻屏 Ctrl+d 向前翻半屏 Ctrl+u 向后翻半屏 i 在光标位置前插入字符 a 在光标所在位置的后一个字符开始增加 o 插入新的一行,从行首开始输入 ESC 从输入状态退至命令状态 x 删除光标后面的字符 #x 删除光标后的#个字符 X (大写X),删除光标前面的字符 #X 删除光标前面的#个字符 dd 删除光标所在的行 #dd 删除从光标所在行数的#行 yw 复制光标所在位置的一个字 #yw 复制光标所在位置的#个字 yy 复制光标所在位置的一行 #yy 复制从光标所在行数的#行 p 粘贴 u 取消操作 cw 更改光标所在位置的一个字 #cw 更改光标所在位置的#个字 2、下表列出行命令模式下的一些指令 w filename 储存正在编辑的文件为filename wq filename 储存正在编辑的文件为filename,并退出vi q! 放弃所有修改,退出vi set nu 显示行号 /或? 查找,在/后输入要查找的内容 n 与/或?一起使用,如果查找的内容不是想要找的关键字,按n或向后(与/联用)或向前(与?联用)继续查找,直到找到为止。 对于第一次用vi,有几点注意要提醒一下: 1、用vi打开文件后,是处于「命令行模式(command mode)」,您要切换到「插入模式(Insert mode)」才能够输入文字。切换方法:在「命令行模式(command mode)」下按一下字母「i」就可以进入「插入模式(Insert mode)」,这时候你就可以开始输入文字了。 2、编辑好后,需从插入模式切换为命令行模式才能对文件进行保存,切换方法:按「ESC」键。 3、保存并退出文件:在命令模式下输入:wq即可!(别忘了wq前面的:) 在屏幕上移动 Vi提供了三个关于光标在全屏幕上移动并且文件本身不发生滚动的命令。它们分别是H、M和L命令。 H命令 该命令将光标移至屏幕首行的行首(即左上角),也就是当前屏幕的第一行,而不是整个文件的第一行。利用此命令可以快速将光标移至屏幕顶部。若在H命令之前加上数字n,则将光标移至第n行的行首。 M命令 该命令将光标移至屏幕显示文件的中间行的行首。即如果当前屏幕已经充满,则移动到整个屏幕的中间行;如果并未充满,则移动到文本的那些行的中间行。利用此命令可以快速地将光标从屏幕的任意位置移至屏幕显示文件的中间行的行首。例如,在上面屏幕显示的情况下(不论光标在屏幕的何处),在命令模式下,输入命令M之后,光标都将移到add这一行的字母a上。 同样值得一提的是,使用命令dM将会删除从光标当前所在行至屏幕显示文件的中间行的全部内容。 L命令 当文件显示内容超过一屏时,该命令将光标移至屏幕上的最底行的行首;当文件显示内容不足一屏时,该命令将光标移至文件的最后一行的行首。可见,利用此命令可以快速准确地将光标移至屏幕底部或文件的最后一行。若在L命令之前加上数字n,则将光标移至从屏幕底部算起第n行的行首。例如,在上面屏幕显示的情况下(不论光标在屏幕的何处),在命令模式下,输入命令3L之后,光标都将移到x++这一行的字母x上。 同样值得一提的是,使用命令dL将会删除从光标当前行至屏幕底行的全部内容。 按字移动光标 首先介绍一下Vi中“字”的概念。在Vi中“字”有两种含义。一种是广义的字,它可以是两个空格之间的任何内容。另一种字是狭义上的字,在此种意义之下,英文单词、标点符号和非字母字符(如!、@、#、$、%、^、&、*、(、)、-、+、{、}、[、]、~、|、"、<、>、/等)均被当成是一个字。因此,上面那一行中就包括{、int、k、;这4个字。 Vi中使用大写命令一般就是指将字作为广义来对待,使用小写命令就是作为狭义对待。 搞清楚Vi中字的含义后,我们就可以介绍按字移动光标的命令了。 Vi 一共提供了三组关于按字移动光标的命令,分别是: w和W命令 将光标右移至下一个字的字首; e和E命令 如果光标起始位置处于字内(即非字尾处),则该命令将把光标移到本字字尾;如果光标起始位置处于字尾,则该命令将把光标移动到下一个字的字尾。 b和B 如果光标处于所在字内(即非字首),则该命令将把光标移至本字字首;如果光标处于所在字字首,则该命令将把光标移到上一个字的字首。 按句移动光标 在Vi中,一个句子被定义为是以逗号(,)、句号(.)、问号(?)和感叹号(!)结尾,且其后面跟着至少两个以上(含两个)空格或一个换行符的字符序列。 Vi提供了关于按句移动光标的两个命令,分别为: 1. ( 命令 将光标移至上一个句子的开头。 2. ) 命令 该命令将光标移至下一个句子的开头。 按段移动光标 在Vi中,一个段被定义为是以一个空白行开始和结束的片段。Vi提供了关于按段移动光标的两个命令,分别为: 1. { 命令 该命令将光标向前移至上一个段的开头; 2. } 命令 该命令将光标向后移至下一个段的开头。 屏幕滚动 屏幕命令是以屏幕为单位移动光标的,常用于文件的滚屏和分页。需要注意的是,屏幕命令不是光标移动命令,不能作为文本限定符用于删除命令中。 在命令模式下和文本输入模式下均可以使用屏幕滚动命令。 1. 滚屏命令 关于滚屏命令有两个: · < Ctrl+u > 将屏幕向前(文件头方向)翻滚半屏; · < Ctrl+d > 将屏幕向后(文件尾方向)翻滚半屏。 可以在这两个命令之前加上一个数字n,则屏幕向前或向后翻滚n行。并且这个值被系统记住,以后再用< Ctrl+u >和< Ctrl+d >命令滚屏时,还滚相应的行数。 2. 分页命令 关于分页命令也有两个: · < Ctrl+f > 将屏幕向文件尾方向翻滚一整屏(即一页); · < Ctrl+b > 将屏幕向文件首方向翻滚一整屏(即一页)。 同样也可以在这两个命令之前加上一个数字n,则屏幕向前或向后移动n页。 3. 状态命令< Ctrl+G > 命令显示在vi状态行上的vi状态信息,包括正在编辑的文件名、是否修改过、当前行号、文件的行数以及光标之前的行占整个文件的百分比。 4. 屏幕调零命令 Vi 提供了三个有关屏幕调零的命令。它们的格式分别为: · [行号] z [行数] <回车> · [行号] z [行数] . · [行号] z [行数] _ 若省略了行号和行数,这三个命令分别为将光标所在的当前行作为屏幕的首行、中间行和最末行重新显示;若给出行号,那么该行号所对应的行就作为当前行显示在屏幕的首行、中间行和最末行;若给出行数,则它规定了在屏幕上显示的行数。 [例13] 8z16<回车> :将文件中的第8行作为屏幕显示的首行,并一共显示16行。 15z . :将文件中的第15行作为屏幕显示的中间行,显示行数为整屏。 15z 5_ :将文件中的第15行作为屏幕显示的最末行,显示行数为5行。 文本插入操作 在命令模式下用户输入的任何字符都被Vi当作命令加以解释执行,如果用户要将输入的字符当作是文本内容时,则首先应将Vi的工作模式从命令模式切换到文本输入模式。切换的方式是使用下面的命令。 插入(Insert)命令 Vi提供了两个插入命令:i和 I。 i命令 插入文本从光标所在位置前开始,并且插入过程中可以使用键删除错误的输入。此时Vi处于插入状态,屏幕最下行显示“--INSERT--”(插入)字样。 I命令 该命令是将光标移到当前行的行首,然后在其前插入文本。 附加(append)命令 Vi提供了两个附加插入命令:a和A。 a命令 该命令用于在光标当前所在位置之后追加新文本。新输入的文本放在光标之后,在光标后的原文本将相应地向后移动。光标可在一行的任何位置。 A命令 该命令与a命令不同的是,A命令将把光标挪到所在行的行尾,从那里开始插入新文本。当输入A命令后,光标自动移到该行的行尾。 a和A命令是把文本插入到行尾的唯一方法。 打开(open)命令 不论是Insert命令也好,还是append命令也好,所插入的内容都是从当前行中的某个位置开始的。若我们希望在某行之前或某行之后插入一些新行,则应使用open命令。 Vi提供了两个打开命令:o和O。 o命令 该命令将在光标所在行的下面新开一行,并将光标置于该行的行首,等待输入文本。要注意,当使用删除字符时只能删除从插入模式开始的位置以后的字符,对于以前的字符不起作用。而且还可以在文本输入方式下输入一些控制字符,例如,Ctrl+l即是插入分页符,显示为^L。 O命令 和o命令相反,O命令是在光标所在行的上面插入一行,并将光标置于该行的行首,等待输入文本。 11.3.4 文本修改 在命令模式下可以使用Vi提供的各种有关命令对文本进行修改,包括对文本内容的删除、复制、取代和替换等。 文本删除 在编辑文本时,经常需要删除一些不需要的文本,我们可以用键将输错或不需要的文本删除,但此时有一个限制就是当删到行头之后,再想删上面那行的内容是不可能的。 在命令模式下,Vi提供了许多删除命令。这些命令大多是以d开头的。常用的有: 1. 删除单个字符 x: 删除光标处的字符。若在x之前加上一个数字n,则删除从光标所在位置开始向右的n个字符。 X:删除光标前面的那个字符。若在X之前加上一个数字n,则删除从光标前面那个字符开始向左的n个字符。 显然这两个命令是删除少量字符的快捷方法。 2. 删除多个字符 dd:删除光标所在的整行。在dd前可加上一个数字n,表示删除当前行及其后n-1行的内容。 D或d$:两命令功能一样,都是删除从光标所在处开始到行尾的内容。 d0:删除从光标前一个字符开始到行首的内容。 dw:删除一个单词。若光标处在某个词的中间,则从光标所在位置开始删至词尾。同dd命令一样,可在dw之前加一个数字n,表示删除n个指定的单词。 如果用户不小心进行了误删除操作,也不要紧,Vi提供了恢复误操作的命令,并且可以将恢复的内容移动,放在文本的任何地方。恢复命令用² np,其中n为寄存器号。这是因为Vi内部有9个用于维护删除操作的寄存器,分别用数字1,2,¼ ,9表示,它们分别保存以往用dd命令删除的内容。这些寄存器组成一个队列,例如最近一次使用dd命令删除的内容被放到寄存器1中;当下次再使用dd命令删除文本内容时,Vi将把寄存器1的内容转存到寄存器2中,而寄存器1中又将是最近一次dd命令删除的内容。以此类推,Vi可以保存有最近九次用dd命令删除的内容,而前面的用dd命令删除的内容则被抛弃。 在最末行模式下,也可以对文件内容进行删除,但它只能删除整行,一次可将某个指定范围内(起始行号,终止行号)的所有行全部删除。需要注意的是,用此种方法进行删除时,Vi并不把所删内容放入寄存器中,因而当发生误删除操作时,不能用² np命令恢复,只能用u命令进行有限的恢复。 最后提一下,如何在文本输入方式时将所输入文本删除。用户使用组合键即可,此时光标将返回插入开始的位置,并且Vi仍处于文本输入方式。 取消上一命令(Undo) 取消上一命令(Undo),也称复原命令,是非常有用的命令,它可以取消前一次的误操作或不合适的操作对文件造成的影响,使之回复到这种误操作或不合适操作被执行之前的状态。 取消上一命令有两种形式,在命令模式下键入字符u和U。它们的功能都是取消刚才输入的命令,恢复到原来的情况。小写u和大写U在具体细节上有所不同,二者的区别在于,大写U命令的功能是恢复到误操作命令前的情况,即如果插入命令后使用U命令,就删除刚刚插入的内容;如果删除命令后使用U命令,就相当于在光标处又插入刚刚删除的内容。这里把所有修改文本的命令都视为插入命令。也就是说,U命令只能取消前一步操作,如果用U命令撤消了前一步操作,当再按U键时,并不是撤消再前一步的操作,而是撤消了刚才U命令执行的操作,也就是又恢复到第一次使用U命令之前的状态,结果是什么都没做。而小写u命令的功能是把当前行恢复成被编辑前的状态,而不管此行被编辑了多少次。 注意:对于取消命令仍可以再使用取消命令。这时会产生一种“负负得正”的效果,文件状态将恢复到第一次执行取消命令之前的状态,如同没做任何操作一般。例如在上例中,再使用一次命令U,屏幕将显示的内容仍为插入后的内容。 重复命令(Redo) 重复命令也是一个非常常用的命令。在文本编辑中经常会碰到需要机械地重复一些操作,这时就需要用到重复命令。它可以让用户方便地再执行一次前面刚完成的某个复杂的命令。 重复命令只能在命令模式下工作,在该模式下按“.”键既可。执行一个重复命令时,其结果是依赖于光标当前位置的。 文本内容的修改 文本内容的修改是指在编辑过程中,可以对文本中的某些字符,某些行进行修改,即用新输入的文本代替需要修改的老文本,它等于先用删除命令删除需要修改的内容,然后再利用插入命令插入新的内容。所以在使用修改命令后,vi进入到文本输入模式下,当输入完新的内容后,一定要再按回到命令模式,否则Vi会一直认为是在文本输入模式下,此时输入的任何内容都被认为是修改的新内容。 Vi提供了三种修改命令,分别是c、C和cc。它们修改文本的范围是由光标位置和光标移动命令二者限定的。下面分别介绍这三种修改命令。 c命令 c后紧跟光标移动命令,限定修改内容的范围是从光标当前位置开始到指定的位置为止。命令c中修改文本的范围是由光标位置和光标移动命令二者限定的。 C、c$命令 C 、c$命令可以修改从光标当前位置开始到该行末尾或从光标当前位置开始到某行末尾范围内的内容。 当在命令C之前加上数字n时,表示可以修改指定行数的内容。例如,3C命令就表示把光标所在位置的字符之后(注意不是整行)直到下面两个整行的内容删除,由随后输入的内容代替。 cc命令 cc命令的功能和C相同,只是修改的范围和C不同,它是修改从光标所在行的起始位(不管光标处于该行的何列)到该行末尾或指定某行末尾范围内的内容。光标所在行的全部内容都由新输入的内容所代替。 同命令C一样,也可以在cc之前加上数字n,表示要从光标当前行算起一共修改n行的内容。例如,5cc表示先删除光标所在行及其下面的4行,然后输入要修改的内容。 文本的替换 文本的替换即是用新输入的文本代替原已有的文本。它同文本修改一样,也是先执行删除操作,再执行插入操作。 Vi提供的替换的命令有取代命令、替换命令和字替换命令。 1. 取代命令 :r和R r:用随后输入的一个字符代替当前光标处的那个字符。 R:用随后输入的文本取代从当前光标处及其后面的若干字符,每输入一个字符就取代原有的一个字符,直到按< Esc >键结束这次取代。若新输入的字符数超过原有对应字符数,则多出部分就附加在后面。 若在命令R之前加上一个数字,例如5R,则表示新输入的文本重复出现5次,但只取代一个被输入文本所覆盖的字符序列,当前行中未被覆盖的内容仍保留下来,只是位置相应右移。 值得一提的是,利用R取代文本内容时,新输入的文本可以占多行,取代时也只有光标所在行的对应字符被覆盖。 可见新输入的6个字符(包括空格,但不包括< Esc >)取代原行中的6个字符。 2. 替换命令:s和S s(小写):该命令表示用随后输入的文本替换当前光标所在的字符。 如果只用一个新字符替换光标所在字符,则s命令与r命令功能类似,如sh与rh的作用都是将光标所在字符变为h。但二者也有区别,r命令仅完成置换,而s命令在完成置换同时,工作模式从命令方式转为文本输入方式。因此,s命令的一般使用方式是:s随后是要替换的正文,最后一定是, 结束文本输入模式,返回到命令模式。 可以在s前面加一个数字n,则表示用s后输入的文本替换从光标所在字符开始及其后的n-1个字符(共n个字符)。 S(大写):该命令表示用新打入的正文替换光标当前行(整行)(不管光标位于何列)。 如果在S之前给出一个数字n,例如3,则表示有3行(包括光标当前行及其下面2行)要被S命令之后输入的正文所替换。 3. 字替换 cw 如果我们只希望将某个字的内容用其他文本串替换,则可用cw命令。cw所替换的是一个狭义的字。输入这个命令后,Vi将把光标处的那个字删除,然后用户可输入任何文本内容。输入完成之后按键,Vi即用所输入的内容替换原光标位置至相应字结尾的所有内容。 文本行的合并 Vi提供了将文本中的某些行进行合并的命令。该命令用J(大写字母)表示,其功能是把光标所在行与下面一行合并为一行。 如果在J命令之前给出一个数字n,例如3,则表示把光标当前行及其后面的2行(共3行)合并为一行。 文本行的移动 在Vi中我们可以方便地将某个范围内的文本行左右移动或从一个地方移至另外一个地方。 文本行的左右移动。 文本行左右移动的命令有 >、<、>> 和 <<四个。 (1)> 命令将限定正文行(屏幕的首行)向右移动,通常是8个空格,使用格式为:>光标移动命令。移动正文行的范围由光标所在行和随后打入的光标移动命令所限定。 (2)< 命令将限定正文行向左移动。其使用方式与>命令相同,只是移动方向相反。例如,<6M,将光标当前行和屏幕显示中间行之间的各行都左移8个空格。 (3)>> 命令将光标所在行右移8个空格。如果在>>命令之前给出一个数字n,例如4,则表示光标当前行及其下面的3行(共4行)都右移8个空格。 (4)<< 命令将光标所在行左移8个空格。其使用与>>命令相同,只是移动方向相反。 文本行的异行移动 我们可以利用下面的步骤完成文本行从一个地方移至另外一个地方。 将光标移至待移动文本的首行; 按ndd命令。其中n为待移动的行数。此时Vi将把待移动的文本行从文件中删除,并将其放入到1号删除寄存器中; 将光标移动到目的行处; 按² 1p将待移动的文本行从删除寄存器中取出。 此时待移动的文本行就出现在目的位置处了。 上述方法虽然可以实现文本行的异行移动,但显然太烦琐。Vi还提供了另一种快捷的方法,就是在末行模式下使用命令m(Move命令)。使用方法为n m k,表示把第n行移至第k行的下方。 现在想使第5行移至第4行位置处,可在末行模式下输入: :5 m 3 在命令m之前,还可以指定一个行号范围(起始行号与终止行号),表示要把指定范围内的文本行移到指定位置。例如: :2,5 m 0 表示把文件中的第二行至第五行的内容移至文件头(第零行之下,这个零行使一个虚行)。 Vi中的行号 Vi中的许多命令都要用到行号及行数等数值。若编辑的文件较大时,自己去数是非常不方便的。为此Vi提供了给文本加行号的功能。这些行号显示在屏幕的左边,而相应行的内容则显示在行号之后。 使用的命令为:在末行方式下输入命令: :set number 需要说明的是,这里加的行号只是显示给用户看的,它们并不是文件内容的一部分。 在一个较大的文件中,用户可能需要了解光标当前行是哪一行,在文件中处于什么位置,可在命令模式下用组合键,此时Vi会在显示窗口的最后一行显示出相应信息。该命令可以在任何时候使用。 在末行方式下,我们可以输入命令nu(单词number的缩写)来获得光标当前行的行号与该行内容。 光标移动操作 全屏幕文本编辑器中,光标的移动操作无疑是最经常使用的操作了。用户只有熟练地使用移动光标的这些命令,才能迅速准确地到达所期望的位置处进行编辑。 Vi中的光标移动既可以在命令模式下,也可以在文本输入模式下,但操作的方法不尽相同。 在文本输入模式下,可直接使用键盘上的四个方向键移动光标。 在命令模式下,有很多移动光标的方法。不但可以使用四个方向键来移动光标,还可以用h、j、k、l这四个键代替四个方向键来移动光标,这样可以避免由于不同机器上的不同键盘定义所带来的矛盾,而且使用熟练后可以手不离开字母键盘位置就能完成所有操作,从而提高工作效率。另外还可以用、、和四个键或组合键移动光标。且以上这三种键在实现功能上是等价的。除此之外,还有一些移动光标的命令。下面对它们的工作方式介绍如下: 、® (均称为右向键) 右向键的作用是将光标向右移动一个位置。若在向右键前先输入一个数字n,那么光标就向右移动n个位置。例如5l表示光标向右移动5个位置。需要注意的是,光标移动不能超过当前行的末尾。若给定的n超过光标当前位置至行尾的字符个数,如果用右向键,光标只能移到行尾;如果用,光标移到下面一行或几行的适当位置。 h、、¬ (向左键) 执行一次向左键,光标向左移动一个位置。同向右键一样,也可以在向左键的前面输入一个数字n,那么光标就向左移动n个位置。需要注意的是,如果用左向键,光标左移不能超出该行的开头;如果用,光标移到上面一行或几行的适当位置。 j、、¯ (向下键) 执行一次向下键光标向下移动一个位置(即一行),但光标所在的列不变。当这些命令前面加上数字n,则光标下移n行。 Vi除了可以用向下键将光标下移外,还可以用键和“+”键将光标下移一行或n行(不包括本行在内),但此时光标下移之后将位于该行的第一个字符处。例如: 3j 光标下移3行,且光标所在列的位置不变。 3+或3 光标下移3行,且光标位于该行的行首。 k、、 (向上键) 执行一次向上键光标向上移动一个位置(即一行),但光标所在的列不变。同样在这些命令前面加上数字n,则光标上移n行。 若希望光标上移之后,光标位于该行的行首,则可以使用命令“- ”。 L (移至行首) L 命令是将光标移到当前行的开头,即将光标移至当前行的第一个非空白处(非制表符或非空格符)。 $(移至行尾) 该命令将光标移到当前行的行尾,停在最后一个字符上。若在$命令之前加上一个数字n,则光标下移n-1行并到达行尾。 [行号] G(移至指定行) 该命令将光标移至指定行号所指定的行的行首。这种移动称为绝对定位移动。 光标移到了第6行的行首。 若省略行号,则光标移至该文件的最后一行的行首,即无论该文件有多少屏,都跳至最后一行