Skip navigation.

exploreopera

| Help

Sign up | Help

极湖

无不用其“极”

Posts tagged with "Unix"

Vim 使用技巧集锦

, , , ...

搜索
/joe/e : 设置光标到匹配"joe"的末尾
/joe/e+1 : 设置光标到匹配"joe"的末尾再后移一位
/joe/s-2 : 设置光标到匹配"joe“的开头再前移两位
/joe/-2 : 设置光标到匹配"joe“的行再向上移两行的开头
/^joe.*fred.*bill/ : 匹配以“joe”开头且"joe"到"fred"到"bill"之间没有字符或者有字符
/^[A-J]\+/ : 搜索以'A'到’J‘间的一个或者多个字母组合的开头
/begin\_.*end : 多行匹配,begin和end可以不在同一行,因为\_.包括\n
/fred\_s*joe/i : 可以是任何空白字符包括空格,\t,\n等等
/fred\|joe : 搜索fred或者joe
/.*fred\&.*joe : 搜索同时包括fred跟joe的行。注意,\&表示“且”,所以行中不一定要求fred在joe前
/\<fred\>/i : 搜索独立的单词fred
/\<\d\d\d\d\> : 搜索独立的4位数字
/\D\d\d\d\d\D : 搜索6位字符串,中间4位数字,首尾两位不能为数字
/\<\d\{4}\> : 同/\<\d\d\d\d\>

查找空行
/^\n\{3} : 匹配3个连续的空行

使用正则表达式组查找
/\(fred\).*\(joe\).*\2.*\1

正则表达式重复
/^\([^,]*,\)\{8}

visual searching
:vmap // y/<C-R>"<CR> : 可视模式下的键盘映射。把//映射成“查找当前选中的文本”,y表示将当前选中内容拷贝到"寄存器中,然后/开始查找,查找内容是后面的输入,<C-R>表示ctrl-r,<CR>是回车
:vmap <silent> // y/<C-R>=escape(@", '\\/.*$^~[]')<CR><CR> : 包括空白字符,加上<silent>,是为了在屏幕最下面的命令行不显示该命令。

\zs 和 \ze 匹配原 :h /\zs
/<\zs[^>]*\ze> : 匹配尖括号中的内容

零宽度匹配 :h /\@=
/<\@<=[^>]*>\@= : 匹配<>标签中的内容,而忽略<和>本身
/<\@<=\_[^>]*>\@= : 和上例相比,差别在于允许跨行

多行查找 \_ 的意思是包括换行符
/ : 匹配结尾的所有内容
/fred\_s*joe/i : 匹配fred开始到joe,之间没有任何字符或者是有空白字符
/bugs\(\_.\)*bunny : 匹配所有bugs到bunny的字符串
:h \_ : help

查找函数声明,nmap为normal模式下的键盘映射
:nmap gx yiw/^\(sub\<bar>function\)\s\+<C-R>"<CR> : yiw表示将当前所在单词拷贝到寄存器"中,<bar>表示|,即sub或者function

查找多个文件
:bufdo /searchstr/ : 在多个文件缓冲区里执行查找

更好的多文件查找定位方法
:bufdo %s/searchstr/&/gic : 在多个文件缓冲区里查找,按下n停止

怎样不使用 / 来查找网址
?http://www.vim.org/ : 向上查找

查找指定字符以外的字符串
/\c\v([^aeiou]&\a){4} : 查找4个辅音字母,\c表示忽略大小写,\v表示后面所有ascii字符,除了0-9,a-z,A-Z以及_,均有特殊含义,就是所谓非常magic,而 \V表示后面的内容中只有反斜杠\含有特殊含义,就是所谓的非常不magic,(和)中间的内容,表示首先不能是aeiou,但是必须是\a(字母)。

----------------------------------------
替换
:%s/fred/joe/igc : 普通替换命令
:%s/\r//g : 删除 DOS 的换行符 ^M

你的文本文件是否乱七八糟的排成一行?使用如下命令
:%s/\r/\r/g : 转换 DOS 回车符 ^M 为真正的回车符
:%s= *$== : 删除行尾空白
:%s= \+$== : 同上
:%s#\s*\r\?$## : 删除尾部空白和dos换行符
:%s#\s*\r*$## : 同上

删除空行
:%s/^\n\{3}// : 删除连续3个空行
:%s/^\n\+/\r/ : 压缩空行,多个替换为一个
%s#<[^>]\+>##g : 删除html的tag部分

如果你只想学一招,那么就是这个了
:'a,'bg/fred/s/dick/joe/igc : 非常有用
# ''a,''b指定一个范围:mark a ~ mark b
# g//用一个正则表达式指出了进行操作的行必须可以被fred匹配
# 看后面,g//是一个全局显示命令
# s/dick/joe/igc则对于这些满足条件的行进行替换

复制最后一个字段
:%s= [^ ]\+$=&&= : 复制最后一个字段
:%s= \f\+$=&&= : 一样
:%s= \S\+$=&& : 一样!

记忆(反向引用)
:s/\(.*\):\(.*\)/\2 : \1/ : 将两个字段颠倒
:%s/^\(.*\)\n\1$/\1/ : 删除重复行

非贪婪匹配 \{-}
:%s/^.\{-}pdf/new.pdf/ : 将第一个pdf的名字换为new.pdf

使用可选原子 \?
:%s#\<[zy]\?tbl_[a-z_]\+\>#\L&#gc : 匹配tbl前面没有字母,或者z和y中的某一个字母,然后将所有的字母变为小写

跨越尽量多的行
:%s/// : 删除多行注释
:help /\{-} : 查看非贪婪匹配的更多帮助

使用寄存器替换
:s/fred/<c-r>a/g : 将fred替换为寄存器a里的内容,<c-r>为按下Ctrl与r,然后输入a后,寄存器a的内容会出现在命令行
:s/fred/<c-r>asome_text<c-r>s/g
:s/fred/\=@a/g : 与第一条的作用相同,但是更优雅一些,因为不会在命令行显示寄存器的内容

在一行里写多种命令
:%s/\f\+\.gif\>/\r&\r/g | v/\.gif$/d | %s/gif/jpg/ : 将所有带有.gif的行,前后均加入一个空行;将不带有.gif字样的行全部删除;将所有行中的gif换成jpg;注意三条语句,一旦某一条失败,则不执行下面的语句
:%s/a/but/gie|:update|:next : 首先,将当前文件中的所有a变为but;然后保存文件;最后进入下一个文件缓存区。如果有多个文件需要如此处理,可以考虑使用 @:来重复,@:的意义是:执行上一次的命令行命令n次。

或运算
:%s/suck\|buck/loopy/gc : 替换suck或者buck为loopy(这里|不是管道)

调用vim函数
:s/__date__/\=strftime("%c")/ : 将__date__替换成当前日期,使用strftime函数。注意\=表示后面是表达式,结果可能是2008-1-3 17:59:46

处理字段,替换所有在第三个字段中的str1为str2
:%s:\(\(\w\+\s\+\)\{2}\)str1:\1str2:

交换第一列跟第四列
:%s:\(\w\+\)\(.*\s\+\)\(\w\+\)$:\3\2\1:

过滤form中的内容放在寄存器里
:redir @*|sil exec 'g#<\(input\|select\|textarea\|/\=form\)\>#p'|redir END : redir是将执行的结果重定向到后面的*寄存器中,sil是silent
:nmap ,z :redir @*<Bar>sil exec 'g@<\(input\<Bar>select\<Bar>textarea\<Bar>/\=form\)\>@p'<Bar>redir END<CR> : 普通模式下,敲入,z,命令行执行redir @*|sil exec 'g@<\(input\|select\|textarea\|/\=form\)\>@p'|redir END

一位以上的数字减3(带进位,这个命令挺有趣)
:%s/\d\+/\=(submatch(0)-3)/

包含loc或者functions的行中的数字加6
:g/loc\|function/s/\d/\=submatch(0)+6/

比上面更好的方法
:%s#txtdev\zs\d#\=submatch(0)+1#g : \zs表示是s要匹配的的内容的开头
:h /\zs : 查看帮助

前缀为gg的数字加6
:%s/\(gg\)\@<=\d\+/\=submatch(0)+6/
:h zero-width : 查看帮助

替换一个特定字符串为数字
:let i=10 | 'a,'bg/Abc/s/yy/\=i/ |let i=i+1 : 将yy转换成10,11,12等等

比上面的更精确
:let i=10 | 'a,'bg/Abc/s/xx\zsyy\ze/\=i/ |let i=i+1 : 将xxyy 转换成 xx11(第一行),xx12(第二行),xx13(第三行)

发现要替换的文本,放入内存,然后使用\zs来简化替换
:%s/"\([^.]\+\).*\zsxx/\1/ : \zs表示是s要匹配的的内容的开头

将光标下的单词,放入替换语句的LHS中
:nmap <leader>z :%s#\<<c-r>=expand("<cword>")<cr>\># : <leader>在没有定义mapleader时为\,定义后为mapleader的值。LHS指的是s替换后面,被替换的内容(在左手边)。普通模式下,如果光标下为abc,则输入\z两个字符,结果命令行出现:%s#\<abc\>#,然后你就可以接着输入替换后的内容了。

将可视模式下的高亮文本,放入替换语句的LHS中
:vmap <leader>z :<C-U>%s/\<<c-r>*\>/

----------------------------------------
以下功能相同,在替换语句内部进行替换
每行的一部分中,只执行多个单字符的替换
:%s,\(all/.*\)\@<=/,_,g : 用_替换all后的所有/,all/中的/不变

功能同上
:s#all/\zs.*#\=substitute(submatch(0), '/', '_', 'g')#

通过将一行分开,然后重新组合,达到替换的效果
:s#all/#&^M#|s#/#_#g|-j! : 在windows下使用了mswin的模式,所以^M得输入为\r,呵呵

在替换命令中使用替换
:%s/.*/\='cp '.submatch(0).' all/'.substitute(submatch(0),'/','_','g')/ : 不work,因为all/后面的/和s所有的/有重复。所以我改为 :%s#.*#\='cp '.submatch(0).' all/'.substitute(submatch(0),'/','_','g')#

----------------------------------------
全局显示命令
:g/gladiolli/# : 查找并显示匹配的行号
:g/fred.*joe.*dick/ : 显示所有含有 fred,joe & dick的行
:g/\<fred\>/ : 显示单一单词fred
:g/^\s*$/d : 删除所有空行
:g!/^dd/d : 删除不含字符串''dd''的行
:v/^dd/d : 同上
:g/fred/,/joe/d : 删除所有的从fred到joe
:g/-------/.-10,.d : 以-------为标记删除之前的10行
:g/{/ ,/}/- s/\n\+/\r/g : 删除 {...}之间的空行
:v/\S/d : 删除空行
:v/./,/./-j : 压缩空行
:g/^$/,/./-j : 同上
:g/<input\|<form/p : 或运算
:g/^/put_ : 双倍行宽 (pu = put)
:g/^/m0 : 颠倒文件 (m = move)
:'a,'bg/^/m'b : 颠倒选中的 a 到 b
:g/^/t. : 重复行
:g/fred/t$ : 拷贝行从fred到结尾
:g/stage/t'a : 拷贝行从stage 到 marker a(a为标记的位置)
:g/\(^I[^^I]*\)\{80}/d : 删除最少包含80个tab的行,注意:^I的输入方法是ctrl-v, ctrl-i

隔行替换
:g/^/ if line('.')%2|s/^/zz /

查找标记a与b间所有包含"somestr"的行,并全部复制到第一个包含"otherstr"的行后
:'a,'bg/somestr/co/otherstr/ : co(py) or mo(ve)

与上面相同,但是多做了一次替换
:'a,'bg/str1/s/str1/&&&/|mo/str2/
:%norm jdd : 隔行删除

增加数字 (键入 <c-a>) : 在MS-Windows中<c-a>已经被定义为全选
:.,$g/^\d/exe "norm! \<c-a>": 增加从当前行首到结尾的数字
:'a,'bg/\d\+/norm! ^A : 增加数字

保存全局命令的结果 (注意必须使用添加模式) 你需要使用 qaq 清空寄存器a.
将结果存储到寄存器a或者复制缓存区中
:g/fred/y A : 添加带有fred的行到寄存器到a
:g/fred/y A | :let @*=@a : 除了同上外,还将寄存器a的内容,放入复制缓冲区
:let @a=''|g/Barratt/y A |:let @*=@a
:'a,'b g/^Error/ . w >> errors.txt : 将查找内容放入一个文件 (文件必须存在)

复制每一行,然后在复制出来的每一行左侧加上一个 print '复制出来的内容'
:g/./yank|put|-1s/'/"/g|s/.*/Print '&'/

用文件中的内容替换字符串,-d 表示删除上面的一行
:g/^MARK$/r tmp.ex | -d

优雅地显示
:g/<pattern>/z#.5 : 带有上下文一并显示
:g/<pattern>/z#.5|echo "==========" : 优雅地显示

将g//和普通模式下的命令结合起来
:g/|/norm 2f|r* : 将第二个|替换为*号

将前面g命令的输出,发送到新窗口中
:nmap <F3> :redir @a<CR>:g//<CR>:redir END<CR>:new<CR>:put! a<CR><CR>

----------------------------------------
全局命令和替换命令联姻 (强大的编辑能力)
:'a,'bg/fred/s/joe/susan/gic : 可以使用反向引用来匹配
:g/fred/,/joe/s/fred/joe/gic : 非行模式

----------------------------------------
先找fred,然后找joe
:/fred/;/joe/-2,/sid/+3s/sally/alley/gIC : 最后这一个C,手册中都没有,估计是c

----------------------------------------
为每一行生成一个文件,文件名从1.txt开始,依次为1.txt,2.txt,3,txt等等
:g/^/exe ".w ".line(".").".txt"

----------------------------------------
绝对精华

----------------------------------------
* # g* g# : 查找当前光标下的单词(单个单词) (<cword>) (向前/向后)
% : 匹配括号 {}[]()
. : 重复上次操作
@: : 重复上次的命令
matchit.vim : 适%能匹配 <script> <?php等标记
<C-N><C-P> : 插入模式下自动完成填词
<C-X><C-L> : 行自动完成(超级有用)
/<C-R><C-W> : 把单个<cword>单词放入搜索或者命令行
/<C-R><C-A> : 把字符串中有的单词<cword>放入搜索或者命令行
:set ignorecase : 忽略大小写
:syntax on : 打开语法高亮 Perl,HTML,PHP 等等
:h regexp<C-D> : 按ctrl+d得到包含regexp的列表
(按tab自动补齐)

----------------------------------------
简单编辑更新 _vimrc文件
:nmap ,s :source $VIM/_vimrc : 普通模式下的键盘映射 ,s映射成加载用户目录下的_vimrc文件
:nmap ,v :e $VIM/_vimrc : ,v映射成打开_vimrc文件

----------------------------------------
# 可视模式 (方便增加 HTML 标签)
:vmap sb "zdi<C-R>z<ESC> : 在可视模式下将选中的文本前后分别加上某些东西。"z表示寄存器z,d是删除,然后i表示插入,<C-R>指ctrl-r,然后加z,表示粘贴寄存器z的内容,最后escape键。注意:本例将删除的内容帖了回去,所以结果是什么变化都没有。
:vmap st "zdi<?= <C-R>z ?><ESC> : 在前后加上<?=和?>。

----------------------------------------
浏览
:Exp(lore) : 浏览文件
:Sex(plore) : 分割窗口浏览文件
:ls : 显示缓冲区
:cd .. : 设置当前目录位置
:args : 查看当前打开的所有文件
:lcd %:p:h : 改变路径到当前编辑的文件
:autocmd BufEnter * lcd %:p:h : 放入.vimrc自动完成上面的命令

----------------------------------------
缓冲区浏览(一直排名前10的vim脚本)
# 需要 bufexplorer.vim  (http://www.vim.org/script.php?script_id=42)
\be : 缓冲浏览器中查看缓冲列表
\bs : 同上,但是分割窗口

----------------------------------------
转换大小写
guu : 将整行的字母转换成小写
gUU : 将整行的字母转换成大写
Vu : 转换选中的行(小写)
VU : 转换选中的行(大写)
g~~ : 反向转换
vEU : 转换词大写,v表示进入可视模式,E表示覆盖到词的末尾,U表示大写。
vE~ : 反向转换词
ggguG : 将当前编辑文件内容全部转换成小写

可视模式下选择所有的字母及数字 (放入 .vimrc文件中)
vmap ,c :s/\<\(.\)\(\k*\)\>/\u\1\L\2/g<CR>

大写所有句子的第一个字母
:%s/[.!?]\_s\+\a/\U&\E/g

----------------------------------------
gf : 打开当前光标下或后的文件
:nnoremap gF :view <cfile><cr> : 打开当前光标下或光标后的文件,如果不存在则创建
ga : 显示当前光标下单个字的ascii码,十进制,十六进制……
ggVGg? : 将整个文件用rot13编码……(谁看得懂啊~~hoho)
ggg?G : 同上 (针对大文件)
:8 | normal VGg? : 将第八行用rot13编码
:normal 10GVGg? : 同上
<C-A>,<C-X> : 增加,减少当前光标下的数字,window用户缺省是将C-A映射成选中全文,所以需要重定义 CNTRL-A
<C-R>=5*5 : 插入25 (小型计算器)

----------------------------------------
几个彩蛋,有意思
:h 42 : (还有 http://www.google.com/search?q=42)
:h holy-grail
:h!

----------------------------------------
标记 & 移动
'. : 跳回最后编辑的行 (超有用)
`. : 同上,但是定位编辑点
g; : 跳转到比较旧的编辑位置(如果有的话) (vim6.3后的新功能)
g, : 这个是较新的位置 (同上)
:changes : 打出改变列表
:h changelist : 查看“改变表跳转”的帮助
<C-O> : 依次沿着你的跳转记录向回跳 (从最近的一次开始)
<C-I> : 依次沿着你的跳转记录向前跳
:ju(mps) : 列出跳转轨迹
:help jump-motions
:history : 列出历史记录
:his c : 命令行历史
:his s : 搜索历史
q/ : 搜索命令历史的窗口
q: : 命令行命令历史的窗口
:<C-F> : 历史窗口

----------------------------------------
缩写 & 映射
:map <f7> :'a,'bw! c:/aaa/x
:map <f8> :r c:/aaa/x
:map <f11> :.w! c:/aaa/xr<CR>
:map <f12> :r c:/aaa/xr<CR>
:ab php : 查看以php开头的缩写
:map , : 列出所有的映射(以逗号开始的)

允许映射 F10 (win32)
set wak=no : :h winaltkeys

映射中常使用的表示
<CR> : 回车
<ESC> : Esc
<LEADER> : 右斜杠
<BAR> : 管道符号
<BACKSPACE> : 退格键
<SILENT> : 不回显
#显示自定义的 RGB 颜色显示当前光标下的字符串 例如 #445588
:nmap <leader>c :hi Normal guibg=#<c-r>=expand("<cword>")<cr><cr>
map <f2> /price only\\|versus/ :in a map need to backslash the \

----------------------------------------
简单的 PHP 调试将所有显示的变量放入寄存器a
iab phpdb exit("
Debug <C-R>a ");


----------------------------------------
使用寄存器来映射 (放入 .vimrc文件自动加载)
:let @m=":'a,'bs/"
:let @s=":%!sort -u"

----------------------------------------
列出寄存器
:reg : 显示当前所有的寄存器
:reg a : 显示寄存器a中的内容
"1p.... : 引用一个叫1的寄存器
:let @y='yy@"' : pre-loading registers (put in .vimrc)
qqq : 清空寄存器 "q"

----------------------------------------
一些有用的决窍
"ayy@a : 把当前行作为命令执行
yy@" : 上面的匿名寄存器
u@. : 只执行键入的命令

----------------------------------------
从其它命令处获得输入(需要外部命令)
:r!ls.exe : 从ls 获得输入插入到当前位置
!!date : 从date获得输入(删除当前行)

使用外部sort排序
:%!sort -u : 用sort排序整个文件(结果覆盖整个文件)
:'a,'b!sort -u : 从mark a到mark b之间的内容进行排序
!1} sort -u : 排序一个段落
:g/^$/;,/^$/-1!sort : 将每个块排序(注意这个关键的;)

----------------------------------------
多文件管理 (基本的)
:bn : 跳转到下一个buffer
:bp : 跳转到前一个buffer
:wn : 保存当前buffer并跳转到下一个buffer (超有用)
:wp : 保存当前buffer并跳转到前一个buffer
:bd : 把当前文件从buffer移出 (超有用)
:bun : 卸载当前buffer (关闭这个窗口但是不移出)
:badd file.c : 添加file.c到buffer列表
:b 3 : 前往第三个 buffer
:b main : 前往含有main的buffer中 比如说 main.c
:sav php.html : 把当前文件存为php.html并打开
:sav! %<.bak : 换一个后缀名保存 (旧方法)
:sav! %:r.cfm : 同上
:sav %:s/fred/joe/ : 替换文件名
:sav %:s/fred/joe/:r.bak2 : 替换文件和后缀
:!mv % %:r.bak : 重命名当前文件
:e! : 打开未修改之前的文件
:w c:/aaa/% : 存储文件到指定位置
:e # : 编辑标记为#的文件在buffer中
:rew : 返回到第一个可编辑的文件
:brew : 回到第一个buffer
:sp fred.txt : 分割窗口打开fred.txt
:sball,:sb : 把所有的 buffers分割显示在一个窗口中 (超有用)
:scrollbind : 让每个分离的窗口,同步滚动
:map <F5> :ls<CR>:e # : 按F5显示所有buffer, 并显示行号
:set hidden : 允许不保存当前buffer而进行切换

----------------------------------------
在分割窗口中快速切换
map <C-J> <C-W>j<C-W>_
map <C-K> <C-W>k<C-W>_

----------------------------------------
录制命令 (最好的技巧)
qq : 录制命令放入 q寄存器
(输入一些命令)
q : 录制结束
@q : 执行放入寄存器q中的内容
@@ : 重复
5@@ : 重复5次

编辑一个 寄存器/录制
"qp : 显示寄存器q中的内容(普通模式下)
<ctrl-R>q : 显示寄存器q中的内容 (插入模式下)

你现在可以看到记录内容,随便编辑
"qdd : 删除,重新存入q
@q : 执行 录制/寄存器 q

在可视块中运行记录
1) 定义记录/寄存器
qq:s/ to/ from/g^Mq
2) 定义可视块
V}
3) 键入:将显示下面信息
:'<,'>
4)完成如下操作
:'<,'>norm @q

----------------------------------------
将一个录制和一个映射绑定 (在命令模式中结束)
nnoremap ] @q:w!<bar>bd

----------------------------------------
可视化模式提供一种灵活易用的方法选择一块文本供操作符使用
可视化模式基础
v : 进入可视化模式
V : 进入可视化行选择模式
<C-V> : 进入可视化块选择模式
gv : 重新选择
o : 选择的区域头尾移动
"*y : 复制选择区域到paste buffer
V% : 选择一个匹配段
V}J : 合并一个段落
V}gJ : 合并一个段落,并保留空格

----------------------------------------
删除选中的10行的前两个字符(不过这里应该假设是紧凑的排版格式,不能包含空格、tab等字符的,可是经实验应该是前3个字符才对啊??)
0<c-v>10j2ld

----------------------------------------
如何用可视块拷贝几列
可视块(并非通常的 v 命令)
<C-V>,然后通过移动命令选择列 (win32 <C-Q>)
然后执行 c,d,y,r 等命令

----------------------------------------
用另外一个此类的块,覆盖可视块中的文本
ctrl-v move "ay : 选中第一块
ctrl-v move c ctrl-o "aP <esc> : 选中第二块

----------------------------------------
_vimrc 基本设置
:set incsearch : 输入搜索命令时,立即显示目前输入的模式对应的匹配。匹配的字符串被高亮。
:set wildignore=*.o,*.obj,*.bak,*.exe : tab补全时忽略这些忽略这些
:set shiftwidth=3 : 设置自动缩进为3个字符
:set vb t_vb=". : 安静模式,关闭响铃跟闪烁
:set browsedir=buffer : 设置文件浏览使用的目录

# 注:
:last : 使用文件浏览器最近访问相同的目录。
:buffer : 使用相关缓冲区的目录。
:current : 使用当前目录。
:{path} : 使用指定目录。

----------------------------------------
启动windows中的IE
:nmap ,f :update<CR>:silent !start c:\progra~1\intern~1\iexplore.exe file://%:p<CR>
:nmap ,i :update<CR>: !start c:\progra~1\intern~1\iexplore.exe <cWORD><CR>

----------------------------------------
在vim里打开ftp
cmap ,r :Nread ftp://209.51.134.122/public_html/index.html
cmap ,w :Nwrite ftp://209.51.134.122/public_html/index.html
gvim ftp://www.somedomain.com/index.html : 使用 netrw.vim

----------------------------------------
向寄存器中添加内容 (使用相应寄存器名称的大写)
复制5行放入a寄存器,然后向下跳转10行再添加5行到a寄存器
"a5yy
10j
"A5yy

----------------------------------------
[I : 显示当前行中字符的所有匹配(超级有用)

----------------------------------------
常规缩进
:'a,'b>> : 将mark a到mark b之间的内容进行两次缩进

虚拟模式下缩进 (可重复)
:vnoremap < <gv

# 这是一个虚拟模式下的键盘映射 < 映射为<gv
# < 意为向内缩进,gv 上面已有解释,为重复上次选区
# <gv 也就是先向内缩进然后再选择刚才的选区
# 这样就可以只按 < 实现重复缩进了

:vnoremap > >gv : 向内缩进,原理同上

块缩进
>i{
>a{

或者
>% and <%

# 自己试试看吧,涉及到用 { 的语言很有用,比如c,c++等

----------------------------------------
重定向 & 粘贴到寄存器 * (*为寄存器名称)
:redir @* : 重定向命令到paste缓冲区
:redir END : 结束
:redir >> out.txt : 重定向到文件

操作粘贴缓冲区
"*yy : 复制到寄存器
"*p : 从寄存器中粘贴一行

复制到粘贴缓冲区 (扩展模式)
:'a,'by* : 复制一个范围到粘贴寄存器
:%y* : 复制一个括号匹配到粘贴缓冲区
:.y* : 复制当前行到粘贴缓冲区

从剪贴板上过滤非可打印字符
# 当从一些 GUI 程序粘贴时会有用处
:nmap <leader>p :let @* = substitute(@*,'[^[:print:]]','','g')<cr>"*p

----------------------------------------
重新格式化文本
gq} : 合并一个段落
gqap : 当前段落
ggVGgq : 全部段落
Vgq : 当前行

在70列的时候换行
:s/.\{,69\};\s*\|.\{,69\}\s\+/&\r/g

----------------------------------------
命令使用于多个文件
:argdo %s/foo/bar/e : 在所有文件上操做 :args
:bufdo %s/foo/bar/e
:windo %s/foo/bar/e
:argdo exe '%!sort'|w! : 包含外部命令

----------------------------------------
命令行技巧
gvim -h : 显示帮助
ls | gvim - : 管道操作
cat xx | gvim - -c "v/^\d\d\|^[3-9]/d " : 从管道出过滤内容
gvim -o file1 file2 : 分割窗口显示两个文件

打开文件后执行一条命令
gvim.exe -c "/main" joe.c : 打开 joe.c & 跳转到 "main"

在打开一个文件时执行多条命令
vim -c "%s/ABC/DEF/ge | update" file1.c

在一组文件上执行多条命令
vim -c "argdo %s/ABC/DEF/ge | update" *.c

从一系列文件中删除一块区域
vim -c "argdo /begin/+1,/end/-1g/^/d | update" *.c

自动编辑文件 (编辑命令序列Ex commands已经包含在convert.vim中了)
vim -s "convert.vim" file.c
# 不加载.vimrc跟任何plugin(干净清新的 VIM^_^)
gvim -u NONE -U NONE -N

访问粘贴缓冲区中的内容 (放置到脚本/批处理文件中)
gvim -c 'normal ggdG"*p' c:/aaa/xp

将粘贴的内容送往默认的打印机
gvim -c 's/^/\=@*/|hardcopy!|q!'

gvim 里的 grep (win32 or *nix)
:grep somestring *.php : 创建匹配的文件列表

使用 :cn(向后) :cp(向前) 操纵列表
:h grep : 查看帮助

----------------------------------------
gvim 的差异比较
gvim -d file1 file2 : vimdiff (比较不差异)
dp : 把光标处的不同放到另一个文件
do : 在光标处从另一个文件取得不同

----------------------------------------
Vim 陷阱
在正则表达式中 + | ( { 都要加上转义符(反斜杠)
/fred\+/ : 匹配 fred/freddy 但不匹配 free
/\(fred\)\{2,3}/ : 注意你必须加上反斜杠

----------------------------------------
\v ,或叫做very magic (通常都是这么叫)可以取消转义符
/codes\(\n\|\s\)*where : 普通的正则表达式
/\vcodes(\n|\s)*where : very magic

----------------------------------------
把对象送到命令行或者搜索行
<C-R><C-W> : 执行当前光标下的单个单词
<C-R><C-A> : 执行当前光标下尽可能多的单词
<C-R>- : 送至一个小型寄存器(同样使用于插入模式)
<C-R>[0-9a-z] : 送至一个命名寄存器 (括弧同上)
<C-R>% : 送至文件名(#也行) (同上)
<C-R>=somevar : 送至一个变量 (例如 :let sray="ray[0-9]")

----------------------------------------
控制寄存器
:let @a=@_ : 清除寄存器 a
:let @a="" : 同上
:let @*=@a : 拷贝寄存器 a 到 paste buffer
:let @*=@: : 拷贝最后执行的命令到 paste buffer
:let @*=@/ : 拷贝最后执行的查找命令到paste buffer
:let @*=@% : 拷贝当前文件到 paste buffer

map <f11> "qyy:let @q=@q."zzz"

----------------------------------------
帮助的帮助 (使用 TAB)
:h quickref : VIM 快速参考页
:h tips : Vim'自己的技巧帮助
:h visual<C-D><tab> : 虚拟模式的帮助列表
: 然后使用tab选择它们
:h ctrl<C-D> : 所有关于ctrl键的帮助列表
:helpg uganda : 过滤帮助文件 使用 :cn, :cp 查找下一个及后一个
:h :r : 关于 :ex 的命令帮助
:h CTRL-R : 普通模式相关
:h /\r : \r是什么的意思
:h \\zs : 使用双反斜线查找关于 \zs 的帮助
:h i_CTRL-R : 在插入模式中 <C-R>的解释
:h c_CTRL-R : 在命令模式中 <C-R> 的解释
:h v_CTRL-V : 虚拟模式
:h tutor : VIM 快速指南
<C-[>, <C-T> : 在帮助履历中往后 & 往前移动
gvim -h : VIM 命令行帮助

----------------------------------------
选项设置在那里
:scriptnames : 列出所有已经加载的 plugins, _vimrcs文件
:verbose set history? : 显示 history的值并显示在那里定义的
:function : 列出所有函数
:func SearchCompl : 显示指定函数的细节

----------------------------------------
制作你自己的VIM 帮助
:helptags /vim/vim64/doc : 重新编译所有 *.txt 的帮助文件在这个目录里
:help add-local-help : 如何添加本地帮助

----------------------------------------
用外部程序运行文件 (例如 php)
map <f9> :w<CR>:!c:/php/php.exe %<CR>
map <f2> :w<CR>:!perl -c %<CR>

----------------------------------------
在另一个buffer中,捕捉当前脚本的输出
:new | r!perl # : 新建一个buffer,从另一个buffer中读入结果
:new! x.out | r!perl # : 同上,并指定一个新文件名
:new+read!ls

----------------------------------------
创建一个新的缓冲区,将寄存器q的内容粘贴进去,然后对缓冲区内容排序
:new +put q|%!sort

----------------------------------------
插入DOS换行符
:%s/$/\<C-V><C-M>&/g : <C-V>为ctrl-v
:%s/$/\<C-Q><C-M>&/g : 对于Win32应该换成ctrl-q
:%s/$/\^M&/g : 你看到的^M是一个字符

----------------------------------------
自动删除行尾 Dos回车符和空格
autocmd BufRead * silent! %s/[\r \t]\+$//
autocmd BufEnter *.php :%s/[ \t\r]\+$//e

----------------------------------------
对指定文件或文件类型执行某个动作
autocmd VimEnter c:/intranet/note011.txt normal! ggVGg?
autocmd FileType *.pl exec('set fileformats=unix')

----------------------------------------
把最后一个命令贴到当前位置
i<c-r>:
把最后一个搜索指令贴到当前位置
i<c-r>/

----------------------------------------
更多的完成功能
<C-X><C-F> : 插入当前目录下的一个文件名到当前位置
# 在insert模式下使用,然后用Ctrl-P/Ctrl-N可以翻页

----------------------------------------
替换一个visual区域
选择一个区域,然后输入 :s/Emacs/Vim/ 等等,vim会自动进入:模式
:'<,'>s/Emacs/Vim/g : 前面的' '<.'> 是vim自动添加的
gv : 重新选择前一个可视区域 (高级!)

----------------------------------------
在文件中插入行号
:g/^/exec "s/^/".strpart(line(".")." ", 0, 4)
:%s/^/\=strpart(line(".")." ", 0, 5)
:%s/^/\=line('.'). ' '

----------------------------------------
用VIM的方式来编号行
:set number : 显示行号
:map <F12> :set number!<CR> : 反转显示行号
:%s/^/\=strpart(line('.')." ",0,&ts)

从任意行开始编号(需要perl)
:'a,'b!perl -pne 'BEGIN{$a=223} substr($_,2,0)=$a++'

产生数字列表
# 在一个空文件的某一行中输入数字223
qqmnYP`n^Aq : in recording q repeat with @q

递增已存在数字到文件末
:.,$g/^\d/exe "normal! \<c-a>"

高级递增,参见:
http://vim.sourceforge.net/tip_view.php?tip_id=150

----------------------------------------
高级递增 (真的很有用)
把下面几句放到 _vimrc
let g:I=0
function! INC(increment)
  let g:I =g:I + a:increment
  return g:I
endfunction

例如从mark a 到mark b 递增,从223开始,步长为5
:let I=223
:'a,'bs/^/\=INC(5)/
给 INC 创建一个映射
cab viminc :let I=223 \| 'a,'bs/$/\=INC(5)/

----------------------------------------
生成从 23-64 的数字列表
o23<ESC>qqYp<C-A>q40@q

----------------------------------------
在当前插入模式下编辑/移动 (真得很有用)
<C-U> : 删除全部
<C-W> : 删除最后一个单词
<HOME><END> : 移动到行首/行尾
<C-LEFTARROW><C-RIGHTARROW> : 向前/后移动一个单词
<C-X><C-E>,<C-X><C-Y> : 滚动,只要在insert中保持put

----------------------------------------
# 加密(小心使用,不要忘了密码)
:X : vim会提示你输入密码
:h :X

----------------------------------------
模式行 (使文件只读等),必须在前/后 5行内
// vim:noai:ts=2:sw=4:readonly: :
// vim:ft=html: : 使用 HTML 语法高亮
:h modeline

----------------------------------------
建立你自己的菜单项
amenu Modeline.Insert\ a\ VIM\ modeline <Esc><Esc>ggOvim:ff=unix ts=4 ss=4<CR>vim60:fdm=marker<esc>gg

----------------------------------------
一个保存当前光标下的狭义字到一个文件的函数
function! SaveWord()
  normal yiw
  exe ':!echo '.@0.' >> word.txt'
endfunction

map ,p :call SaveWord()

----------------------------------------
删除重复行的函数
function! Del()
  if getline(".") == getline(line(".") - 1)
    norm dd
  endif
endfunction

:g/^/ call Del() : 使用该函数的一个例子

----------------------------------------
双字节编码 (non alpha-numerics)
:digraphs : 显示编码表
:h dig : 帮助
i<C-K>e' : 输入 é
i<C-V>233 : 输入 é (Unix)
i<C-Q>233 : 输入 é (Win32)
ga : 查看字符的hex值

# 删除非 ascii 字符
:%s/[<C-V>128-<C-V>255]//gi : where you have to type the Control-V
:%s/[€-ÿ]//gi : Should see a black square & a dotted y
:%s/[<C-V>128-<C-V>255<C-V>01-<C-V>31]//gi : All pesky non-asciis
:exec "norm /[\x00-\x1f\x80-\xff]/" : same thing

# 将非ascii字符,拉到搜索条上
yl/<C-R>"
/[^a-zA-Z0-9_[:space:][:punct:]] : search for all non-ascii

----------------------------------------
文件名自动完成 (例如 main_c.c)
:e main_<tab> : tab 键完成
gf : 打开光标处广义字命名的文件 (normal模式)
main_<C-X><C-F> : 文件名自动完成(insert模式)

----------------------------------------
Vim复杂使用
交换两个单词
:%s/\<\(on\|off\)\>/\=strpart("offon", 3 * ("off" == submatch(0)), 3)/g

交换两个单词
:vnoremap <C-X> <Esc>`.``gvP``P

----------------------------------------
把text文件转换成html文件(oh,ft)
:runtime! syntax/2html.vim : 转换 txt 成 html
:h 2html

----------------------------------------
VIM 有一个内部自带的 grep 命令
:grep some_keyword *.c : 得到一个包含some_keyword的c文件名列表
:cn : 去下一个出现的位置

----------------------------------------
强制无扩展名的文件的语法着色方式
:set syntax=perl

取消语法着色 (很有用)
:set syntax off

改变色彩主题 (在~vim/vim??/colors中的任何文件)
:colorscheme blue

通过使用模式行强迫使用 HTML 语法高亮
# vim:ft=html:

强制自动语法加亮(非标准的文件扩展)
au BufRead,BufNewFile */Content.IE?/* setfiletype html

----------------------------------------
:set noma (non modifiable) : 防止修改
:set ro (Read Only) : 只读保护

----------------------------------------
会话 (打开一堆文件)
gvim file1.c file2.c lib/lib.h lib/lib2.h : 在"对话"中加载这些文件
:mksession : 生成一个Session文件 (默认是Session.vim)
:q
gvim -S Session.vim : 重新加载所有文件

----------------------------------------
#标记(tags) (跳转到子程序/函数)
taglist.vim : 很流行的插件
:Tlist : 显示标记 (函数列表)
<C-]> : 跳转到光标处的函数

----------------------------------------
将csv文件分栏,以便仅显示宽行的字符
:let width = 20
:let fill=' ' | while strlen(fill) < width | let fill=fill.fill | endwhile
:%s/\([^;]*\);\=/\=strpart(submatch(1).fill, 0, width)/ge
:%s/\s\+$//ge

高亮显示特定的csv列 (放入.vimrc文件)
function! CSVH(x)
  execute 'match Keyword /^\([^,]*,\)\{'.a:x.'}\zs[^,]*/'
  execute 'normal ^'.a:x.'f,'
endfunction

command! -nargs=1 Csv :call CSVH(<args>)

call with
:Csv 5 : 高亮显示第5列

----------------------------------------
折叠:隐藏某些片断,使查看更容易
zf} : 使用动作命令折叠一个段落
v}zf : 使用可视模式折叠一个段落
zf'a : 折叠到一个标记上
zo : 打开折叠
zc : 重新关闭折叠

----------------------------------------
显示"不可见字符"
:set list
:h listchars

----------------------------------------
如何在不进入插入模式的情况下粘贴"普通模式的命令"
:norm qqy$jq

----------------------------------------
处理文件名
:h filename-modifiers : 帮助
:w % : 写入当前文件
:w %:r.cfm : 改变文件扩展名为 .cfm
:!echo %:p : 显示完整路径和文件名
:!echo %:p:h : 只显示完整路径
:!echo %:t : 只显示文件名
:reg % : 显示文件名
<C-R>% : 插入文件名 (插入模式)

"%p : 插入文件名 (普通模式)
/<C-R>% : 在文本中查找文件名

----------------------------------------
删除,但不破坏 buffer 内容,"_为黑洞寄存器,相当于linux上的/dev/null
"_d : 你一直想要的东西
"_dw : 例如:删除一个单词

----------------------------------------
送完整的路径名到剪贴板,用于邮件附件等
:nnoremap <F2> :let @*=expand("%:p")<cr> : unix
:nnoremap <F2> :let @*=substitute(expand("%:p"), "/", "\\", "g")<cr> : win32

----------------------------------------
通过 Vim 修改文件名的简单 shell 脚本
$ vim
:r! ls *.c
:%s/\(.*\).c/mv & \1.bla
:w !sh
:q!

----------------------------------------
在一个文本里计算单词数
g<C-G>

----------------------------------------
你自己设置高亮显示的例子
:syn match DoubleSpace " "
:hi def DoubleSpace guibg=#e0e0e0

----------------------------------------
重新逐字产生前面一行
:imap ] @@@<ESC>hhkyWjl?@@@<CR>P/@@@<CR>3s : 此种复杂的映射,解释,会害人的:)首先,输入@@@,然后ESC回到普通模式,hh是往左移动两个字符,就是到了第一个@上,然后k是到上一行。y表示yank,拷贝,W是指拷贝到大单词的结束。j是往下一行,就是回到原来一行,l表示往右移动一个字符,以便下面的?查找。?是向上查找,找的内容是@@@。<CR>回车执行后,P是指将寄存器中的内容(即上一行的完全内容)拷贝到@@@之前,然后再用/查找@@@。3s表示删除3个字符(就是@@@),并切换到插入模式。
:nmap ] i@@@<ESC>hhkyWjl?@@@<CR>P/@@@<CR>3s

根据文件类型映射快捷键
:autocmd bufenter *.tex map <F1> :!latex %<CR>
:autocmd bufenter *.tex map <F2> :!xdvi -hush %<.dvi&<CR>

----------------------------------------
读取 MS-Word 文档,需要有antiword(一个免费的word文档阅读器)
:autocmd BufReadPre *.doc set ro
:autocmd BufReadPre *.doc set hlsearch!
:autocmd BufReadPost *.doc %!antiword "%"

----------------------------------------
折行的方法
第一行是设置选项,让系统认为<<<和>>>是折行标记,后面三行放到正文中,就看到折叠效果了
:se filetype=help foldmethod=marker foldmarker=<<<,>>>
A really big section closed with a tag <<<
--- remember folds can be nested ---
Closing tag >>>

----------------------------------------
另一个Vim黑客的JAVH
vim -c ":%s%s*%Cyrnfr)fcbafbe[Oenz(Zbbyranne%|:%s)[[()])-)Ig|norm Vg?"
# 启动vim的时候执行了一个命令
# 先写入了Please-sponsor-Bram-Moolenaar的rot13编码,然后再解码

※注: 本文来自网络,本人只是加以整理和重新排版。
(原文地址: http://rayninfo.co.uk/vimtips.html)

Unix 下文本操作的利器

, ,

■ cut

cut 命令可用来截取文本中特定的字段。

(例)
$ cut -c1 file1.txt
截取文件 file1.txt 各行的第1个字符并输出

$ cut -c1-10 file1.txt
截取文件 file1.txt 各行的第1到第10个字符并输出

$ cut -c20- file1.txt
截取文件 file1.txt 各行第20个字符至末尾的字符串并输出

$ cut -d: -f1 file1.txt
截取文件 file1.txt 各行以冒号( : )分割的第1个字符串

$ cut -d' ' -f1,2 file1.txt
截取文件 file1.txt 各行以空格( )分割的第1和第2个字符串

■ paste

paste 命令可用来拼接两个文本文件中的数据。

(例)
文件 file1.txt 的内容:
1
2
3

文件 file2.txt 的内容:
One
Two
Three

$ paste file1.txt file2.txt
显示结果:
1 One
2 Two
3 Three

$ paste -d, file1.txt file2.txt
显示结果:
1,One
2,Two
3,Three

paste -s 可以把一个文件的各行拼接成一整行。

$ paste -s file1.txt
显示结果:
1 2 3

■ sed

sed 是一个数据流编辑器。

(例)
$ sed 's/Unix/UNIX/' file1.txt
把文件 file1.txt 中的字符串 Unix 替换成 UNIX 并输出

$ sed -n '1,2p' file1.txt
  输出文件 file1.txt 的头两行

$ sed -n '/UNIX/p' file1.txt
  输出文件 file1.txt 中包含 UNIX 的行

$ sed '1,2d' file1.txt
  删除文件 file1.txt 的头两行并输出

$ sed '/UNIX/d' file1.txt
  删除文件 file1.txt 中包含 UNIX 的行并输出

■ tr

tr 命令用作字符串变换的过滤器。

(例)
$ tr e x < file1.txt
  将文件 file1.txt 内的字符'e'替换成字符'x'并输出

$ tr '[a-z]' '[A-Z]' < file1.txt
  将文件 file1.txt 内的小写字母替换大写字母并输出

$ tr ' ' '\11' < file1.txt
  将文件 file1.txt 内的空格替换为Tab(缩进)并输出

$ tr -s ' ' '\11' < file1.txt
  将文件 file1.txt 内连续的空格替换为一个Tab(缩进)并输出

$ tr -d ' ' < file1.txt
  删除文件 file1.txt 内所有空格并输出

■ grep

grep命令用于在一个或多个文件中查找符合特定模式的行。

(例)
$ grep '[A-Z]' file1.txt
  在文件 file1.txt 中查找包含英文大写字母的行并输出

$ grep '[A-Z]...[0-9]' file1.txt
  在文件 file1.txt 中查找包含英文大写字母开头并以数字结尾的行并输出

$ grep -v 'UNIX' file1.txt
  在文件 file1.txt 中查找不包含 UNIX 的行并输出

$ grep -l 'Unix' *.txt
  在 *.txt 中查找包含 Unix 的文件并输出文件名

$ grep -n 'Unix' file1.txt
  在文件 file1.txt 中查找不包含 UNIX 的行并带行号输出

■ sort

sort 命令用来对输入行进行排序并输出。

(例)
$ sort < file1.txt
以升序输出 file1.txt 的各行

$ sort -u < file1.txt
以升序输出 file1.txt 的各行,重复的行只输出一次

$ sort -r < file1.txt
以降序输出 file1.txt 的各行

$ sort file1.txt -o file2.txt
将 file1.txt 的各行排序并输出到文件 file2.txt

$ sort -n file1.txt
将 file1.txt 的各行以数值排序并输出

$ sort +1n file.txt
将 file1.txt 的各行根据第2字段(空格分割)以数值排序并输出
  第2フィールドを使って数値的に並び替える。

$ sort +2n -t: file1.txt
将 file1.txt 的各行根据第3字段(冒号分割)以数值排序并输出

■ uniq

uniq 命令用于查找文件中的重复行(输出不重复的行)。

(命令格式) uniq in_file out_file

(例)
$ uniq file1.txt
输出 file1.txt 中不重复的行

$ uniq -d file1.txt
输出 file1.txt 中有重复的行

$ uniq -c file1.txt
统计 file1.txt 中各行的重复次数并输出

※注: 本文翻译整理自《UNIXツール

Vim7 的内置 grep 功能介绍

, ,

Vim7 在其内部集成了 grep 功能。

若要在 Vim7 内部实现类似 Linux/Unix 之 grep 命令的功能,只需使用 :vimgrep 命令。

1. 在当前目录下的所有php文件中查找包含某个字符串(如'mb_convert')的行
:vimgrep /mb_convert/ *.php

2. 用 j 标志查找并打开最初匹配的文件
:vimgrep /mb_convert/j *.php

3. 递归查找 (包括子目录)
:vimgrep /mb_convert/j **/*.php

查找结果会在 Quickfix 列表中显示。
:copen 命令打开 Quickfix 列表窗口。也可以加管道命令 | cwin 直接打开窗口。即:
:vimgrep /mb_convert/j **/*.php | cwin

:ccl 命令关闭 Quickfix 列表窗口。更多用法请看 :he quickfix-window

可用 :grep 代替 :vimgrep 命令。设置方法如下:
:set grepprg=internal

Solaris每进程打开最大文件数的修改方法

,

在Solaris系统下执行以下命令:

# ulimit -a
core file size (blocks) unlimited
data seg size (kbytes) unlimited
file size (blocks) unlimited
open files 256
pipe size (512 bytes) 10
stack size (kbytes) 8192
cpu time (seconds) unlimited
max user processes 15877
virtual memory (kbytes) unlimited

可以看到,每进程打开最大文件数是256,有时候需要修改这个数字。

修改方法

编辑 /etc/system 文件,在其末尾追加一行

set rlim_fd_max=1024

具体数字更具需要而定,修改后需要重启系统。

crontab的时间格式

,

举例如下:
分 時 日 月 星期
43 21 * * *               21:43 执行
15 05 * * *             05:15 执行
0 17 * * *                17:00 执行
0 17 * * 1                每周一的 17:00 执行
0,10 17 * * 0,2,3         每周日,周二,周三的 17:00和 17:10 执行
0-10 17 1 * *             毎月1日从 17:00到7:10 毎隔1分钟 执行
0 0 1,15 * 1              毎月1日和 15日和 一日的 0:00 执行
42 4 1 * *              毎月1日的 4:42分 执行
0 21 * * 1-6            周一到周六 21:00 执行
0,10,20,30,40,50 * * * * 每隔10分 执行
*/10 * * * *        每隔10分 执行
* 1 * * *         从1:0到1:59 每隔1分钟 执行
0 1 * * *         1:00 执行
0 */1 * * *        毎时0分 每隔1小时 执行
0 * * * *         毎时0分 每隔1小时 执行
2 8-20/3 * * *      8:02,11:02,14:02,17:02,20:02 执行
30 5 1,15 * *       1日 和 15日的 5:30 执行

存在时间超过n分钟文件的删除命令

, ,

(例)删除某目录下存在时间超过10分钟文件:

find /filepath -type f -amin +10 -exec rm {} \;

用正则表达式识别中英文

, , ,

包含正则表达式的命令如下:

iconv -f gbk -t utf-8 query_list |egrep -e "^[a-z0-9]*$"

以上这个命令的详细解释,请看车东的Blog

Solaris下tar和gzip的组合用法

, ,

Solaris的命令有时候没有Linux那么方便,比如tar命令,因为没有-z的选项,压缩归档不是那么方便,和gzip组合使用才能达到-z选项的效果。

在此总结一下tar和gzip的组合用法。

归档并压缩的命令

$ tar cvf - test | gzip -c > test.tar.gz

解压缩并展开归档的命令

$ gzip -d -c test.tar.gz | tar xvf -
$ gunzip -c test.tar.gz | tar xvf -
$ zcat test.tar.gz | tar xovf -

Solaris 简明安装手册

,

本文翻译自: http://www.unix-power.jp/solaris/install.html

■开发环境的整备

Solaris的开发环境默认是不被安装的,OS安装后需要自己安装。从Freeware for Solaris能得到二进制包,因此可以从这里下载一套开发环境。

以下是我的软件安装列表。

autoconf-2.53-sol8-sparc-local.gz
automake-1.6-sol8-sparc-local.gz
bash-2.05-sol8-sparc-local.gz
bc-1.06-sol8-sparc-local.gz
binutils-2.11.2-sol8-sparc-local.gz
bison-1.34-sol8-sparc-local.gz
bzip2-1.0.1-sol8-sparc-local.gz
cpio-2.4.2-sol8-sparc-local.gz
fileutils-4.1-sol8-sparc-local.gz
findutils-4.1-sol8-sparc-local.gz
flex-2.5.4a-sol8-sparc-local.gz
gawk-3.1.0-sol8-sparc-local.gz
gcc-2.95.3-sol8-sparc-local.gz
gdb-5.0-sol8-sparc-local.gz
gzip-1.3.3
gdbm-1.8.0-sol8-sparc-local.gz
gettext-0.10.37-sol8-sparc-local.gz
libgcj-2.95.1-sol8-sparc-local.gz
libpcap-0.6.2-sol8-sparc-local.gz
libtool-1.4-sol8-sparc-local.gz
m4-1.4-sol8-sparc-local.gz
make-3.79.1-sol8-sparc-local.gz
md5-6142000-sol8-sparc-local.gz
ntp-4.1.1a-sol8-sparc-local.gz
proftpd-1.2.1-sol8-sparc-local.gz
readline-4.2-sol8-sparc-local.gz
sed-3.02-sol8-sparc-local.gz
tar-1.13.19-sol8-sparc-local.gz
texinfo-4.0-sol8-sparc-local.gz
zlib-1.1.4-sol8-sparc-local.gz


安装软件用以下命令:

$ gunzip ******.gz
$ pkgadd -d ./******


■log的输出

Solaris默认输出的log较少,不容易掌握系统的状态,因此推荐有意识地增加log的输出。具体做法是在/etc/syslog.conf追加以下内容:
mail.debug               /var/log/maillog
auth.debug               /var/log/authlog
news.debug               /var/log/newslog
daemon.debug       /var/log/daemonlog
cron.debug               /var/log/cronlog

以上设置,须注意空白部分必须是tab。

另外,增加了log的输出之后,一方面log会一直堆积,因此需要定期滚动清理。Solaris默认用/usr/lib/newsyslog的Shell脚本来定期清理日志,但我比较喜欢用自己的Perl脚本,通过cron定期实现日志滚动。

/var/adm 之下的日志滚动脚本
#!/usr/bin/perl

$log='/var/adm';
@log_file=('lastlog','messages','sulog','utmpx','wtmpx','vold.log');
$count1=0;
$count2=5;

for $i (@log_file){
        if(-f "$log/$i$count2.gz"){
                system("rm -rf $log/$i$count2.gz");
        }
        for($j=4;$j>=0;$j--){
                if(-f "$log/$i$j.gz"){
                        $target=$j+1;
                        system("mv $log/$i$j.gz $log/$i$target.gz");
                }
        }

        if(-f "$log/$i.gz"){
                system("mv $log/$i.gz $log/$i$count1.gz");
        }

        system("/usr/local/bin/gzip $log/$i");
        system("mv $log/$i.gz $log/$i$count1.gz");
        system("cp /dev/null $log/$i");
        system("chmod 644 $log/$i");
}

system("/etc/init.d/syslog stop;/etc/init.d/syslog start");


/var/log 之下的日志滚动脚本
#!/usr/bin/perl

$log='/var/log';
@log_file=('authlog','cronlog','daemonlog','sshd.log','syslog','tcpd.log');
$count1=0;
$count2=7;

for $i (@log_file){
        if(-f "$log/$i$count2.gz"){
                system("rm -rf $log/$i$count2.gz");
        }
        for($j=7;$j>=0;$j--){
                if(-f "$log/$i$j.gz"){
                        $target=$j+1;
                        system("mv $log/$i$j.gz $log/$i$target.gz");
                }
        }
        if(-f "$log/$i.gz"){
                system("mv $log/$i.gz $log/$i$count1.gz");
        }
        system("/usr/local/bin/gzip $log/$i");
        system("mv $log/$i.gz $log/$i$count1.gz");
        system("cp /dev/null $log/$i");
        system("chmod 644 $log/$i");
}

system("/etc/init.d/syslog stop;/etc/init.d/syslog start");


以上脚本用适当的名字保存到适当的路径下,然后赋予执行权限,之后写入/var/spool/cron/crontabs/root让其定期执行。

■网络的设置

具体的网络设置文件如下所示:

/etc/netmasks
/etc/resolv.conf
/etc/defaultrouter
/etc/nodename
/etc/hosts
/etc/hostname.xxx


/etc/netmasks
192.168.0.0 255.255.255.0

以上是IP地址和子网掩码。默认应该就是这样的设置。

/etc/resolv.conf
domain yourdomain.com
nameserver 210.xxx.xxx.xxx
nameserver 203.xxx.xxx.xxx

如上所述设置所属域和域名服务器(DNS)的IP地址。第二域名服务器没有的情况下不需要特别记述。可能有些不便的是,因该文件默认不存在,需要生成。

/etc/defaultrouter
192.168.0.1

如上所述,设置您所使用的路由(网关)的IP地址。拨号上网的人经常在这儿碰壁。没有这个设定,也能访问局域网(LAN),不过,基本上不能访问外部网络。因该文件默认不存在,需生成。

/etc/hosts
192.168.0.3 host2
192.168.0.4 host3


以上文件记述本地网络中的机器,自己的主机名默认设置成loghost,这个不需要特别介意。因为这是作为别名来使用,设置syslog的时候被使用。如果不需要,把loghost删除了也没事。

/etc/hostname.xxx
hostname

xxx随着设备和构架而改变。如Sparc构架下一般是hme0,Intel构架下的3com则是elxl0等。该文件用来设置主机名。默认有设置。

恢复iptables的默认设置

, ,

来自: http://www.Unlinux.com

#
# reset the default policies in the filter table.
#
/usr/local/sbin/iptables -P INPUT ACCEPT
/usr/local/sbin/iptables -P FORWARD ACCEPT
/usr/local/sbin/iptables -P OUTPUT ACCEPT


#
# reset the default policies in the nat table.
#
/usr/local/sbin/iptables -t nat -P PREROUTING ACCEPT
/usr/local/sbin/iptables -t nat -P POSTROUTING ACCEPT
/usr/local/sbin/iptables -t nat -P OUTPUT ACCEPT


#
# flush all the rules in the filter and nat tables.
#
/usr/local/sbin/iptables -F
/usr/local/sbin/iptables -t nat -F


#
# erase all chains that's not default in filter and nat table.
#
/usr/local/sbin/iptables -X
/usr/local/sbin/iptables -t nat -X'

October 2008
SMTWTFS
September 2008November 2008
1234
567891011
12131415161718
19202122232425
262728293031