VIM快捷键中英对照图

作者:Ajian 发布时间:February 16, 2009 分类:学习笔记,杂记摘要

最近找到两张VIM快捷键的图,这张图其实之前一直有看到过,但自己也没有怎么用,现在觉得我的VIM操作还是没有效率,所以想重新学习,找到了两张一样的,一个是英文原版一个是中文翻译的,我把他当桌面背景了。

vi/vim快捷键英文版

vim快捷键中文版

NTP时间服务方案[原创]

作者:Ajian 发布时间:January 16, 2009 分类:网络服务,学习笔记

[前言]

随着服务器的增加和应用对时间的依赖性,在一个大的网站中时间服务器应该是必不可少的,我们应该尽力的使所有的服务器都是同一种配置,这样即有利我们配置更有利于我们维护。

[问题]

如果时间差别太大,会产生很多的问题:1、系统时间旧于软件创建的时间,造成软件无法安装2、系统时间不稳定,造成数据同步将出现问题3、多台计划任务不能统一准时执行4、对时间依赖较大的软件会出现混乱,如论坛贴子的发布等

[方案]

时间的同步这里采用NTP,NTP类似于DNS可以实现分布式的同步,避免网络延时造成的影响。服务器可以单独直接和上层公共时间服务器同步,这样的缺点时网络的延时可能造成各主机的时间并不一定统一和准确。最好是在内部自己建立一个对外同步的时间服务器,其它主机都跟内部这台时间服务器进行同步。

[部署]

环境:

1、系统:CentOS 4 CentOS 5.2 slackware 12 slackware 11 slackware 10(我们的主机较多、 版本较多)2、时间服务IP192.168.0.3 192.168.0.4

安装:

不管是服务器端还是客户端都需要安装ntp的软件。建议:像这种辅助性的服务安装建议用系统自带的,没有必要弄得很复杂。CentOSyum -y install ntp
Slackware: slackpkg install ntp
(这个是安装有slackpkg这个包管理工具的)当然也可以下相应的rpmtgz

主要配置:

ntp只有一个配置文件就是/etc/ntp.conf还有些相关的有用的配置文件和命令在后面会有提及。

服务器端ntp.conf

# /etc/ntp.conf: Configuration file for ntpd.

#

server 127.127.1.0 # local clock

fudge 127.127.1.0 stratum 10

1、以上为原本内定的一个内部时间资料,不需要更动他



server 1.asia.pool.ntp.org prefer

server 0.asia.pool.ntp.org

server 2.asia.pool.ntp.org

server 3.asia.pool.ntp.org

2、上面四条为设置上层来源的四个地址,注意这个地址是各个国家和地区有不同 而且还有优劣性,

这四个地址都是亚洲地区的,可以自己在服务器上PING四个地址判断其优劣性,我的服务器1.asia.pool.ntp.org速度快,并且给了prefer的优先级。

# Drift file. Put this in a directory which the daemon can write to.

# No symbolic links allowed, either, since the daemon updates the file

# by creating a temporary in the same directory and then rename()'ing

# it to the file.

3、调整时间差异的功能,保持默认值就可以了

driftfile /etc/ntp/drift

#multicastclient # listen on default 224.0.1.1

broadcastdelay 0.008



# Access Controls

# Keys file. If you want to diddle your server at run time, make a

# keys file (mode 600 for sure) and define the key number to be

# used for making requests.

# PLEASE DO NOT USE THE DEFAULT VALUES HERE. Pick your own, or remote

# systems might be able to reset your clock at will.

#keys /etc/ntp/keys

#trustedkey 65535

#requestkey 65535

#controlkey 65535



# Don't serve time or stats to anyone else by default (more secure)

restrict default ignore

4、以下都是访问控制

# Trust ourselves. :-)允许自己

restrict 127.0.0.1

# restrictions for ntp pools限制的NTP

restrict 0.asia.pool.ntp.org mask 255.255.255.255 nomodify notrap noquery

restrict 1.asia.pool.ntp.org mask 255.255.255.255 nomodify notrap noquery

restrict 2.asia.pool.ntp.org mask 255.255.255.255 nomodify notrap noquery

restrict 3.asia.pool.ntp.org mask 255.255.255.255 nomodify notrap noquery



# permit all the internal private network servers to query the time允许访问的网段,对客户端的

restrict 192.168.0.0 mask 255.255.255.0 nomodify notrap

restrict其中parameter的参数:

  • ignore拒绝所有类型的NTP连线;
  • nomodiy用户端不能更改NTP伺服器的时间参数,这即表示用户端不能使用ntpcntpq这两支程式来修改伺服器。 但用户端仍可透过这部主机来进行网路校时的;

  • noquery用户端不能够使用ntpq, ntpc等指令来查询时间伺服器,等於不提供NTP的网路校时罗;

  • notrap不提供trap这个远端事件登录(remote event logging)的功能。

  • notrust拒绝没有认证的用户端。

那如果没有任何参数的话,这表示『该IP或网段不受任何限制』的意思!

客户端ntp.conf

# /etc/ntp.conf

#

server 192.168.0.3

server 192.168.0.4

driftfile /etc/ntp/drift

restrict default ignore

restrict 127.0.0.1

restrict 192.168.0.3 mask 255.255.255.255 nomodify notrap noquery

restrict 192.168.0.4 mask 255.255.255.255 nomodify notrap noquery

客户端的ntp.conf跟服务器端一样的语法 ,只是将内部设置的时间服务器做为上层伺服务器源主机。

次要配置:

1、修改/etc/sysconfig/ntpd

# Drop root to id 'ntp:ntp' by default.

OPTIONS="-u ntp:ntp -p /var/run/ntpd.pid"



# Set to 'yes' to sync hw clock after successful ntpdate

SYNC_HWCLOCK=yes

将上面的no改为yes这个是系统时间跟BIOD时间同步的一个设置

注意:这个文件在slackware是没有的,我也单独添加了这个文件不知道是否是正常生效了。

# Additional options for ntpdate

NTPDATE_OPTIONS=""

2、添加启动项

如果是用系统的包安装的:CentOS: 1)setup选择system service 2) chkconfig ntpd on
Slackware:
第一步chmod +x /etc/rc.d/rc.ntpd第二步添加到启动中/etc/rc.d/rc.M

# Start the Network Time Protocol daemon:

if [ -x /etc/rc.d/rc.ntpd ]; then

sh /etc/rc.d/rc.ntpd start

fi

3、查看和修改时区

查看时区cat /etc/sysconfig/clockslackware没有)显示的是地区date -R显示的是时区号

修改时区# tzselect
# timeconfig (
仅限于RedHat LinuxCentOS)

3.复制相应的时区文件,替换系统时区文件;或者创建链接文件cp /usr/share/zoneinfo/$主时区/$次时区/etc/localtime

在中国可以使用:

cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

启动服务

CentOS: 1)service ntpd restart 2) /etc/init.d/ntpd restart
Slackware:1)/etc/rc.d/rc.ntpd restart

查看结果

注意:一般服务启动15分钟内才会同步时间,这个时间不是很固定所以要注意,不过还是有判断的标准的。

1、(只适用于centos redhat这种)ntpstat

synchronised to NTP server (192.168.0.4) at stratum 4 <==同步的服务器

time correct to within 174 ms <==服务器与客户端的时间差

polling server every 1024 s <==下次同步的时间

这个可以很清楚的看到同步的情况,可惜slackware下没有看到这个命令

2ntpq -p

remote refid st t when poll reach delay offset jitter

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

+192.168.0.3 61.129.66.79 3 u 328 1024 377 1.142 -62.973 0.257

*192.168.0.4 61.129.66.79 3 u 763 1024 377 1.188 22.298 3.615

这个ntpq -p可以列出目前我们的NTP与相关的上层NTP的状态,上头的几个栏位的意义为:

  • remote:亦即是NTP主机的IP或主机名称~注意最左边的符号, 如果有『+』代表目前正在作用当中的上层NTP,如果是『*』代表也有连上线,不过是作为次要连线的NTP主机。

  • refid:参考的上一层NTP主机的位址

  • st:就是stratum阶层!

  • when:几秒钟前曾经做过时间同步化更新的动作;

  • poll:下一次更新在几秒钟之后;

  • reach:已经向上层NTP伺服器要求更新的次数

  • delay:网路传输过程当中延迟的时间,单位为10^(-6)

  • offset:时间补偿的结果,单位与10^(-6)

  • jitterLinux系统时间与BIOS硬体时间的差异时间, 单位为10^(-6)秒。

3ntptrace -n 127.0.0.1

ntptrace -n 127.0.0.1



127.0.0.1: stratum 4, offset -0.019501, synch distance 0.298589

192.168.0.4: stratum 3, offset 0.005055, synch distance 0.200525

61.129.66.79: stratum 2, offset 0.006232, synch distance 0.123439

209.81.9.7: stratum 1, offset -0.000008, synch distance 0.000465, refid 'GPS'

其它:

时间设置:

如果时间差别太大、或者在没有时间同步服务器的情况下可以用手动设置的方法

时间

1、查看时间和日期

date

2、设置时间和日期

date -s "dd/mm/yyyy hh:mm:ss"

将系统日期设定成1996610日的命令

date -s 1996-06-10

将系统时间设定成下午1520秒的命令

date -s 13:52:00

3.将当前时间和日期写入BIOS,避免重启后失效

hwclock -w

简单的客户端同步法:

如果主机不算太多的话 加一条到计划任务就可以了。

#crontab -e
10 5 * * * root /usr/sbin/ntpdate 1.asia.pool.ntp.org && /sbin/hwclock -w

参考文章 :

鳥哥的Linux私房菜http://linux.vbird.org/linux_server/0440ntp.php

VI高级命令集锦及VIM应用实例

作者:Ajian 发布时间:January 14, 2009 分类:学习笔记,杂记摘要

1.交换两个字符位置

xp

2.上下两行调换

ddp

3.把文件内容反转

:g/^/m0

4.上下两行合并

J

5.删除所有行

dG

6.从当前位置删除到行尾

d$

7.从当前位置复制到行尾

y$ 如果要粘贴到其他地方 p 就可以了

由于vi 是建立在 EX 上的 所以 当键入 : 时就来到了 EX 命令状态

8.

:ab string strings

例如 ":ab usa United States of America" ,

当你在文见里插入 usa 时

United States of America 就蹦出来了

9.

:map keys new_seq

定义你当前 键盘命令

10.

:set [all]

vi or ex 的编辑状态

如 显示每行 :set nu

11.

在命令状态下,nyy表示拷贝从光标行起的下n行内容,p表示paste,可刚复制的内容粘贴在光标处的下面。

12.

单个字符替换用r,覆盖多个字符用R,用多个字符替换一个字符用s,整行替换用S

13.

:%s/old_word/new_word/g

这个指令是于在整个文件中替换特定字符串

14.光标控制

k:上移 nk 上移n行

j:下移 nj 下移n行

将光标移到第n行,按下 mk

将光标移到第m行,按下 "ay'k

即将第n到m的行存到a寄存器,以此类推,b,c........寄存器等

这样就可以将你常用的需要复用的内容粘贴到不同的寄存器中以备用

想粘贴到某处,直接将光标移到某地,按下 'ap 即可,以此类推,b,c........寄存器等

在当前屏幕中

H 跳到第一行

M 跳到中间一行

L 跳到最后一行

15.

表8-2 删除命令

删除命令操作

d l 删除当前字符(与x命令功能相同)

d 0 删除到某一行的开始位置

d ^ 删除到某一行的第一个字符位置(不包括空格或TA B字符)

d w 删除到某个单词的结尾位置

d 3 w 删除到第三个单词的结尾位置

d b 删除到某个单词的开始位置

d W 删除到某个以空格作为分隔符的单词的结尾位置

d B 删除到某个以空格作为分隔符的单词的开始位置

d 7 B 删除到前面7个以空格作为分隔符的单词的开始位置

d) 删除到某个语句的结尾位置

d 4) 删除到第四个语句的结尾位置

d( 删除到某个语句的开始位置

d } 删除到某个段落的结尾位置

d { 删除到某个段落的开始位置

d 7 { 删除到当前段落起始位置之前的第7个段落位置

d d 删除当前行

d /t e x t 删除从文本中出现" t e x t"中所指定字样的位置,一直向前直到下一个该字样所出现的

位置(但不包括该字样)之间的内容

d fc 删除从文本中出现字符"c"的位置,一直向前直到下一个该字符所出现的位置(包括

该字符)之间的内容

d tc 删除当前行直到下一个字符" c"所出现位置之间的内容

D 删除到某一行的结尾

d $ 删除到某一行的结尾

5 d d 删除从当前行所开始的5行内容

d L 删除直到屏幕上最后一行的内容

d H 删除直到屏幕上第一行的内容

d G 删除直到工作缓存区结尾的内容

d 1 G 删除直到工作缓存区开始的内容

修改命令操作

c l 更改当前字符

c w 修改到某个单词的结尾位置

c 3 w 修改到第三个单词的结尾位置

c b 修改到某个单词的开始位置

c W 修改到某个以空格作为分隔符的单词的结尾位置

c B 修改到某个以空格作为分隔符的单词的开始位置

c 7 B 修改到前面7个以空格作为分隔符的单词的开始位置

c 0 修改到某行的结尾位置

c) 修改到某个语句的结尾位置

c 4) 修改到第四个语句的结尾位置

c( 修改到某个语句的开始位置

c } 修改到某个段落的结尾位置

c { 修改到某个段落的开始位置

c 7 { 修改到当前段落起始位置之前的第7个段落位置

c tc 修改当前行直到下一个字符c所出现位置之间的内容

C 修改到某一行的结尾

c c 修改当前行

5 c c 修改从当前行所开始的5行内容

.重复上一次修改!

表8-4 替换命令

替换命令操作

s 将当前字符替换为一个或多个字符

S 将当前行替换为一个或多个字符

5 s 将从当前字符开始的5个字符替换为一个或多个字符

vi替换使用规则:

:g/s1/s/s2/s3/g

第一个g表示对每一个包括s1的行都进行替换,第二个g表示对每一行包括s1的行所有的s2都用s3替换

s表示替换,s2是要被替换的字符串,他可以和s1相同(如果相同的话用//代替),s3是替换字符串

16.

fx

往右移动到 x 字符上

Fx

往左移动到 x 字符上

tx

往右移动到 x 字符前

Tx

往左移动到 x 字符后

(注意:以上四个命令中,其中x是键入的字符)

;

分号,配合 f 和 t 使用,重复一次

,

逗号,配合 f 和 t 使用,反方向重复一次

17. vi 环境选项 Solaris ksh

noautoindent nomodelines noshowmode

autoprint nonumber noslowopen

noautowrite nonovice tabstop=8

nobeautify nooptimize taglength=0

directory=/var/tmp paragraphs=IPLPPPQPP LIpplpipnpbtags=tags /usr/lib/tags

noedcompatible prompt tagstack

noerrorbells noreadonly term=vt100

noexrc redraw noterse

flash remap timeout

hardtabs=8 report=5 ttytype=vt100

noignorecase scroll=11 warn

nolisp sections=NHSHH HUuhsh+c window=23

nolist shell=/bin/ksh wrapscan

magic shiftwidth=8 wrapmargin=0

mesg noshowmatch nowriteany

For C-Shell:

setenv EXINIT "set nu"

For Bourne or Korn Shell:

EXINIT="set nu"; export EXINIT

For Korn Shell Only (alternate method):

typeset -x EXINIT="set nu"

在 .profile 里设置 vi 的环境选项 , 以上均测试过

18.标记文本

mchar

用字母char标记当前光标的位置

`char

移至char所标记处

'char

移至char标记所在行的开头处

"

移至当前行上一次所在位置(在光标移动之后)――一个双引号

''

移至当前行上第一次所在位置的行的开头处(在光标移动之后)――两个单引号

19.

同时vi多个文件时,CTRL-SHIFT-6回到上一个文件,在本次vi的文件和上次vi的文件之间切换。

但是我发现一个BUG:在用CTRL-SHIFT-6切换到上一个文件后,用:args查看多文件vi状态时,

屏幕底部仍然显示目前vi的是刚才的文件。

(在HP-UX,Solaris,AIX上通过)

也可以使用:

:e#

进行切换

20.

sco 下VI 要在文本前同样的字符加用

%s/^/要加的内容/g 要在文本后同样的字符加

%s/$/要加的内容/g

21.

如何去掉文本中的 ^M 硬回车?不必用binary传回去再ascii传回来的方式,用shell或者unix语句实现。

cat filename |tr -d '\015' >newfile

不同的unix系统还存在一些其他不同的命令,如:doscp

sed 也可以实现这个功能.

dos2unix filename filename2

反之

unix2dos filename filename2

在vi 中用:$s/^M//g

^是crtl-V crtl-M

22.如何在"unix命令行"下将一个文件的某字符串用另一个串换掉

sed 's/string1/string2/gp' file1 > file2

23.将/etc/hosts下所有的地址都ping 2次

1 #/usr/bin/sh

2 #grad /etc/hosts and ping each address

3 cat /etc/hosts|grep -v '^#' | while read LINE

4 do

5 ADDR=`awk '{print $1}'`

6 for MACHINE in $ADDR

7 do

8 ping $MACHINE -n 2

9 done

10 done

24

到前一个函数[[ ,到下一个函数]] ,括号配对% ,交叉参考Ctrl_] (事先用ctags做索引),回来用e# ` 编辑一个函数:vi -t 函数名 ,编辑加密文本vi -X

25

在插入模式下ctrl+p,自动补齐剩余单词,以赖规则:tags,以有的单词等等

当今世界,文本编辑器种类繁多,大有"乱花渐欲迷人眼"之势。中国有句古语:手巧不如家什妙,作为IT业的专业人士,选择一款优秀的编辑软件至关重要。笔者认为:LINUX下的VIM※以其强大的功能和无穷的魅力将使您终生受益。

作者:闫石 (iloveibm@163.com)

来自:http://www-900.ibm.com/developerWorks/cn/linux/l-tip-prompt/tip15/index.shtml

由于被广泛移植,无论是PC机的DOS和WINDOWS,还是RISC/6000的AIX,乃至于IBM的大型机S/390,都能见到VIM的身影。然 而,对于初学者,VIM的用户界面与使用方法非常不符合常规,甚至认为它比较混乱,无所适从。事实上,VIM编辑器是专门为经验丰富的用户设计的,它的界 面和使用方法提供了更快的速度和更强的功能。对于熟知它的用户,VIM的许多特性节省了时间和击键次数,并可以完成一些其他编辑器无法完成的功能。

学习的最好方法是实践,唯有如此,才能真正掌握其中的精髓。文中列举的实例,都是笔者在实际工作中遇到的,具有一定的代表性,请大家在阅读的过程中仔细体会。

好了,现在让我们共同畅游神奇的VIM的世界!

例一、两个常用的指令序列

xp 左右交换光标处两字符的位置。

ddp 上下交换光标处两行的位置。

例二、重复输入同一字符

有时,我们可能想多次输入同一字符,VIM的插入功能可以很好的完成这项工作

命令 80i=^ESC 一次可以输入80个字符= ,当然,80a=^ESC 也可以完成上述功能。

请注意:此处的^ESC表示键盘左上方上的ESC键。

例三、将两个文本数据文件按行逐条合并,并给出标尺

数据文件1内容如下:

1-----

2-----

3-----

数据文件2内容如下:

1=====

2=====

3=====

要求的结果如下:

|--------1---------2---------3---------4---------5

1-----

1=====

|--------1---------2---------3---------4---------5

2-----

2=====

|--------1---------2---------3---------4---------5

3-----

3=====

也许您会说,这还不简单,无非是反复拷贝、粘贴,任何一款文本编辑器都能完成上述功能。可是,如果这两个文件都很大,每个文件都成千上万行,恐怕简单的 拷贝、粘贴就难以胜任了。因此,我们所关心的,是找到一种行之有效的方法,把枯燥乏味的工作留给计算机,我们只需发布指令。为达到此目的,请按以下步骤执 行:

㈠、将两文件合并,结果如下

1-----

2-----

3-----

1=====

2=====

3=====

㈡、在两文件头尾相接的地方插入标志行,用以区分两个文件,本文采用的是一整行!字符

1-----

2-----

3-----

!!!!!!!!!!!!!!!!!!!!!!!!

1=====

2=====

3=====

㈢、在标志行的下方输入标尺

1-----

2-----

3-----

!!!!!!!!!!!!!!!!!!!!!!!!

|--------1---------2---------3---------4---------5

1=====

2=====

3=====

㈣、执行宏命令脚本merge_2r.vim,即在VIM编辑器中按如下键 :so merge_2r.vim 回车

㈤、按下键盘上的=键,执行的结果如下

|--------1---------2---------3---------4---------5

1-----

1=====

|--------1---------2---------3---------4---------5

2-----

2=====

|--------1---------2---------3---------4---------5

3-----

3=====

|--------1---------2---------3---------4---------5

!!!!!!!!!!!!!!!!!!!!!!!!

|--------1---------2---------3---------4---------5

㈥、将最后三行删除,即可得到我们需要的结果

|--------1---------2---------3---------4---------5

1-----

1=====

|--------1---------2---------3---------4---------5

2-----

2=====

|--------1---------2---------3---------4---------5

3-----

3=====

怎么样,简单吗?请大家自己实际尝试一下。下面,我来详细讲解宏命令脚本merge_2r.vim 。

该脚本内容如下:

"--------------------------------------------------------------------

"Macro Function : Merge File1 And File2,Have Ruler in every record

" Date : 2001/12/01

" Author : Yan Shi

"--------------------------------------------------------------------

"1-----

"2----- } Sample File1

"3-----

"!!!!!!!!!!!!!!!!!!!!!!!! Flag Row

"|--------1---------2---------3---------4---------5 Ruler

"1=====

"2===== } Sample File2

"3=====

"--------------------------------------------------------------------

:1

:map = ma/!!!!!^M+:.co 'a-1^M/!!!!!^M2+:.m'a^M+=

前14行每行都以"开始,表明该行是注释行,实际并不执行,只是方便读者阅读,只有最后两行才是真正的代码行。请注意:本例中的^M表示键盘上的回车键,并非^和M两个字符。为了讲述清楚,我把命令行分解开,逐一说明。

首先将第一行置为当前行,然后执行map命令,将一大串VIM指令映像给字符=。这一大串VIM指令共分9步执行:

ma 将数据文件一的第一行标记为a

1-----

2-----

3-----

!!!!!!!!!!!!!!!!!!!!!!!!

|--------1---------2---------3---------4---------5

1=====

2=====

3=====

/!!!!!^M 找到标志行,置为当前行

1-----

2-----

3-----

!!!!!!!!!!!!!!!!!!!!!!!!

|--------1---------2---------3---------4---------5

1=====

2=====

3=====

+ 光标下移一行,即把标尺行置为当前行

1-----

2-----

3-----

!!!!!!!!!!!!!!!!!!!!!!!!

|--------1---------2---------3---------4---------5

1=====

2=====

3=====

:.co 'a-1^M 把标尺行复制到标记行(数据文件一的第一行)的上方

|--------1---------2---------3---------4---------5

1-----

2-----

3-----

!!!!!!!!!!!!!!!!!!!!!!!!

|--------1---------2---------3---------4---------5

1=====

2=====

3=====

/!!!!!^M 再次找到标志行,置为当前行

|--------1---------2---------3---------4---------5

1-----

2-----

3-----

!!!!!!!!!!!!!!!!!!!!!!!!

|--------1---------2---------3---------4---------5

1=====

2=====

3=====

2+ 光标下移2行,即数据文件二的第一行置为当前行

|--------1---------2---------3---------4---------5

1-----

2-----

3-----

!!!!!!!!!!!!!!!!!!!!!!!!

|--------1---------2---------3---------4---------5

1=====

2=====

3=====

:.m'a^M 把数据文件二的第一行移至标记行的下方

|--------1---------2---------3---------4---------5

1-----

1=====

2-----

3-----

!!!!!!!!!!!!!!!!!!!!!!!!

|--------1---------2---------3---------4---------5

2=====

3=====

+ 光标下移一行,即数据文件一的第二行置为当前行

|--------1---------2---------3---------4---------5

1-----

1=====

2-----

3-----

!!!!!!!!!!!!!!!!!!!!!!!!

|--------1---------2---------3---------4---------5

2=====

3=====

= 这一步很关键,是典型的递归调用,重复完成以上步骤

例四、在文件中置入行号

工作中,我们有时希望把行号置入文件中,而VIM提供的功能 :set nu 只能显示行号,不能编辑或将其置入文件当中,下面的宏命令脚本row_num.vim可以完成此项功能。

"------------------------------------------

"Macro Function : Source File Add Row_Num

" Date : 2001/12/01

" Author : Yan Shi

"------------------------------------------

:%s/^/^I/

:$

:let end=line(".")

:1

"------------------------------------------

:let num=1

:while num<=end

:let line=getline(".")

:let temp=substitute(line,$,num,"")

:call setline(".",temp)

:+

:let num=num+1

:endwhile

"------------------------------------------

请注意:本例中的^I表示键盘上的TAB键,并非^和I两个字符。下面,我针对该宏命令脚本逐一讲解。

:%s/^/^I/ 每一行的行首添加一个TAB字符

:$ 到文件的末行

:let end=line(".") 末行的行号 ==〉变量 END,函数line的功能是取得指定行的行号,此处参数"."表示当前行

:1 到文件的首行

"------------------------------------------

:let num=1 1 ==〉计数器

:while num<=end

:let line=getline(".") 取当前行的内容 ==〉变量 LINE

:let line=substitute(line,$,num,"") 在变量 LINE 的前面置入行号

:call setline(".",line) 将变量 LINE 的内容写回当前行

:+ 下移一行

:let num=num+1 计数器加一

:endwhile 循环执行,直到文件结束

"------------------------------------------

有关正则表达式的使用

UNIX/LINUX下的很多工具之所以强大、灵活,关键是因为有了正则文法和元字符,这也是VIM乃至UNIX/LINUX系统的精华所在。正因为使 用灵活,因此掌握起来比较吃力,如果不是真正理解,实际运用中会出现千奇百怪的错误。因此,有必要对这部分知识多花些气力。下面结合具体实例讲解。

例五、有一文件,包含某外企的中国员工的资料,首先是姓名,然后是两个空格,其次是15位身份证号码。

zhang.fei 430759701022003

diao.chan 651302801225012

guan.yu 342869680413001

xi.shi 120638780214006

liu.bei 210324650708001

现在,有以下问题需要解决:

按照外国人的习惯,应该是名在前,姓在后。因此,文件中的姓名字段需要修改。

姓与名的首字母应该大写。

根据身份证号码,还可以判断出生年月日,将其作为一个新字段添加。

根据身份证号码,可以判断出性别。若为男性,添加male,若为女性,添加female 。

将男女员工分开,男员工在前,女员工在后。

将各字段数据左对齐

最终结果如下:

Fei.Zhang 430759701022003 1970/10/22 male

Yu.Guan 342869680413001 1968/04/13 male

Bei.Liu 210324650708001 1965/07/08 male

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

Chan.Diao 651302801225012 1980/12/25 female

Shi.Xi 120638780214006 1978/02/14 female

为了完成上述功能,只需执行脚本employee.vim ,使用方法为 :so employee.vim 回车即可。

脚本内容如下:

:%s/ / /

:%s/\(............\)\( *\)/\1/

:%s/\([A-Za-z][A-Za-z]*\)\(\.\)\([A-Za-z][A-Za-z]*\)/\u\3\2\u\1/

:%s/$/ xxxxxx/

:%s/\([0-9]\{6}\)\([0-9]\{6}\)\([0-9]\{3}\) \(xxxxxx\)/\1\2\3 \2/

:%s/\(..\)\(..\)\(..\)$/19\1\/\2\/\3

:%s/$/ xxxxxx/

:%s/\([0-9]\{14}[13579]\)\(.*\)\(xxxxxx\)/\1\2male /

:%s/\([0-9]\{14}[02468]\)\(.*\)\(xxxxxx\)/\1\2female/

:$

:s/.*/&^M-----------------------------------------------

:g/female/.m$

在这个脚本中,使用了大量的正则表达式,这里仅对涉及到的正则表达式做一简要介绍。有关正则表达式的内容相当多,本文不可能占用大量篇幅叙述,请大家谅解。

% 地址范围符号,代表文件中的所有行,作用等同于地址范围 1,$

. 与任意单字符(换行符除外)匹配,例如 y.s 可以匹配 yas y.s 或 y s 等等。

* 与前一字符的0次或多次出现匹配,例如 y*s 可以匹配 yys yyyyys 或 s 等等。

$ 与行尾匹配。

& 代表模式匹配中出现的字符串,例如 s/abc/&def 是把当前行的abc替换成abcdef 。

[] 匹配[]中出现的字符,例如[abc]匹配字符 a,b 或 c ,[a-zA-Z]匹配所有的英文字符。

\( \) \(和\)之间出现的内容可以由\num来替代。

\1\2\3 替代\(和\)之间出现的内容。

\u 将后续字符串的首字母大写。

\{num} 与前一字符的num次出现匹配。

现在,我们对脚本逐条讲解,希望能帮助大家理解正则文法。

⑴:%s/ / /

将文件中每行出现的2个空格替换为10个空格。

zhang.fei 430759701022003

diao.chan 651302801225012

guan.yu 342869680413001

xi.shi 120638780214006

liu.bei 210324650708001

⑵:%s/\(............\)\( *\)/\1/

保留行首的12个字符,将其余的空格删除,这样,前两个字段就对齐了。

zhang.fei 430759701022003

diao.chan 651302801225012

guan.yu 342869680413001

xi.shi 120638780214006

liu.bei 210324650708001

⑶:%s/\([A-Za-z][A-Za-z]*\)\(\.\)\([A-Za-z][A-Za-z]*\)/\u\3\2\u\1/

将文件中每行出现的雇员姓名互换,并将首字母大写。

Fei.Zhang 430759701022003

Chan.Diao 651302801225012

Yu.Guan 342869680413001

Shi.Xi 120638780214006

Bei.Liu 210324650708001

⑷:%s/$/ xxxxxx/

在每一行的行尾添加2个空格和6个x

Fei.Zhang 430759701022003 xxxxxx

Chan.Diao 651302801225012 xxxxxx

Yu.Guan 342869680413001 xxxxxx

Shi.Xi 120638780214006 xxxxxx

Bei.Liu 210324650708001 xxxxxx

⑸:%s/\([0-9]\{6}\)\([0-9]\{6}\)\([0-9]\{3}\) \(xxxxxx\)/\1\2\3 \2/

将xxxxxx替换成出生年月日。

Fei.Zhang 430759701022003 701022

Chan.Diao 651302801225012 801225

Yu.Guan 342869680413001 680413

Shi.Xi 120638780214006 780214

Bei.Liu 210324650708001 650708

⑹:%s/\(..\)\(..\)\(..\)$/19\1\/\2\/\3

将年月日用/字符分隔,并在年前添加19。

Fei.Zhang 430759701022003 1970/10/22

Chan.Diao 651302801225012 1980/12/25

Yu.Guan 342869680413001 1968/04/13

Shi.Xi 120638780214006 1978/02/14

Bei.Liu 210324650708001 1965/07/08

⑺:%s/$/ xxxxxx/

在每一行的行尾添加2个空格和6个x

Fei.Zhang 430759701022003 1970/10/22 xxxxxx

Chan.Diao 651302801225012 1980/12/25 xxxxxx

Yu.Guan 342869680413001 1968/04/13 xxxxxx

Shi.Xi 120638780214006 1978/02/14 xxxxxx

Bei.Liu 210324650708001 1965/07/08 xxxxxx

⑻:%s/\([0-9]\{14}[13579]\)\(.*\)\(xxxxxx\)/\1\2male /

身份证号码末位是奇数的,将xxxxxx替换成male

Fei.Zhang 430759701022003 1970/10/22 male

Chan.Diao 651302801225012 1980/12/25 xxxxxx

Yu.Guan 342869680413001 1968/04/13 male

Shi.Xi 120638780214006 1978/02/14 xxxxxx

Bei.Liu 210324650708001 1965/07/08 male

⑼:%s/\([0-9]\{14}[02468]\)\(.*\)\(xxxxxx\)/\1\2female/

身份证号码末位是偶数的,将xxxxxx替换成female

Fei.Zhang 430759701022003 1970/10/22 male

Chan.Diao 651302801225012 1980/12/25 female

Yu.Guan 342869680413001 1968/04/13 male

Shi.Xi 120638780214006 1978/02/14 female

Bei.Liu 210324650708001 1965/07/08 male

⑽:$ 到文件的最后一行

⑾:s/.*/&^M-----------------------------------------------

在文件的最末行插入一行 "-" 字符。

Fei.Zhang 430759701022003 1970/10/22 male

Chan.Diao 651302801225012 1980/12/25 female

Yu.Guan 342869680413001 1968/04/13 male

Shi.Xi 120638780214006 1978/02/14 female

Bei.Liu 210324650708001 1965/07/08 male

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

⑿:g/female/.m$

将所有的女员工记录移至文件尾。

Fei.Zhang 430759701022003 1970/10/22 male

Yu.Guan 342869680413001 1968/04/13 male

Bei.Liu 210324650708001 1965/07/08 male

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

Chan.Diao 651302801225012 1980/12/25 female

Shi.Xi 120638780214006 1978/02/14 female

笔者目前正在为某外资公司从事大型机(IBM S/390)的软件开发,一切工作都在TSO环境中进行。为了对编写的程序进行测试,必须准备测试数据。有过大型机开发经验的人会知道,通过TSO,输入 字符型数据还可以,如果要输入16进制数据,操作起来很麻烦。因为16进制数是纵向排列的,输入时既不方便,又很容易错位。怎么解决呢?我尝试了几种办 法,实际证明,用VIM最方便。

例六、下列数据 1234567890ABCDEF ,将其变成 13579ACE 24680BDF 的形式,这样,数据就可以很方便的粘贴到TSO环境中了。

下面给出宏命令脚本change_d.vim

"----------------------------------------------------

"Macro Function : Convert Char Arrange Direction

"

" Sample : 40 50 60 ==> 4 5 6

" 0 0 0

" Date : 2001/12/01

" Author : Yan Shi

"----------------------------------------------------

:s/.*/&^M/

:1

:map = malx+$p-`al=

说明如下:

⑴ :s/.*/&^M/ 在数据行下方添加一空行。

⑵ :1 回到文件的首行的首字符。

⑶ :map = malx+$p-`al= 将一大串VIM命令映像给字符=

① ma 将首字符标记为a

② l 光标右移一个字符

③ x 删除光标处字符

④ + 移至下一行

⑤ $ 到行尾

⑥ p 将删除的字符粘贴

⑦ - 回至上一行

⑧ `a 返回到标记字符处

⑨ l 光标右移一个字符

⑩ = 递归调用,重复以上步骤,直到将该行所有的数据处理完。

Linux命令整理

作者:Ajian 发布时间:January 9, 2009 分类:学习笔记

1.    输出文件内容

cat :输出文件内容

od :以不同方式输出文件内容

tac :将文件内容由尾到头显示

1.    切换目录

cd :切换目录

1.    列出文件或目录的属性

dir :显示文件和目录列表

du :显示目录或是文件的大小

file :显示文件类型

ls :列出目录或者文件名称

pwd :显示当前所在目录

stat :显示文件或文件系统的状态

1.    文件比较

cmp :比较两个文件的差异

comm :比较文件内容

diff :比较并显示文件差异的部分

diffstat :有diff比较的结果显示统计数字

1.    搜索文件内容

egrep :搜索文件中的特定字符串

fgrep :查找文件中的特定字符串

grep :搜索文件中符合条件的字符串

1.    搜索文件位置

find :查找特定字符串的文件或目录

locate :在系统中搜索包含字符串的文件

slocate :查找文件或是目录

whereis :扩展查找指定文件的命令

which :查找指定的文件

1.    文件或目录的产生、复制、删除、更名与搬移

cp :复制文件或目录

mkdir :新建目录

mv :移动或更名现有的文件或目录

rm :删除文件或目录

rmdir :删除目录

scp :使用加密联机远程复制文件

touch :更改文件的输出控制

1.    文件内容的输出控制

head :输出文件内容最前面的部分

tail :输出文件内容最后面的部分

pg :浏览文本文件

less :显示文件内容

more :文件的浏览工具

1.    文件内容的过滤处理

col :过滤保留字符

csplit :分割文件

dd :转换及输出数据

fold :修改文件显示的宽度

1.    文件的链接与合并

join :将两文件相同的区域合并

ln :建立文件之间的连接

paste :合并文件的内容

split :分割文件

tee :文件内容的输出与输入

1.    其他

echo :显示文字

wc :计算文件的字节数、字数、行数

------------------日期与时间编程(时间与计划)------------------

•    指定时间任务

at :在指定的时间执行特定的命令

atq :查询待执行的任务

atrm :删除待执行的任务

batch:执行批处理任务

月历与日期

cal :显示月历

date:显示与修改日期时间

计划任务

crontab :设置计划任务

hwclock :显示与设置硬件时间

logrotate:定期或定量将记录文件压缩备份

nohup :退出系统后仍可以继续执行该指令

其他

sleep :时间暂停

time :计算消耗时间

uptime:提供当前时间、系统运行时间等

------------------使用者咨询与管理------------------

chfn :

chsh

finger

last

passwd

who

------------------讯息传送与信件管理------------------

aliases

mail

mailq

mesg

newaliases

talk

wall

write

------------------工作进程查询与管理------------------

renice

skill

top

kill

nice

ps

------------------字符串处理------------------

expr

tr

------------------终端机管理------------------

clear

reset

------------------压缩打包------------------

bz2的压缩与解压缩

bunzip2:解开bz2格式的压缩文件

bzip2 :将文件压缩为bzip2的格式

Z的压缩与解压缩

compress :压缩或是解压缩扩展名为.Z的文件

uncompress:解压缩扩展名为.Z的文件

GZ的压缩与解压缩

gunzip:解压缩文件

gzexe :压缩成自动解压缩文件

gzip :压缩文件

zip的压缩与解压缩

unzip :解压缩zip的文件

zcat :列出压缩文件中被压缩的文件名称

zip :压缩文件

zipinfo:显示压缩文件信息

dump相关

dump :ext2文件系统的备份命令

restore:将dump所产生的数据还原

打包相关

ar :打包与解开文件

tar:打包文件

其他

isosize :显示iso9600格式的文件系统大小

uudecode:将 uuencode 编码后的档案还原

uuencode:二进位档转换成七位元的档案

------------------文件打印------------------

lpd :常驻的打印机管理程序

lpq :列出打印机队列的状态

lpr :将档案或是由标准输入送进来的资料送到打印机贮列之中

lprm :删除正在打印的作业

pr :打印前的重新排版

------------------磁片工具------------------

mformat

fdformat

mkdosfs

------------------设备管理------------------

makedev

dumpkeys

loadkeys

rdev

setleds

------------------文件系统------------------

dd

df

e2fcsk

exportfs

fdisk

fsck

mkfs

fstab

mount

swapon

sync

------------------使用者管理------------------

adduser

useradd

userdel

usermod

users

groupadd

groupdel

groupmod

groups

passwd

gpasswd

su

sudo

------------------起始管理------------------

halt

init

reboot

shutdown

------------------dos兼容指令------------------

mattrib:修改 MS_DOS 档案的属性

mcd :切换MSDOS的目录,变更 mtools 系列指令目前在 MSDOS 磁碟上的工作目录

mlabel:设定磁碟的标签 (Label)

mdeltree:删除 MSDOS 格式档案及目录

mcopy:复制 MSDOS 格式档案到 Linux 中

mdel:删除 MSDOS 格式的档案

mkbootdisk:建立启动盘

mtools:显示mtools所支持的指令