红联Linux门户
Linux帮助

让我们一起来学Linux命令吧

发布时间:2006-01-13 14:45:37来源:红联作者:ABC
Linux的魅力在于它超级强大的字符界面。让我们开始一步一步的学习Linux命令操作吧。

以下是操作实验手册(根据RHCE教程改编)。
试验一 
文件和目录操作

试验二
Linux文件系统的要点

试验三
bash Shell

试验四
标准输入输出和管道

试验五
字符串处理

试验六
使用正则表达式进行字符处理

试验七
VI教程

===========================================================================
试验一 
文件和目录操作
估计时间: 1小时30分钟
目标:           熟悉函数、语法和一些基本的文件和目录的控制操作。
              练习有效地组合这些命令完成一般的用户任务
试验的起点: 安装了Linux的系统

--------------------------------------------------------------
第一步:目录和文件组织
场景/情节
在您的home目录下有一系列的文件,您决定到时间整理一下了.您计划生成一些新的子目录,然后根据您的计划拷贝和移动这些文件到适当的目录;另外,这些文件不是都有用的,有一些是要删除掉的。

任务:
1. 利用SSH客户端登陆到LUPA远程实验室中。

2. 在您登陆系统以后.你可以使用"打印工作目录"检查这一情况
$ pwd
/home/lab

3.使用如下每条命令检查您是否还有文件在您的home目录下:
$ ls
$ ls -a
$ ls -al
为什么第一和第二条命令返回不同的文件数?
第三条命令返回的在您当前的home目录下最大的文件是多少?
您的home目录下有子目录吗?

4. 您现在使用touch为以后的步骤建立文件。这种扩展在接下来的命令中是如何工作
的在以后的章节中进行讨论。
为防止和其他用户发生冲突,请先在当前目录下新建一个属于您自己的工作目录,myname请用自己的用户名来替换。
$mkdir myname
现在,仅仅按照下面的行键入就行了(在集合与集合之间使用包括花括号{}和下划线的字符)
$ cd myname
$ touch {report,memo,graph}_{sep,oct,nov,dec}_{a,b,c}{1,2,3}

5. 使用命令ls检查最后一条命令的结果,你会发现它在您的home目录下生成了108个
新的空文件(您不必数)。这些文件代表了您将使用的在这个步骤中的代表的数据文件。如果您看不到这些文件,向教师寻找帮助,没有这些文件,该试验后面的步骤就无法进行。

6. 为了组织您的文件,您必须先建立一些新目录,使用mkdir在您的home目录中直接
建立一些子目录:
$ mkdir a_reports
$ mkdir september october november december
  再使用ls 检查您的工作。

7. 使用如下命令在您的一个新的目录中生成一些附加子目录
$ cd a_reports
为了切换到目录,接下来:
$ mkdir 1 2 3
使用ls检查你的子目录a_reports下的名为1,2,3的三个新的子目录。

8. 首先把所有带”b”的报告从home目录中移出并且按月份分组,先验证要使用的复杂的通配符模式,是个好方法。这样做以确保它对于正确的文件进行操作。如果你打算使用这种通配符模式,您可以使用一个无害的命令来替换您的命令。
$ cd
$ ls -l *dec?b?
你将看到列出了9个”december”,”b”文件,把其中的一个移到december目录中:
$ mv graph_dec_b1 december
用下面的语句移动其余的:
$ mv *dec?b? december
列出december目录的内容验证移动操作是否成功:
$ ls -l december

9.把其余所有带”b”的报告分别移动到各自对应的目录中:
$ mv *oct?b? october
$ mv *sep?b? september

10. 现在你将把”a”报告收集到它们各自对应的目录中。注意使用~代替 “你的home
目录”。通配符和模式的组合指定了您的home目录下所有以_a1结尾的文件。
$ cd a_reports
$ mv ~/*_a1 1/
“september””a1”文件陈旧并且不再需要,使用echo确定您已经建立了一个只匹配该类文件的模式,然后删除它们,并且检查剩下的”a1”文件是否正确移动:
$ cd 1
$ echo *sep*
$ rm *sep*
$ ls
graph_dec_a1 graph_oct_a1 memo_nov_a1 report_dec_a1 report_oct_a1 graph_nov_a1 memo_dec_a1 memo_oct_a1 report_nov_a1

11.最后移动”a2”和”a3”报告到各自对应的目录中。为了使过程变得有趣,我们将把
它们移出当前目录,使用相对和绝对的的路径名。第一步,使用pwd确定当前目录:

$ pwd
/home/student/a_reports/1

用echo检查涉及到”a2”文件的模式,然后使用绝对路径名:
$ echo /home/student/*a2*
$ mv /home/student/*a2* /home/student/a_reports/2
即使您当前在/home/student/a_reports/1目录下,也能把文件从/home/student移动到/home/student/a_reports/2目录中,因为您指定了文件的路径名称(在本例中为绝对路径名称)

现在使用相对路径移动“a3”文件。再一次的,首先确信模式指定的是正确的文件名称。

$ echo ../../*a3*
$ mv ../../*a3* ../3

12.返回您的home目录,并且使用ls 来校验仅存在该目录中的文件都是“c”文件(例如:graph_dec_c1,graph_dec_c2,…)

13.“c1”和“c2”报告文件对于每个月来说都非常重要,并且您打算把它们备份到另外一个目录:

$ mkdir /tmp/archive
$ cp report*[12] /tmp/archive/

另外的,所有的对于十二月份的报告文件应该备份到/tmp/archice目录下面。注意,-i选项使得cp程序在覆盖任何文件之前进行提示:

$ cp -i report_dec* /tmp/archive/
cp: overwrite `/tmp/archive/report_dec_c1'? n
cp: overwrite `/tmp/archive/report_dec_c2'? n

14.现在您备份了一些对您重要的“c”文件,您现在要删除位于您的home目录下面所有的文件。使用通配符“*c*”检查剩下的含有c的文件。您为什么不想执行命令rm *c* ?
(作为提示:尝试:ls *c*)
15.删除您的home目录下的剩余*c*文件。在发出一个破坏性的命令之前我们再次使用echo命令。
$ echo *c[1-3]
$ rm *c[1-3]
$ ls
a_reports   december november october september  

试验的结果
一个组织良好的home目录,文件放置在合理的位置,一些文件备份到了/tmp/archive目录中

----------------------------------------------------------

第二步:决定磁盘的使用率
场景/情节
您想记录您的系统中的每一个文件系统总共有多少剩余空间。
另外,您想有一个关于哪些目录消耗了系统的多数的空间的列表。

任务
1. 使用df获取文件系统总的剩余空间,您的输出应该是类似于下面的例子(尽管输出
依赖于您的特定的安装,输出可能不同)
$ df
Filesystem 1k-blocks Used Available Use% Mounted on
/dev/hdc2 14129568 1809728 11602096 14% /
/dev/hdc1 49743 8847 38328 19% /boot
none 63312 0 63312 0% /dev/shm
2.注意缺省的命令df操作是以块为单位报告信息,试用-h,-H选项,则是用 “用户可读的“形式报告
$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/hdc2 13G 1.8G 11G 14% /
/dev/hdc1 49M 8.7M 37M 19% /boot
none 62M 0 61M 0% /dev/shm
$ df -H
Filesystem Size Used Avail Use% Mounted on
/dev/hdc2 14G 1.9G 11G 14% /
/dev/hdc1 51M 9.1M 39M 19% /boot
none 65M 0 64M 0% /dev/shm
这两个开关有什么不同(使用man df)?
2. 在您的home目录使用du(磁盘使用率)命令来决定您所有的文件消耗的空间。确保尝试-h选项获得更可读的输出。


-------------------------------------------------------------
第三步:检视文本文件
任务
1.我们需要一个可供我们工作的文本文件:
$ cd
$ cp /usr/share/dict/words
.
2.使用cat显示文件:
$ cat words
Aarhus
Aaron
Ababa
…输出省略….
Zulu
Zulus
Zurich

3.在这种情况下cat是一个坏的选择,因为很多输出快速的滚屏,试用less:
$ less words
Aarhus
Aaron
Ababa
…输出省略…
abiding
Abidjan
Abigail
…输出省略…
使用less的时候,您可以向前翻页(使用b),向后翻页(使用空格键)在整个输出中,每次一屏.

4.如果你只需要快速的看看某个文件的最前几行和最后几行,你要使用head或者tail:
$ head words
Aarhus
Aaron
Ababa
aback
abaft
abandon
abandoned
abandoning
abandonment
abandons
$ tail words
zoologically
zoom
zooms
zoos
Zorn
Zoroaster
Zoroastrian
Zulu
Zulus
Zurich

您可以使用man帮助页面发现能使用head和tail中的哪个开关修改行号或是显示的行的相关的位置.
哪个命令你能使用显示文本的前50行?


哪个命令您能使用显示文件从第25,000行到结束的内容?


====================================================================

试验二
Linux文件系统的要点
估计时间:  90分钟
目标:          深入了解linux文件系统知识,包括:创建和使用links,使用slocate和find,归档压缩文件。
试验的起点:   一个Linux系统。
----------------------------------------------------------------
第一步:创建和使用links
任务:
1.在早些时候的试验,你已经拷贝了一个文件/usr/share/dict/words到你使用的用户lab的主目录 ~/words.在这个案例里,你不需要编辑文件-拷贝一个文件到你的主目录就可以在试验的期间使用了。

2.为了要避免原始文件和副本之间的混乱。在lab’s主目录中删除words的副本
$ cd
$ rm words

3.虽然你可能没有在那时了解它, 这个文件/usr/share/dict/words 的副本实际上是一个软link。列出内容下面目录 /usr/share/dict的内容查看link和它的参数。
$ ls -l /usr/share/dict
total 404
-rw-r--r-- 1 root root 409305 Apr 3 10:29 linux.words
lrwxrwxrwx 1 root root 11 Apr 20 17:33 words ->linux.words
a.你能告诉我words是一个软链接吗?

b.为什么words的文件大小是11?

c.words允许所有人访问。这和linux.words文件用什么冲突?除了root用户,其他用户能够能在linux.words上面写数据吗?

4.再一次列出文件,这次显示相应的indeds号。为什么两个文件会有相同或不同的inodes号?
$ ls -I /usr/share/dict

5. 现在在你的主目录中产生两个的代号和硬链接到/usr/share/dict/linux.words:
$ ln -s /usr/share/dict/linux.words soft
$ ln /usr/share/dict/linux.words hard

6. 测试一下,你新建的链接两者都指到 linux.words 文件:
$ head hard soft
7. 检查你所有文件的link , 然后在下面回答问题:
$ ls -il hard soft
$ stat had soft
报告文件大小,hard_______和soft_______.
被占用的真实的空间,hard_______和soft_______.
你怎样解释这两个link占用空间的差别。
列出链接的记数,hard_______和soft_______.
所有权,hard_______和soft_______.
文件硬链接的所有者和root用户可以完全访问,其他用户是只读权限。学生将会可以删除这个新的文件吗?为什么?


8. 更多的挑战:如果时间许可,探究一下下面的问题:
a.你能创建一个目标文件并不存在的软连接吗?看看ls命令的输出能否给你一些提示。
b.你能创建一个目标文件并不存在的软连接吗? 为什么?
c.你能创建一个软连接的硬连接吗? 当你尝试的时候有什么问题吗?
d.在创建了几个硬连接后,你能说出哪个是更加真实的文件吗?

----------------------------------------------------------------
步骤2:使用find命令

任务:

作为student登录。设计完成find命令提出结果
查看你当前的umask。设计并且运行find命令在每下列各项被描述的结果指令里。然后写下提供的空格里。
你可能需要在在find的man page里查许找。记得你能用/stringz man page里查找。
第一个答案已经为你列出。
1.在/var/lib目录下查找所有文件其所有者是games用户的文件
$ find /var/lib -user games 2> /dev/null

2.在/var目录下查找所有文件其所有者是root用户的文件。_________________________________________________________

3.查找所有文件其所有者不是root,bin和student用户并用长格式显示(如ls -l 的显示结果)。
_________________________________________________________

4.查找/usr/bin目录下所有大小超过一百万byte的文件并用长格式显示(如ls -l 的显示结果)。
_________________________________________________________

5.对/etc/mail目录下的所有文件使用file命令.
_________________________________________________________
6.查找/tmp目录下属于student的所有普通文件,这些文件的修改时间为120分钟以前,查询结果用长格式显示(如ls -l 的显示结果)。
_________________________________________________________

7. 对于查到的上述文件,用-ok选项删除。
_________________________________________________________


--------------------------------------------------------------------------
步骤3:归档和压缩

情景/故事:
你的系统上的主硬盘在你使用它的时候有可怕的噪音,但是它上面有有价值的数据。自从系统在两年半以前备份过,你有决定手动备份少数几个你最紧要的文件。那 / tmp 目录里储存在不同的硬盘的分区上快怀的分区,这样你想临时的把文件备份到那里。

任务:
1. 在/home目录里,用find命令定位文件所有者是student的文件。然后将其压缩。
$ find /home -user student -exec tar rvf /tmp/backup.tar {} \;

2. 保存/etc目录下的文件到/tmp目录下:
$ tar cvf /tmp/confbackup.tar /etc

3. 列出两个文件的大小
$ ls -lh /tmp/*.tar
-rw-rw-r-- 1 student student 1.9M Oct 17 23:06 /tmp/backup.tar
-rw-rw-r-- 1 student student 5.4M Oct 18 00:27 /tmp/confbackup.tar
backup.tar文件的大小________
confbackup.tar文件的大小________

4. 使用gzip压缩你的文档。然后报告文件的大小:
$ cd /tmp
$ gzip -v *.tar
$ ls -lh *tar*
-rw-rw-r-- 1 student student 580K Oct 17 23:06 backup.tar.gz
-rw-rw-r-- 1 student student 913K Oct 18 0:27 confbackup.tar.gz
backup.tar.gz文件大小为____________
backup.tar.gz文件的压缩百分比________
confbackup.tar.gz文件大小为____________
confbackup.tar.gz文件的压缩百分比________

5. 先解压缩bzip2文件然后在压缩,然后比较新文件的大小:
$ gunzip *.gz
$ ls -lh *tar
-rw-rw-r--1 1 student student 1.9M Oct 17 23:06 backup.tar
-rw-rw-r--1 1 student student 5.4M Oct 18 00:27 confbackup.tar

$ bzip2 -v *tar
$ ls -lh *tar
-rw-rw-r--1 1 student student 510K Oct 17 23:06 backup.tar.bz2
-rw-rw-r--1 1 student student 791K Oct 18 00:27 confbackup.tar.bz2

backup.tar.bz2文件大小为____________
backup.tar.bz2文件的压缩百分比________
confbackup.tar.bz2文件大小为____________
confbackup.tar.bz2文件的压缩百分比________

6. 在传统UNIX系统,


$ rm confbackup.tar.bz2
$ tar czf test1.tgz /etc
$ tar cjf test2.tbz /etc

$ file test*
test1.tgz:gzip compressed data,deflated,last modified:Wed Oct 18 01:52:11 2000,os:Unix
test2.tbz:bzip2 compressed data,block size = 900K

结果:
你的“重要数据”被压缩备份到/tmp目录里了。

问题答案2

2. find /var -user root -group mail 2>/dev/mull
3. find / -not -user root -not -user bin -not -user student -ls 2> /dev/null
or
find / ! -user root ! -user bin ! -user student -exec ls -ld {} \; 2> /dev/null

4. find /usr/bin -size +1000000c -ls 2> /dev/null
5. find /etc/maill -exec file {} \; 2 > /dev/null
6. find /tmp -user student -and -mmin +120 -and -type f -ls 2> /dev/null
7. find /tmp -user student -and -mmin +120 -and -type f -ok rm {} \;

(end)


==============================================================
试验三
bash Shell
估计时间:  45分钟
目标:          深入了解bash shell,包括创建定制。

试验的起点:   一个Linux系统。
-------------------------------------------------------
第一步:使用Aliases
任务:
1.你决定创建一个alias,当你使用cls的时候,系统能够运行clear命令清除你的屏幕。使用student身份在tty1登录,然后输入下列命令.
$ alias cls=‘clear’
$ alias
$ cls

2.当你重新登录的时候这个别名就丢失了。确信新的别名在用户student每次登录的时候都能够使用,可以执行一下几步。
$ cd
$ vi .bashrc

查找包含下列的文字:#User specific aliases and functions 添加到你的别名命令行:
alias cls=’clear’
保存并推出。

3.测试你的改变当你注销的时候,重新登录到tty1上的时候,试下面的命令:
$ alias
$ cls

4.现在使用ls 的man page 去创建一个叫lr的别名,利用ls的五个开关。测试并添加你的别名到.bashrc中.这个别名能够:
a)用长格式显示文件
b)显示隐含文件
c)给文件分类
d)用相反的顺序显示文件
e)按文件修改时间显示文件。


目标:
一条新的清屏命令和一条新的列文件命令。(都是别名)

-------------------------------------------------------------
步骤2:改变你的bash提示

情景/故事:
你决定定制你的bash提示以能够显示完全的路径和命令的序列号。

任务:
5. 在终端窗口,显示当前主要提示符的值。
$ echo $PS1

6. 改变你的提示符为一个字符串。
$ PS1=’Red Hat Linux ->’

7. 这个不常使用,因此恢复到有$提示符的情况下,同时加上主机名。
$ PS1=’\h $’

8. 在主机名和$符号之间插入bash表示历史纪录提示符的特殊字符 \!。

9. 查找bash 的man 手册,把当前的工作目录放入提示符中。

10. 你定制的提示符显示实例,如不同请继续修改。
station1:~ 21 $ cd /tmp
station1:/tmp 22 $

11. 编辑你重新定义的PS1 到你的.bashrc,然后打开新的终端窗口看看结果如何.


-----------------------------------------------

步骤3:配置shell选项

情景/故事:
使用set和shopt你定制几个bash shell 。

任务:
12.以student身份登录tty1界面上.查看许多普遍的配置shell选项: $ set -o
allexport off
braceexpand on
emacs on
errexit off
hashall on
… output truncated …

13.察看目前ignoreeof的属性,用ctrl+d 键看是否能logout.


14.用student身份在tty1上登录,执行下面的改变,然后测试ignoreeof选项:
$ set -o ignoreeof
$
$ 用 “logout” 退出shell
$ set +o ignoreeof
$


15.当试图执行命令的时候可以看到提示信息.使用type的命令:
$ type cat
cat is hashed (/bin/cat)
$ type cls
cls is aliased to ‘clear’
$ type set
shopt is a shell builtin
$ type while
while is a shell keyword





结果:
现在你有一个更好的shell options.


问题答案4:命令替代

1. 确定完全路径名

$ which metacity
$ which .-message
$ ^message^window-demo

2. 重复执行上一个包含字符串ig的命令:
$ ig

3. 当一个命令在另一个命令的后面用(‘ ‘)起来的时候,bash会先执行后面的命令并把执行的结果作为第一个命令的输入. 使用这个技术,看看下面命令的执行结果.
$ ls -l ‘which nautilus‘


(end)


===================================================================
试验四
标准输入输出和管道
估计时间: 30分钟
目标: 熟悉Red Hat Linux中的标准输入输出和管道
试验的起点: 标准的Linux安装

---------------------------------------------------------------
步骤1:标准输入和输出
任务:

1. 使用你熟悉的编辑器创建两个文件:

packages1.txt 应该包含以下八行:

amanda
galleon
metacity
mozilla
postgresql
procinfo
rpmfind
squid

packages2.txt应该包含以下6行

anaconda
openssh
gnome-core
samba
sendmail
xscreensaver

2. cat工具是最简单的linux过滤器,它会默认把跟在后面的参数当作文件名,并把这个文件作为输入,如果没有文件名则把标准的输入作为自己的输入,然后将它们发送到标准的输出上去。现在我们来实验一下:

$cat packages1.txt

3. 如果cat后没有参数,则它会等待标准的输入,所以当你输入cat命令后,再回车,然后什么也没有显示。输入cat后,cat命令会监视标准输入,等待输入的到达。如果这个时候输入一些文本,再按回车,cat就会把输入的内容当作自己的输入,然后输出到标准的输出----显示器上,结束cat的命令为按下ctrl-d,这是结束输入的标志。
$ cat
输入一些文字,然后按回车。
^d (就是按ctrl-d)

4. 大多数的文本处理命令是执行过滤操作,他们可以读标准输入,对输入做一些动作,然后把结果发送到标准输出去。这些命令就向cat一样,只是对输入的处理不太一样。

tr命令,也是过滤器命令,如果给tr后加两个字符串做为参数,它会读取标准输入,然后把输入中包含着前一个字符串的字符变成第二个字符串,然后输出到标准输出去。

把刚才的命令换成tr,tr将把字符串中有的字符变成大写的。

$ tr 'aeiou' 'AEIOU'
输入一些文字,然后按回车。
^d

5. 定义shell不要把命令的输出发到标准输出上,而是重定向到一个文件中,我们使用 > 来重定向

重复cat的例子重定向标准的输出到packages1.catfile,这样把输出到屏幕的东西输出到了文件中,效果就和重新copy了一份文件是一样的,cat这个输出文件,然后用diff和ls确认原文件与package1.catfile内容一样。

$ cat packages1.txt > packages1.catfile
$ cat packages1.catfile
$ diff packages1.txt packages1.catfile
$ ls -l packages1*

6. 使用>>来重定向会把输出附加到已存在的文件的末尾。

把packages2.txt文件中的内容附加到packages1.catfile之后,然后检验结果。

$ cat packages2.txt >> packages1.catfile
$ cat packages1.catfile

7. 如果输出重定向时cat没有直接跟文件名的参数,那么cat就会等待标准的输入,直到按下ctrl-d作为结束,然后把所有输入的东西重定向到这个文件中去。这样可以很容易的创建一个文本文件,

$ cat > typedin.txt
This time, when text is typed at the keyboard,
It is not echoed back to the screen.
Instead, it is redirected to the file typedin.txt.
^d

$ ls -l typedin.txt
$ cat typedin.txt

8. 使用tr取代cat,重复刚才的命令

$ tr 'aeiou' 'AEIOU' > trfile.txt
This time, when text is typed at the keyboard,
It is not echoed back to the screen.
Instead, it is redirected to the file typedin.txt.
^d

$ ls -l trfile.txt
$ cat trfile.txt

9. 使用set -o命令,确认显示出目前bash的noclobber选项是关闭状态,确认当输出重定时向你可以重写文件

$ set -o
$ ls -l /tmp > trifle.txt
$ ls -l trfile.txt
$ cat trifle.txt

10. 使用set命令更改noclobber选项,如下操作:

$ set -o noclobber
$ echo “new contents” > trfile.txt
bash: trfile.txt:cannot overwrite existing file

11. cat可以接受一个文件名或者是一个输入重定向的文件,测试以下两个命令:

$ cat packages1.txt
$ cat < packages1.txt

12. 但是tr不能接受文件名作为参数,它只希望输入是标准输入。

$ tr 'aeiou' 'AEIOU' < packages1.txt

13. 下面的例子中标准输入和输出都被重定向,输入还是packages1.txt文件,这回改为输出到文件packages1.trfile.txt中去了。

$ tr 'aeiou' 'AEIOU' < packages1.txt >packages1.trfile.txt
$ ls -l packages1.txt packages1.trfile.txt
$ cat packages1.trfile.txt

-------------------------------------------------------------------
步骤2:管道

1. 把一个命令的标准输出直接传输给另一个命令作为它的标准输入,这样特殊的机制叫做管道。

如果没有管道,你要想打印你的目录中文件的列表至少要两步,还需要把没用的文件删除,(lpr命令可以把文件的内容发给默认的打印机,它的用法会在第12章讲)(注意只有当你没有打印机时可以使用以下的例子)

$ ls -l > /tmp/ls.txt
$ lpr /tmp/ls.txt
$ rm /tmp/ls.txt

使用管道,这些命令可以仅仅用以下短短的一条命令,将ls -l的输出直接发送给lpr作为输入,lpr也不需要别的参数。

$ ls -l | lpr

2. 管道经常的用法是一个命令产生了很多页的输出,可以把这些输出直接给less,管道左边是你的命令,右边是less,less不需要参数。(空格键是翻页,q键是退出less)

$ ls -l /usr/bin | less

步骤3:练习

答案在下面,可以使用man page来帮助你解决问题

1. 拷贝一份cal命令的man page,放在你的主目录下,取名叫cal.man。

2. 只在一行上输入什么样的命令,可以使你从键盘上输入的文本输出到打印机上

3. 怎样把/usr/bin下以c或d开头的文件列表发送到打印机上?

------------------------------------------------------------------------

步骤3:练习-答案

1. man cal > cal.man
2. lpr (不需要操作,了解下就可以了)
lpr打印出以后面的参数命名的文件中的内容,如果没有参数,lpr就会从标准输入中读取,标准的输入是键盘,直到你按下ctrl-d表示键盘输入结束。
3.ls -l /usr/bin/[cd]* | lpr


====================================================================
试验五
字符串处理
估计时间:  60分钟
目标:          熟悉字符串处理

试验的起点:   一个Red Hat Linux系统,把/etc/passwd拷贝到你的主目录下。
---------------------------------------------------------------------
第一步:字符串处理基本知识
任务:
1..拷贝/etc/passwd到你的主目录下:
$ cd
$ cp /etc/passwd

2. 在/etc/passwd里面有系统里的每一个帐户.使用wc,在passwd文件里计算有多少行。
$ wc -l passwd
在你的系统里有多少个帐户____________

3. 找出本机中所有用户使用的各种shell并把其放置在一个文件内:
$ cut -d: -f7 passwd > shells

4. 使用cat命令查看你新的shells文件的内容,为了使输出结果更为友好.用sort命令输出这些数据在一个新的文件里:
$ sort shells > sorted.shells

5. 你的文件包含许多同样的内容.使用uniq命令可以计算出有多少个相同的行:
$ uniq -c sorted.shells > uniq.sorted.shells

为什么在使用uniq之前要使用sort命令

6. 按照数字由大到小的顺序列出在你的机器上使用的各种shell:
$ sort -nr uniq.sorted.shells
i. /sbin/nologin
6 /bin/bash
1 /sbin/shutdown
1 /sbin/halt
1 /bin/sync
结果:
按照数字由大到小的顺序列出你机器上所有用户使用的各种shell:

------------------------------------------------------------------------
步骤2:更多的练习

为每一个练习写下解决办法.记住,答案是一个你想出办法的命令,不是输出.答案在实验的最后被列出来了,但是在对答案之前,你可以试着完成每个任务.每个答案将显示单独的一行.这个命令aspell没有man page;你将怎样获得帮助呢?

7. 有多少文件在/usr/bin目录下?输出是一个单一的整数.提示:设计一个命令列出文件名到每一行,然后计算一共有多少行.

__________________________________________________________

8. 列出下列文件/usr/share/doc/nautilus-*/NEWS中拼错的单词.

__________________________________________________________

12. 多少唯一的单词从上述练习中输出?
__________________________________________________________


步骤2答案:

1 ls -l /usr/bin | wc -l

2 aspell -l < /usr/shar/doc/nautilus-*/NEWS

3 aspell -l < /usr/share/doc/nautilus-*/NEWS | sort | uniq | wc -l

(end)


================================================================================
试验六
使用正则表达式进行字符处理
估计时间: 60分钟
目标: 熟悉Red Hat Linux中进行字符处理的几个工具
试验的起点: 安装Red Hat Linux,并且能正常工作,拷贝 /etc/passwd到
你的主目录中

-------------------------------------------------------------------
步骤1:使用grep进行字符处理

任务:

1. 在copy到你主目录中的/etc/passwd文件的副本中,使用grep显示出所有以“g”开头的帐户:
2. 显示出所有使用bash shell的帐户:

$ grep ‘bash$’ passwd

3. 显示出没有使用bash作为shell的帐户:

$ grep -v ‘bash$’ passwd

4. 为了做一个使用diff的例子,我们要更改这个passwd文件的拷贝,先用grep把原文件中所有含有“N”和“P”的行删除:

$ grep -v ‘[NP]’ passwd > modified.passwd

5. 最后再用tr将含有的所有大写字母变成小写:

$ tr “A-Z” “a-z” < modified.passwd > modified2.passwd

6. 这时使用cat命令看原来的passwd文件和改过的modified2.passwd文件,不仔细看看不出其中的区别,这只是小文件,如果文件大一些,想象一下拥有几千个用户的文件。使用diff可以产生两个文件中不同之处的列表。

$ diff modified2.passwd passwd
14a15,16
> ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
> nobody:x:99:99:Nobody:/:/sbin/nologin
… …

-------------------------------------------------------------------------
步骤2:正则表达式及字符处理
在任务下面的横线上写下你的解决方案,你要写出你的命令而不是命令的输出,答案在实验最后,但是要先试着自己解决,可以使用man page来帮助你解决问题。

任务:
1. 使用grep显示出/usr/share/dict/words文件中还有某参数的行,例如显示出所有含有fish的行:

$ grep fish /usr/share/dict/words
blowfish
bluefish
codfish
… output truncated …
unselfish
unselfishly
unselfishness

2. 使用grep的man page作为帮助,输出任何包含fish的所有行,还要输出紧接着这行的上下各两行的内容:

--------------------------------------------------------------------------
3. 使用grep的man page作为帮助,找出相应的命令,来显示出在words文件中有多少行含有fish。

--------------------------------------------------------------------------
4. 使用grep的帮助文件,找出相应的命令,显示出那些行含有fish,并将行号一块输出,看一看starfish在哪行?

--------------------------------------------------------------------------
5. 想列出/usr/share/dict/words中包含先有字母t然后有一个元音字母,之后是sh的单词,命令为:

--------------------------------------------------------------------------
6. 在/usr/share/dict/words文件中,创建可以符合abominable,abominate,anomie和atomize的正则表达式,但是不要选到别的单词。

--------------------------------------------------------------------------
7. 在/usr/share/dict/words文件中包含多少先有字母t然后有一个元音字母,之后是sh的单词,只输出数量。

--------------------------------------------------------------------------
8. 列出/usr/share/dict/words中刚好包含16个字母的单词:

--------------------------------------------------------------------------
9. 我们将要使用/usr/share/doc文件夹来完成我们的下几个任务。
列出/usr/share/doc/bash-2.05b文件夹中,所有包含单词expansion的文件,

--------------------------------------------------------------------------
10. 显示出“Linux”在/usr/share/doc/bash-2.05b文件夹的文件中出现的次数,但是不要显示没有这个单词的文件。提示:先列出所有的文件,然后想如何使输出符合要求:

--------------------------------------------------------------------------
11. 列出所有包含Havoc的文件名:

--------------------------------------------------------------------------


-----------------------------------------------------------------------
步骤3:使用正则表达进行文本流编辑
任务:

想象你创建一个了名叫“cats”的文件包含以下单词:

cat
catalog
concatenate
polecat
Cat

猜想执行以下每个sed命令之后,把cats文件的每一行的执行后的结果写在后面:

1. sed 's/cat/dog/' cats
cat __________
catalog __________
concatenate __________
polecat __________
Cat __________

2. sed 's/[Cc]at/dog/' cats
cat __________
catalog __________
concatenate __________
polecat __________
Cat __________

3. sed 's/\<[Cc]cat/dog/' cats
cat __________
catalog __________
concatenate __________
polecat __________
Cat __________
4. sed 's/[Cc]at\>/dog/' cats
cat __________
catalog __________
concatenate __________
polecat __________
Cat __________

5. sed 's/\<[Cc]at\>/dog/' cats
cat __________
catalog __________
concatenate __________
polecat __________
Cat __________

6. sed 's/\<[Cc]at\>/& and dog/' cats
cat __________
catalog __________
concatenate __________
polecat __________
Cat __________

7. 创建一个'cats'文件,运行sed命令,测试你的答案。

步骤2的答案:
2.grep -B2 -A2 "fish" /usr/share/dict/words
3.grep -c "fish" /usr/share/dict/words
4.grep -n "fish" /usr/share/dict/words
5.grep "t[aeiou]sh" /usr/share/dict/words
6. "^a.omi.*e$"

"\"
诀窍是判断哪些字母是变化的哪些是不变的,注意想代替任意个任意字符要使用 “.*”。
7.grep -c "t[aeiou]sh$" /usr/share/dict/words
8.grep "^…………….$" /usr/share/dict/words
或者:
grep -c "^.\{16\}$" /usr/share/dict/words
9.grep -l expansion /usr/share/doc/bash-2.05b/*
10.grep -c "Linux" /usr/share/doc/bash-2.05b/* |grep -v ":0"
11.grep -R -l "Havoc" /usr/share/doc


==================================================================
试验七
VI操作
估计时间:  1小时
目标:            熟练掌握vi的控制操作。
试验的起点:   安装了linux的系统

在提示符下键入: vimtutor
你会看到英文的试验教程
第一讲第一节∶移动光标


※※ 要移动光标,请依照说明分别按下 h、j、k、l 键。 ※※

^
k 提示∶ h 的键位于左边,每次按下就会向左移动。
< h l > l 的键位于右边,每次按下就会向右移动。
j j 键看起来很象一支尖端方向朝下的箭头。
v

1. 请随意在屏幕内移动光标,直至您觉得舒服为止。

2. 按下下行键(j),直到出现光标重复下行。

---> 现在您应该已经学会如何移动到下一讲吧。

3. 现在请使用下行键,将光标移动到第二讲。

提示∶如果您不敢确定您所按下的字母,请按下键回到正常(Normal)模式。
然后再次从键盘输入您想要的命令。

提示∶光标键应当也能正常工作的。但是使用hjkl键,在习惯之后您就能够快速
地在屏幕内四处移动光标了。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第一讲第二节∶VIM的进入和退出


!! 特别提示∶敬请阅读完整本一节的内容,然后才能执行以下所讲解的命令。

1. 请按键(这是为了确保您处在正常模式)。

2. 然后输入∶ :q! <回车>

---> 这种方式的退出编辑器绝不会保存您进入编辑器以来所做的改动。
如果您想保存更改再退出,请输入∶
:wq <回车>

3. 如果您看到了命令行提示符,请输入能够带您回到本教程的命令,那就是∶

vimtutor <回车>

通常情况下您也可以用这种方式∶

vim tutor <回车>

---> 这里的 'vim' 表示进入vim编辑器,而 'tutor'则是您准备要编辑的文件。

4. 如果您自信已经牢牢记住了这些步骤的话,请从步骤1执行到步骤3退出,然
后再次进入编辑器。接著将光标移动到第一讲第三节来继续我们的教程讲解。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第一讲第三节∶文本编辑之删除


** 在正常(Normal)模式下,可以按下 x 键来删除光标所在位置的字符。**

1. 请将光标移动到本节中下面标记有 ---> 的那一行。

2. 为了修正输入错误,请将光标移至准备删除的字符的位置处。

3. 然后按下 x 键将错误字符删除掉。

4. 重复步骤2到步骤4,直到句子修正为止。

---> The ccow jumpedd ovverr thhe mooon.

5. 好了,该行已经修正了,下一节内容是第一讲第四节。

特别提示∶在您浏览本教程时,不要强行记忆。记住一点∶在使用中学习。



~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第一讲第四节∶文本编辑之插入


** 在正常模式下,可以按下 i 键来插入文本。**

1. 请将光标移动到本节中下面标记有 ---> 的第一行。

2. 为了使得第一行内容雷同于第二行,请将光标移至文本第一个字符准备插入
的位置。

3. 然后按下 i 键,接著输入必要的文本字符。

4. 所有文本都修正完毕,请按下 键返回正常模式。
重复步骤2至步骤4以便修正句子。

---> There is text misng this .
---> There is some text missing from this line.

5. 如果您对文本插入操作已经很满意,请接著阅读下面的小结。



~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第一讲小结


1. 光标在屏幕文本中的移动既可以用箭头键,也可以使用 hjkl 字母键。
h (左移) j (下行) k (上行) l (右移)

2. 欲进入vim编辑器(从命令行提示符),请输入∶vim 文件名 <回车>

3. 欲退出vim编辑器,请输入以下命令放弃所有修改∶

:q! <回车>

或者输入以下命令保存所有修改∶

:wq <回车>

4. 在正常模式下删除光标所在位置的字符,请按∶ x

5. 在正常模式下要在光标所在位置开始插入文本,请按∶

i 输入必要文本

特别提示∶按下 键会带您回到正常模式或者取消一个不期望或者部分完成
的命令。

好了,第一讲到此结束。下面接下来继续第二讲的内容。


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第二讲第一节∶删除类命令


** 输入 dw 可以从光标处删除至一个单字/单词的末尾。**

1. 请按下 键确保您处于正常模式。

2. 请将光标移动到本节中下面标记有 ---> 的那一行。

3. 请将光标移至准备要删除的单词的开始。

4. 接著输入 dw 删除掉该单词。

特别提示∶您所输入的 dw 会在您输入的同时出现在屏幕的最后一行。如果您输
入有误,请按下 键取消,然后重新再来。

---> There are a some words fun that don't belong paper in this sentence.

5. 重复步骤3至步骤4,直至句子修正完毕。接著继续第二讲第二节内容。



~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第二讲第二节∶其他删除类命令


** 输入 d$ 从当前光标删除到行末。**

1. 请按下 键确保您处于正常模式。

2. 请将光标移动到本节中下面标记有 ---> 的那一行。

3. 请将光标移动到该行的尾部(也就是在第一个点号‘.’后面)。

4. 然后输入 d$ 从光标处删至当前行尾部。

---> Somebody typed the end of this line twice. end of this line twice.


5. 请继续学习第二讲第三节就知道是怎么回事了。


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第二讲第三节∶关于命令和对象


删除命令 d 的格式如下∶

[number] d object 或者 d [number] object

其意如下∶
number - 代表执行命令的次数(可选项,缺省设置为 1 )。
d - 代表删除。
object - 代表命令所要操作的对象(下面有相关介绍)。

一个简短的对象列表∶
w - 从当前光标当前位置直到单字/单词末尾,包括空格。
e - 从当前光标当前位置直到单字/单词末尾,但是 *不* 包括空格。
$ - 从当前光标当前位置直到当前行末。

特别提示∶
对于勇于探索者,请在正常模式下面仅按代表相应对象的键而不使用命令,则
将看到光标的移动正如上面的对象列表所代表的一样。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第二讲第四节∶对象命令的特殊情况


** 输入 dd 可以删除整一个当前行。 **

鉴于整行删除的高频度,VIM 的设计者决定要简化整行删除,仅需要在同一行上
击打两次 d 就可以删除掉光标所在的整行了。

1. 请将光标移动到本节中下面的短句段落中的第二行。
2. 输入 dd 删除该行。
3. 然后移动到第四行。
4. 接著输入 2dd (还记得前面讲过的 number-command-object 吗?) 删除两行。

1) Roses are red,
2) Mud is fun,
3) Violets are blue,
4) I have a car,
5) Clocks tell time,
6) Sugar is sweet
7) And so are you.


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第二讲第五节∶撤消类命令


** 输入 u 来撤消最后执行的命令,输入 U 来修正整行。**

1. 请将光标移动到本节中下面标记有 ---> 的那一行,并将其置于第一个错误
处。
2. 输入 x 删除第一个不想保留的字母。
3. 然后输入 u 撤消最后执行的(一次)命令。
4. 这次要使用 x 修正本行的所有错误。
5. 现在输入一个大写的 U ,恢复到该行的原始状态。
6. 接著多次输入 u 以撤消 U 以及更前的命令。
7. 然后多次输入 CTRL-R (先按下 CTRL 键不放开,接著输入 R 键) ,这样就
可以执行恢复命令,也就是撤消掉撤消命令。

---> Fiix the errors oon thhis line and reeplace them witth undo.

8. 这些都是非常有用的命令。下面是第二讲的小结了。


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第二讲小结


1. 欲从当前光标删除至单字/单词末尾,请输入∶dw

2. 欲从当前光标删除至当前行末尾,请输入∶d$

3. 欲删除整行,请输入∶dd

4. 在正常模式下一个命令的格式是∶

[number] command object 或者 command [number] object
其意是∶
number - 代表的是命令执行的次数
command - 代表要做的事情,比如 d 代表删除
object - 代表要操作的对象,比如 w 代表单字/单词,$ 代表到行末等等。
$ (to the end of line), etc.

5. 欲撤消以前的操作,请输入∶u (小写的u)
欲撤消在一行中所做的改动,请输入∶U (大写的U)
欲撤消以前的撤消命令,恢复以前的操作结果,请输入∶CTRL-R

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第三讲第一节∶置入类命令


** 输入 p 将最后一次删除的内容置入光标之后 **

1. 请将光标移动到本节中下面示范段落的首行。

2. 输入 dd 将该行删除,这样会将该行保存到vim的缓冲区中。

3. 接著将光标移动到准备置入的位置的上方。记住∶是上方哦。

4. 然后在正常模式下(键进入),输入 p 将该行粘贴置入。

5. 重复步骤2至步骤4,将所有的行依序放置到正确的位置上。

d) Can you learn too?
b) Violets are blue,
c) Intelligence is learned,
a) Roses are red,



~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第三讲第二节∶替换类命令


** 输入 r 和一个字符替换光标所在位置的字符。**

1. 请将光标移动到本节中下面标记有 ---> 的第一行。

2. 请移动光标到第一个错误的适当位置。

3. 接著输入 r ,这样就能将错误替换掉了。

4. 重复步骤2和步骤3,知道第一行是已经修改完毕。

---> Whan this lime was tuoed in, someone presswd some wrojg keys!
---> When this line was typed in, someone pressed some wrong keys!

5. 然后我们继续学校第三讲第三节。

特别提示∶切记您要在使用中学习,而不是在记忆中学习。



~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第三讲第三节∶更改类命令


** 要改变一个单字/单词的部分或者全部,请输入 cw **

1. 请将光标移动到本节中下面标记有 ---> 的第一行。

2. 接著把光标放在单词 lubw 的字母 u 的位置那里。

3. 然后输入 cw 就可以修正该单词了(在本例这里是输入 ine 。)

4. 最后按 键,然后光标定位到下一个错误第一个准备更改的字母处。

5. 重复步骤3和步骤4,知道第一个句子完全雷同第二个句子。

---> This lubw has a few wptfd that mrrf changing usf the change command.
---> This line has a few words that need changing using the change command.

提示∶请注意 cw 命令不仅仅是替换了一个单词,也让您进入文本插入状态了。



~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第三讲第四节∶使用c指令的其他更改类命令


** 更改类指令可以使用同删除类命令所使用的对象参数。**

1. 更改类指令的工作方式跟删除类命令是一致的。操作格式是∶

[number] c object 或者 c [number] object

2. 对象参数也是一样的,比如 w 代表单字/单词,$代表行末等等。

3. 请将光标移动到本节中下面标记有 ---> 的第一行。

4. 接著将光标移动到第一个错误处。

5. 然后输入 c$ 使得该行剩下的部分更正得同第二行一样。最后按 键。

---> The end of this line needs some help to make it like the second.
---> The end of this line needs to be corrected using the c$ command.



~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第三讲小结


1. 要重新置入已经删除的文本内容,请输入小写字母 p。该操作可以将已删除
的文本内容置于光标之后。如果最后一次删除的是一个整行,那么该行将置
于当前光标所在行的下一行。

2. 要替换光标所在位置的字符,请输入小写的 r 和要替换掉原位置字符的新字
符即可。

3. 更改类命令允许您改变指定的对象,从当前光标所在位置直到对象的末尾。
比如输入 cw 可以替换当前光标到单词的末尾的内容;输入 c$ 可以替换当
前光标到行末的内容。

4. 更改类命令的格式是∶

[number] c object 或者 c [number] object

下面我们继续学习下一讲。



~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第四讲第一节∶定位及文件状态


** 输入 CTRL-g 显示当前编辑文件中当前光标所在行位置以及文件状态信息。
输入 SHIFT-G 则直接跳转到文件中的某一指定行。**

提示∶切记要先通读本节内容,之后才可以执行以下步骤!!!

1. 按下 CTRL 键不放开然后按 g 键。然后就会看到页面最底部出现一个状态信
息行,显示的内容是当前编辑的文件名和文件的总行数。请记住步骤3的行号。

2. 按下 SHIFT-G 键可以使得当前光标直接跳转到文件最后一行。

3. 输入您曾停留的行号,然后按下 SHIFT-G。这样就可以返回到您第一次按下
CTRL-g 时所在的行好了。注意∶输入行号时,行号是不会在屏幕上显示出来
的。

4. 如果愿意,您可以继续执行步骤1至步骤三。



~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第四讲第二节∶搜索类命令


** 输入 / 以及尾随的字符串可以用以在当前文件中查找该字符串。**

1. 在正常模式下输入 / 字符。您此时会注意到该字符和光标都会出现在屏幕底
部,这跟 : 命令是一样的。

2. 接著输入 errroor <回车>。那个errroor就是您要查找的字符串。

3. 要查找同上一次的字符串,只需要按 n 键。要向相反方向查找同上一次的字
符串,请输入 Shift-N 即可。

4. 如果您想逆向查找字符串,请使用 ? 代替 / 进行。

---> When the search reaches the end of the file it will continue at the start.

"errroor" is not the way to spell error; errroor is an error.

提示∶如果查找已经到达文件末尾,查找会自动从文件头部继续查找。


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第四讲第三节∶配对括号的查找
** 按 % 可以查找配对的括号 )、]、}。**

1. 把光标放在本节下面标记有 --> 那一行中的任何一个 (、[ 或 { 处。

2. 接著按 % 字符。

3. 此时光标的位置应当是在配对的括号处。

4. 再次按 % 就可以跳回配对的第一个括号处。

---> This ( is a test line with ('s, ['s ] and {'s } in it. ))

提示∶在程序调试时,这个功能用来查找不配对的括号是很有用的。


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第四讲第四节∶修正错误的方法之一


** 输入 :s/old/new/g 可以替换 old 为 new。**

1. 请将光标移动到本节中下面标记有 ---> 的那一行。

2. 输入 :s/thee/the <回车> 。请注意该命令只改变光标所在行的第一个匹配
串。

3. 输入 :s/thee/the/g 则是替换全行的匹配串。

---> the best time to see thee flowers is in thee spring.

4. 要替换两行之间出现的每个匹配串,请输入 :#,#s/old/new/g (#,#代表的是
两行的行号)。输入 :%s/old/new/g 则是替换整个文件中的每个匹配串。


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第四讲小结


1. Ctrl-g 用于显示当前光标所在位置和文件状态信息。Shift-G 用于将光标跳
转至文件最后一行。先敲入一个行号然后按 Shift-G 则是将光标移动至该行
号代表的行。

2. 输入 / 然后紧随一个字符串是则是在当前所编辑的文档中向后查找该字符串。
输入问号 ? 然后紧随一个字符串是则是在当前所编辑的文档中向前查找该字
符串。完成一次查找之后按 n 键则是重复上一次的命令,可在同一方向上查
找下一个字符串所在;或者按 Shift-N 向相反方向查找下该字符串所在。

3. 如果光标当前位置是括号(、)、[、]、{、},按 % 可以将光标移动到配对的
括号上。

4. 在一行内替换头一个字符串 old 为新的字符串 new,请输入 :s/old/new
在一行内替换所有的字符串 old 为新的字符串 new,请输入 :s/old/new/g
在两行内替换所有的字符串 old 为新的字符串 new,请输入 :#,#s/old/new/g
在文件内替换所有的字符串 old 为新的字符串 new,请输入 :%s/old/new/g
进行全文替换时询问用户确认每个替换需添加 c 选项,请输入 :%s/old/new/gc


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第五讲第一节∶在 VIM 内执行外部命令的方法


** 输入 :! 然后紧随著输入一个外部命令可以执行该外部命令。**

1. 按下我们所熟悉的 : 命令设置光标到屏幕底部。这样就可以让您输入命令了。

2. 接著输入感叹号 ! 这个字符,这样就允许您执行外部的 shell 命令了。

3. 我们以 ls 命令为例。输入 !ls <回车> 。该命令就会列举出您当前目录的
内容,就如同您在命令行提示符下输入 ls 命令的结果一样。如果 !ls 没起
作用,您可以试试 :!dir 看看。

---> 提示∶ 所有的外部命令都可以以这种方式执行。

---> 提示∶ 所有的 : 命令都必须以 <回车> 告终。


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第五讲第二节∶关于保存文件的更多信息


** 要将对文件的改动保存到文件中,请输入 :w FILENAME 。**

1. 输入 :!dir 或者 :!ls 获知当前目录的内容。您应当已知道最后还得敲
<回车> 吧。

2. 选择一个尚未存在文件名,比如 TEST 。

3. 接著输入 :w TEST (此处 TEST 是您所选择的文件名。)

4. 该命令会以 TEST 为文件名保存整个文件 (VIM 教程)。为了确保正确保存,
请再次输入 :!dir 查看您的目录列表内容。

---> 请注意∶如果您退出 VIM 然后在以文件名 TEST 为参数进入,那么该文件内
容应该同您保存时的文件内容是完全一样的。

5. 现在您可以通过输入 :!rm TEST 来删除 TEST 文件了。


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第五讲第三节∶一个具有选择性的保存命令


** 要保存文件的部分内容,请输入 :#,# w FILENAME **

1. 再来执行一次 :!dir 或者 :!ls 获知当前目录的内容,然后选择一个合适的
不重名的文件名,比如 TEST 。

2. 接著将光标移动至本页的最顶端,然后按 CTRL-g 找到该行的行号。别忘了
行号哦。

3. 接著把光标移动至本页的最底端,再按一次 CTRL-g 。也别忘了这个行好哦。

4. 为了只保存文章的某个部分,请输入 :#,# w TEST 。这里的 #,# 就是上面
要求您记住的行号(顶端行号,底端行号),而 TEST 就是选定的文件名。

5. 最后,用 :!dir 确认文件是否正确保存。但是这次先别删除掉。




~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第五讲第四节∶提取和合并文件


** 要向当前文件中插入另外的文件的内容,请输入 :r FILENAME **

1. 请键入 :!dir 确认您前面创建的 TEST 文件还在。

2. 然后将光标移动至当前页面的顶端。

特别提示∶ 执行步骤3之后您将看到第五讲第三节,请届时再往下移动回到这里来。

3. 接著通过 :r TEST 将前面创建的名为 TEST 的文件提取进来。

特别提示∶您所提取进来的文件将从光标所在位置处开始置入。

4. 为了确认文件已经提取成功,移动光标回到原来的位置就可以注意有两份第
五讲第三节,一份是原本,另外一份是来自文件的副本。



~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第五讲小结


1. :!command 用于执行一个外部命令 command。

请看一些实际例子∶
:!dir - 用于显示当前目录的内容。
:!rm FILENAME - 用于删除名为 FILENAME 的文件。

2. :w FILENAME 可将当前 VIM 中正在编辑的文件保存到名为 FILENAME 的文
件中。

3. :#,#w FILENAME 可将当前编辑文件第 # 行至第 # 行的内容保存到文件
FILENAME 中。

4. :r FILENAME 可提取磁盘文件 FILENAME 并将其插入到当前文件的光标位置
后面。


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第六讲第一节∶打开类命令


** 输入 o 将在光标的下方打开新的一行并进入插入模式。**

1. 请将光标移动到本节中下面标记有 ---> 的那一行。

2. 接著输入小写的 o 在光标 *下方* 打开新的一行并进入插入模式。

3. 然后复制标记有 ---> 的行并按 键退出插入模式而进入正常模式。

---> After typing o the cursor is placed on the open line in Insert mode.

4. 为了在光标 *上方* 打开新的一行,只需要输入大写的 O 而不是小写的 o
就可以了。请在下行测试一下吧。当光标处在在该行上时,按 Shift-O可以
在该行上方新开一行。

Open up a line above this by typing Shift-O while the cursor is on this line.


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第六讲第二节∶光标后插入类命令


** 输入 a 将可在光标之后插入文本。 **

1. 请在正常模式下通过输入 $ 将光标移动到本节中下面标记有 ---> 的第一行
的末尾。

2. 接著输入小写的 a 则可在光标之后插入文本了。大写的 A 则可以直接在行
末插入文本。

提示∶输入大写 A 的操作方法可以在行末插入文本,避免了输入 i,光标定位到
最后一个字符,输入的文本, 回复正常模式,箭头右键移动光标以及
x 删除当前光标所在位置字符等等诸多繁杂的操作。

3. 操作之后第一行就可以补充完整了。请注意光标后插入文本与插入模式是基
本完全一致的,只是文本插入的位置定位稍有不同罢了。

---> This line will allow you to practice
---> This line will allow you to practice appending text to the end of a line.



~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第六讲第三节∶另外一个置换类命令的版本


** 输入大写的 R 可连续替换多个字符。**

1. 请将光标移动到本节中下面标记有 ---> 的第一行。

2. 移动光标到第一行中不同于标有 ---> 的第二行的第一个单词的开始,即单
词 last 处。

3. 然后输入大写的 R 开始把第一行中的不同于第二行的剩余字符逐一输入,就
可以全部替换掉原有的字符而使得第一行完全雷同第二行了。

---> To make the first line the same as the last on this page use the keys.
---> To make the first line the same as the second, type R and the new text.

4. 请注意∶如果您按 退出置换模式回复正常模式,尚未替换的文本将仍
然保持原状。


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第六讲第四节∶设置类命令的选项


** 设置可使查找或者替换可忽略大小写的选项 **


1. 要查找单词 ignore 可在正常模式下输入 /ignore 。要重复查找该词,可以
重复按 n 键。

2. 然后设置 ic 选项(ic就是英文忽略大小写Ignore Case的首字母缩写词),即
输入∶
:set ic

3. 现在可以通过键入 n 键再次查找单词 ignore。重复查找可以重复键入 n 键。

4. 然后设置 hlsearch 和 incsearch 这两个选项,输入以下内容∶
:set hls is

5. 现在可以再次输入查找命令,看看会有什么效果∶
/ignore

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第六讲小结


1. 输入小写的 o 可以在光标下方打开新的一行并将光标置于新开的行首,进入
插入模式。
输入大写的 O 可以在光标上方打开新的一行并将光标置于新开的行首,进入
插入模式。

2. 输入小写的 a 可以在光标所在位置之后插入文本。
输入大写的 A 可以在光标所在行的行末之后插入文本。

3. 输入大写的 R 将进入替换模式,直至按 键退出替换模式而进入正常
模式。

4. 输入 :set xxx 可以设置 xxx 选项。


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第七讲∶在线帮助命令

** 使用在线帮助系统 **

Vim 拥有一个细致全面的在线帮助系统。要启动该帮助系统,请选择如下三种方
法之一∶
- 按下 键 (如果键盘上有的话)
- 按下 键 (如果键盘上有的话)
- 输入 :help <回车>

输入 :q <回车> 可以关闭帮助窗口。

提供一个正确的参数给":help"命令,您可以找到关于该主题的帮助。请试验以
下参数(可别忘了按回车键哦。∶

:help w <回车>
:help c_
:help insert-index <回车>
:help user-manual <回车>

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第八讲∶创建一个启动脚本

** 启用vim的功能 **

Vim的功能特性要比vi多得多,但大部分功能都没有缺省激活。为了启动更多的
功能,您得创建一个vimrc文件。

1. 开始编辑vimrc文件,这取决于您所使用的操作系统∶

:edit ~/.vimrc 这是Unix系统所使用的命令
:edit $VIM/_vimrc 这是Windows系统所使用的命令

2. 接着导入vimrc范例文件∶

:read $VIMRUNTIME/vimrc_example.vim

3. 保存文件,命令为∶

:write

在下次您启动vim的时候,编辑器就会有了语法高亮的功能。
文章评论

共有 0 条评论