mkdir
用法:mkdir [选项]... 目录...
若指定目录不存在则创建目录。
长选项必须使用的参数对于短选项时也是必需使用的。
-m, --mode=模式 设置权限模式(类似chmod),而不是rwxrwxrwx 减umask
-p, --parents 需要时创建目标目录的上层目录,但即使这些目录已存在也不当作错误处理
-v, --verbose 每次创建新目录都显示信息
-Z, --context=CTX 将每个创建的目录的SELinux 安全环境设置为CTX
--help 显示此帮助信息并退出
--version 显示版本信息并退出
[root@localhost ~]# mkdir aaa #创建目录 [root@localhost ~]# mkdir -m a=rw bbb #创建指定属性的目录 [root@localhost ~]# mkdir -p 111/abc #创建目录,父目录存在,建之
[root@localhost ~]# mkdir -p /ms/{sales,hr,web} #创建一个名为/ms的目录,其中有sales、hr、web的子目录
man
Usage: man [OPTION...] [章节] 手册页...
-C, --config-file=文件 使用该用户设置文件
-d, --debug 输出调试信息
-D, --default 将所有选项都重置为默认值
--warnings[=警告] 开启 groff 的警告
主要运行模式:
-f, --whatis 等同于 whatis
-k, --apropos 等同于 apropos
-K, --global-apropos search for text in all pages
-l, --local-file
把“手册页”参数当成本地文件名来解读
-w, --where, --path, --location
输出手册页的物理位置
-W, --where-cat, --location-cat
输出 cat 文件的物理位置
-c, --catman 由 catman 使用,用来对过时的 cat
页重新排版
-R, --recode=编码 output source page encoded in ENCODING
寻找手册页:
-L, --locale=区域
定义本次手册页搜索所采用的区域设置
-m, --systems=系统 use manual pages from other systems
-M, --manpath=路径 设置搜索手册页的路径为“路径”
-S, -s, --sections=列表 使用以半角冒号分隔的章节列表
-e, --extension=扩展
将搜索限制在扩展类型为“扩展”的手册页之内
-i, --ignore-case 查找手册页时不区分大小写字母
(默认)
-I, --match-case 查找手册页时区分大小写字母。
--regex show all pages matching regex
--wildcard show all pages matching wildcard
--names-only make --regex and --wildcard match page names only,
not descriptions
-a, --all 寻找所有匹配的手册页
-u, --update 强制进行缓存一致性的检查
--no-subpages don't try subpages, e.g. 'man foo bar' => 'man
foo-bar'
控制格式化的输出:
-P, --pager=PAGER 使用 PAGER 程序显示输出文本
-r, --prompt=字符串 给 less pager 提供一个提示行
-7, --ascii 显示某些 latin1 字符的 ASCII 翻译形式
-E, --encoding=编码 use selected output encoding
--no-hyphenation, --nh turn off hyphenation
--no-justification, --nj turn off justification
-p, --preprocessor=字符串 字符串表示要运行哪些预处理器:
e - [n]eqn, p - pic, t - tbl,
g - grap, r - refer, v - vgrind
-t, --troff 使用 groff 对手册页排版
-T, --troff-device[=设备] 使用 groff 的指定设备
-H, --html[=浏览器] 使用 www-browser 或指定浏览器显示 HTML
输出
-X, --gxditview[=分辨率] 使用 groff 并通过 gxditview (X11)
来显示:
-X = -TX75, -X100 = -TX100, -X100-12 = -TX100-12
-Z, --ditroff 使用 groff 并强制它生成 ditroff
-?, --help give this help list
--usage give a short usage message
-V, --version print program version
[root@linux ~]# man ifconfig #查看ifconfig手册
touch
用法:touch [选项]... 文件...
将每个文件的访问时间和修改时间改为当前时间。
不存在的文件将会被创建为空文件,除非使用-c 或-h 选项。
如果文件名为"-"则特殊处理,更改与标准输出相关的文件的访问时间。
长选项必须使用的参数对于短选项时也是必需使用的。
-a 只更改访问时间
-c, --no-create 不创建任何文件
-d, --date=字符串 使用指定字符串表示时间替代当前时间
-f (忽略)
-h, --no-dereference 会影响符号链接本身,替代符号链接所指示的目的地
(当系统支持更改符号链接的所有者时,此选项才有用)
-m 只更改修改时间
-r, --reference=文件 使用指定文件的时间属性替代当前时间
-t STAMP 使用[[CC]YY]MMDDhhmm[.ss] 格式的时间替代当前时间
--time=WORD 使用WORD 指定的时间:access、atime、use 都等于-a
选项的效果,而modify、mtime 等于-m 选项的效果
--help 显示此帮助信息并退出
--version 显示版本信息并退出
请注意,-d 和-t 选项可接受不同的时间/日期格式。
[root@linux ~]# touch test.php #将test.php的档案时间改为,当前时间,文件不存在建之 [root@linux ~]# touch -c -t 05061803 test.php #将档案时间改为,5月6日18点3分 [root@linux ~]# touch -r abc.php test.php #将test.php档案改成根abc.php一样
ls
用法:ls [选项]... [文件]...
List information about the FILEs (the current directory by default).
Sort entries alphabetically if none of -cftuvSUX nor --sort is specified.
长选项必须使用的参数对于短选项时也是必需使用的。
-a, --all 不隐藏任何以. 开始的项目
-A, --almost-all 列出除. 及.. 以外的任何项目
--author 与-l 同时使用时列出每个文件的作者
-b, --escape 以八进制溢出序列表示不可打印的字符
--block-size=SIZE scale sizes by SIZE before printing them. E.g.,
`--block-size=M' prints sizes in units of
1,048,576 bytes. See SIZE format below.
-B, --ignore-backups do not list implied entries ending with ~
-c with -lt: sort by, and show, ctime (time of last
modification of file status information)
with -l: show ctime and sort by name
otherwise: sort by ctime, newest first
-C 每栏由上至下列出项目
--color[=WHEN] 控制是否使用色彩分辨文件。WHEN 可以是
"never"(默认)、"always"或"auto"其中之一
-d, --directory 当遇到目录时列出目录本身而非目录内的文件
-D, --dired 产生适合Emacs 的dired 模式使用的结果
-f 不进行排序,-aU 选项生效,-lst 选项失效
-F, --classify 加上文件类型的指示符号(*/=@| 其中一个)
--format=关键字 交错-x,逗号分隔-m,水平-x,长-l,
单栏-1,详细-l,垂直-C
--full-time 即-l --time-style=full-iso
-g 类似-l,但不列出所有者
--group-directories-first
在文件前分组目录。此选项可与--sort 一起使用,
但是一旦使用--sort=none (-U)将禁用分组
-G, --no-group 以一个长列表的形式,不输出组名
-h, --human-readable 与-l 一起,以易于阅读的格式输出文件大小
(例如 1K 234M 2G)
--si 同上面类似,但是使用1000 为基底而非1024
-H, --dereference-command-line
跟随命令行列出的符号链接
--dereference-command-line-symlink-to-dir
跟随命令行列出的目录的符号链接
--hide=PATTERN 隐藏符合PATTERN 模式的项目
(-a 或 -A 将覆盖此选项)
--indicator-style=方式 指定在每个项目名称后加上指示符号方式:
none (默认),classify (-F),file-type (-p)
-i, --inode 显示每个文件的inode 号
-I, --ignore=PATTERN 不显示任何符合指定shell PATTERN 的项目
-k 即--block-size=1K
-l 使用较长格式列出信息
-L, --dereference 当显示符号链接的文件信息时,显示符号链接所指示
的对象而并非符号链接本身的信息
-m 所有项目以逗号分隔,并填满整行行宽
-n, --numeric-uid-gid 类似 -l,但列出UID 及GID 号
-N, --literal 输出未经处理的项目名称 (如不特别处理控制字符)
-o 类似 -l,但不列出有关组的信息
-p, --indicator-style=slash 对目录加上表示符号"/"
-q, --hide-control-chars 以"?"字符代替无法打印的字符
--show-control-chars 直接显示无法打印的字符 (这是默认方式,除非调用
的程序名称是"ls"而且是在终端输出结果)
-Q, --quote-name 将条目名称括上双引号
--quoting-style=方式 使用指定的quoting 方式显示条目的名称:
literal、locale、shell、shell-always、c、escape
-r, --reverse 逆序排列
-R, --recursive 递归显示子目录
-s, --size 以块数形式显示每个文件分配的尺寸
-S 根据文件大小排序
--sort=WORD 以下是可选用的WORD 和它们代表的相应选项:
extension -X status -c
none -U time -t
size -S atime -u
time -t access -u
version -v use -u
--time=WORD 和-l 同时使用时显示WORD 所代表的时间而非修改时
间:atime、access、use、ctime 或status;加上
--sort=time 选项时会以指定时间作为排序关键字
--time-style=STYLE 和-l 同时使用时根据STYLE 代表的格式显示时间:
full-iso、iso、locale、posix-iso、+FORMAT。
FORMAT 即是"date"所用的时间格式;如果FORMAT
是FORMAT1<换行>FORMAT2,FORMAT1 适用于较旧
的文件而FORMAT2 适用于较新的文件;如果STYLE
以"posix-"开头,则STYLE 仅在POSIX 语系之外
生效。
-t 根据修改时间排序
-T, --tabsize=宽度 指定制表符(Tab)的宽度,而非8 个字符
-t sort by modification time, newest first
-T, --tabsize=COLS assume tab stops at each COLS instead of 8
-u 同-lt 一起使用:按照访问时间排序并显示
同-l一起使用:显示访问时间并按文件名排序
其他:按照访问时间排序
-U 不进行排序;按照目录顺序列出项目
-v 在文本中进行数字(版本)的自然排序
-w, --width=COLS 自行指定萤幕宽度而不使用目前的数值
-x 逐行列出项目而不是逐栏列出
-X 根据扩展名排序
-1 每行只列出一个文件
--help 显示此帮助信息并退出
--version 显示版本信息并退出
SIZE 可以是一个可选的整数,后面跟着以下单位中的一个:
KB 1000,K 1024,MB 1000*1000,M 1024*1024,还有 G、T、P、E、Z、Y。
使用色彩来区分文件类型的功能已被禁用,默认设置和 --color=never 同时禁用了它。
使用 --color=auto 选项,ls 只在标准输出被连至终端时才生成颜色代码。
LS_COLORS 环境变量可改变此设置,可使用 dircolors 命令来设置。
退出状态:
0 正常
1 一般问题 (例如:无法访问子文件夹)
2 严重问题 (例如:无法使用命令行参数)
[root@rudder ~]# ls bak tank [root@rudder ~]# ls -l 总用量 8 drwxr-xr-x 2 root root 4096 4月 27 12:34 bak drwxr-xr-x 4 tnak tnak 4096 4月 28 14:25 tank
-bash-3.2$ ls /bin #查看bin目录下的文件 arch dnsdomainname kbd_mode pgawk tar awk doexec keyctl ping taskset basename domainname kill ping6 touch bash dumpkeys link ps tracepath cat echo ln pwd tracepath6
cp
用法:cp [选项]... [-T] 源文件 目标文件
或:cp [选项]... 源文件... 目录
或:cp [选项]... -t 目录 源文件...
将源文件复制至目标文件,或将多个源文件复制至目标目录。
长选项必须使用的参数对于短选项时也是必需使用的。
-a, --archive 等于-dR --preserve=all
--backup[=CONTROL 为每个已存在的目标文件创建备份
-b 类似--backup 但不接受参数
--copy-contents 在递归处理是复制特殊文件内容
-d 等于--no-dereference --preserve=links
-f, --force 如果目标文件无法打开则将其移除并重试(当 -n 选项
存在时则不需再选此项)
-i, --interactive 覆盖前询问(使前面的 -n 选项失效)
-H 跟随源文件中的命令行符号链接
-l, --link 链接文件而不复制
-L, --dereference 总是跟随符号链接
-n, --no-clobber 不要覆盖已存在的文件(使前面的 -i 选项失效)
-P, --no-dereference 不跟随源文件中的符号链接
-p 等于--preserve=模式,所有权,时间戳
--preserve[=属性列表 保持指定的属性(默认:模式,所有权,时间戳),如果
可能保持附加属性:环境、链接、xattr 等
-c same as --preserve=context
--sno-preserve=属性列表 不保留指定的文件属性
--parents 复制前在目标目录创建来源文件路径中的所有目录
-R, -r, --recursive 递归复制目录及其子目录内的所有内容
--reflink[=WHEN] 控制克隆/CoW 副本。请查看下面的内如。
--remove-destination 尝试打开目标文件前先删除已存在的目的地
文件 (相对于 --force 选项)
--sparse=WHEN 控制创建稀疏文件的方式
--strip-trailing-slashes 删除参数中所有源文件/目录末端的斜杠
-s, --symbolic-link 只创建符号链接而不复制文件
-S, --suffix=后缀 自行指定备份文件的后缀
-t, --target-directory=目录 将所有参数指定的源文件/目录
复制至目标目录
-T, --no-target-directory 将目标目录视作普通文件
-u, --update copy only when the SOURCE file is newer
than the destination file or when the
destination file is missing
-v, --verbose explain what is being done
-x, --one-file-system stay on this file system
-Z, --context=CONTEXT set security context of copy to CONTEXT
--help 显示此帮助信息并退出
--version 显示版本信息并退出
默认情况下,源文件的稀疏性仅仅通过简单的方法判断,对应的目标文件目标文件也
被为稀疏。这是因为默认情况下使用了--sparse=auto 参数。如果明确使用
--sparse=always 参数则不论源文件是否包含足够长的0 序列也将目标文件创文
建为稀疏件。
使用--sparse=never 参数禁止创建稀疏文件。
当指定了--reflink[=always] 参数时执行轻量化的复制,即只在数据块被修改的
情况下才复制。如果复制失败或者同时指定了--reflink=auto,则返回标准复制模式。
备份文件的后缀为"~",除非以--suffix 选项或是SIMPLE_BACKUP_SUFFIX
环境变量指定。版本控制的方式可通过--backup 选项或VERSION_CONTROL 环境
变量来选择。以下是可用的变量值:
none, off 不进行备份(即使使用了--backup 选项)
numbered, t 备份文件加上数字进行排序
existing, nil 若有数字的备份文件已经存在则使用数字,否则使用普通方式备份
simple, never 永远使用普通方式备份
有一个特别情况:如果同时指定--force 和--backup 选项,而源文件和目标文件
是同一个已存在的一般文件的话,cp 会将源文件备份。
[root@localhost www]# cp -p test.rb /home/test #将test.rb copy到test目录,并且保留原文件的属性 [root@localhost www]# cp -r Dir/ /home/test #将Dir目录copy到test目录下 [root@localhost www]# cp -fr Dir/* /home/test #将Dir下面的所有文件强制copy到test目录下 [root@localhost www]# cp test.rb{,.bak} #备份test.rb,并在尾部加上.bak后缀
cd
cd 目录切换命令
[root@localhost ~]# cd /home/ #切换到home目录 [root@localhost home]# cd - #返回切换到home前的目录 /root [root@localhost ~]# cd ../ #切换到上一级目录 [root@localhost /]# cd ~ #切换当前用户的home目录 [root@localhost ~]#
rm
用法:rm [选项]... 文件...
删除 (unlink) 文件。
-f, --force 强制删除。忽略不存在的文件,不提示确认
-i 在删除前需要确认
-I 在删除超过三个文件或者递归删除前要求确认。此选项比-i 提
示内容更少,但同样可以阻止大多数错误发生
--interactive[=WHEN] 根据指定的WHEN 进行确认提示:never,once (-I),
或者always (-i)。如果此参数不加WHEN 则总是提示
--one-file-system 递归删除一个层级时,跳过所有不符合命令行参
数的文件系统上的文件
--no-preserve-roo 不特殊对待"/"
--preserve-root 不允许删除"/"(默认)
-r, -R, --recursive 递归删除目录及其内容
-v, --verbose 详细显示进行的步骤
--help 显示此帮助信息并退出
--version 显示版本信息并退出
默认时,rm 不会删除目录。使用--recursive(-r 或-R)选项可删除每个给定
的目录,以及其下所有的内容。
要删除第一个字符为"-"的文件 (例如"-foo"),请使用以下方法之一:
rm -- -foo
rm ./-foo
请注意,如果使用rm 来删除文件,通常仍可以将该文件恢复原状。如果想保证
该文件的内容无法还原,请考虑使用shred。
[root@localhost ~]# rm test.php #删除文件需要确认 [root@localhost ~]# rm -f test.php #强制删除文件不确认 [root@localhost ~]# rm -rfv ./test #强制删除当前的test目录,并显示删除的详细过程
mv
用法:mv [选项]... [-T] 源文件 目标文件
或:mv [选项]... 源文件... 目录
或:mv [选项]... -t 目录 源文件...
将源文件重命名为目标文件,或将源文件移动至指定目录。
长选项必须使用的参数对于短选项时也是必需使用的。
--backup[=CONTROL] 为每个已存在的目标文件创建备份
-b 类似--backup 但不接受参数
-f, --force 覆盖前不询问
-i, --interactive 覆盖前询问
-n, --no-clobber 不覆盖已存在文件
如果您指定了-i、-f、-n 中的多个,仅最后一个生效。
--strip-trailing-slashes 去掉每个源文件参数尾部的斜线
-S, --suffix=SUFFIX 替换常用的备份文件后缀
-t, --target-directory=DIRECTORY 将所有参数指定的源文件或目录
移动至 指定目录
-T, --no-target-directory 将目标文件视作普通文件处理
-u, --update 只在源文件文件比目标文件新,或目标文件
不存在时才进行移动
-v, --verbose 详细显示进行的步骤
--help 显示此帮助信息并退出
--version 显示版本信息并退出
备份文件的后缀为"~",除非以--suffix 选项或是SIMPLE_BACKUP_SUFFIX
环境变量指定。版本控制的方式可通过--backup 选项或VERSION_CONTROL 环境
变量来选择。以下是可用的变量值:
none, off 不进行备份(即使使用了--backup 选项)
numbered, t 备份文件加上数字进行排序
existing, nil 若有数字的备份文件已经存在则使用数字,否则使用普通方式备份
simple, never 永远使用普通方式备份
[root@linux ~]# mv abc abc.php #将abc移动成abc.php [root@linux ~]# mv test.php{,.sh} #将test.php增加后辍
[tank@localhost ~]$ mv -t ./database 1.sql #将1.sql移动到database目录下
[tank@localhost ~]$ mv aaa bbb #将目录或者文件重命名,如果存在bbb目录,则是将aaa移到bbb目录下
echo
echo - 显示一行文本
允许在标准输出上显示STRING(s).
-n 不输出行尾的换行符.
-e 允许对下面列出的加反斜线转义的字符进行解释.
-E 禁止对在STRINGs中的那些序列进行解释.
--help 显示帮助并退出(须单独运行)
--version 输出版本信息并退出(须单独运行)
在没有 -E 的情况下,可承认并可以内置替换以下序列:
\NNN
字符的ASCII代码为NNN(八进制)
\\
反斜线
\a
报警符(BEL)
\b
退格符
\c
禁止尾随的换行符
\f
换页符
\n
换行符
\r
回车符
\t
水平制表符
\v
纵向制表符
[root@linux test]# echo "11111" #输出11111 [root@linux test]# echo -n "11111" #输出11111,不带尾部回车
pwd
pwd 显示当前目录
-L, --logical
显示当前目录
-P, --physical
显示当前目录的实际物理地址
--help 帮助
--version 版本
[root@rudder home]# pwd #显示当前目录 /home [root@web mail]# pwd -P #目录是软连接,显示实际物理地址 /var/spool/mail [root@web mail]# pwd -L #-L显示,逻辑地址 /var/mail
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 显示此帮助信息并退出
--version 输出版本信息并退出
如果[文件]缺省,或者[文件]为 - ,则读取标准输入。
[root@localhost ~]# cat test #普通输出 1111111111 2222222222 3333333333 [root@localhost ~]# cat -n test #开头显示行号 1 1111111111 2 3 4 2222222222 5 6 3333333333 [root@localhost ~]# cat -E test #以$结束 1111111111$ $ $ 2222222222$ $ 3333333333$ [root@localhost ~]# cat -s test #超过二个空行,合并成一个 1111111111 2222222222 3333333333 [root@localhost ~]# cat -ns test #去空行,加行号 1 1111111111 2 3 2222222222 4 5 3333333333
[zhangy@BlackGhost awksed]$ cat x* > google_bak.tar.gz #合并文件
# cat > aa #从键盘录入内容到文件,回车是保存,退出Ctrl+z
4234234
234234
^Z
[4]+ Stopped cat > aa
# cat file1 file2 > file #合并二个文件为一个
alias
alias 命令,别名设置
功能说明:删除别名。
语 法:unalias [-a][别名]
参 数:
-a 删除全部的别名。
[root@Blackghost ~] alias ty=ls #为ls设置别名 [root@Blackghost ~] ty -al #别名 总用量 5 drwxr-xr-x 4 tnak tnak 4096 4月 27 14:20 . drwxr-xr-x 4 root root 4096 4月 27 12:34 .. -rw-r--r-- 1 root root 255 4月 26 12:44 abc.sh drwxr-xr-x 2 root root 4096 4月 26 13:44 ar_test [root@Blackghost ~] alias yy='ls -ar' #设置别名,可以是命令带参数
unalias
unalias,删除别名
[root@Blackghost ~] alias ty=ls #为ls设置别名 [root@Blackghost ~] unalias ty #删除别名
[root@localhost database]$ unalias -a #删除全部的别名
head
用法:head [选项]... [文件]...
将每个指定文件的头10 行显示到标准输出。
如果指定了多于一个文件,在每一段输出前会给出文件名作为文件头。
如果不指定文件,或者文件为"-",则从标准输入读取数据。
长选项必须使用的参数对于短选项时也是必需使用的。
-c, --bytes=[-]K 显示每个文件的前K 字节内容;
如果附加"-"参数,则除了每个文件的最后K字节数据外
显示剩余全部内容
-n, --lines=[-]K 显示每个文件的前K 行内容;
如果附加"-"参数,则除了每个文件的最后K 行外显示
剩余全部内容
-q, --quiet, --silent 不显示包含给定文件名的文件头
-v, --verbose 总是显示包含给定文件名的文件头
--help 显示此帮助信息并退出
--version 显示版本信息并退出
[root@linux ~]# head /etc/passwd #默认,显示开头前10行 [root@linux ~]# head -k /etc/passwd #显示开头前k行 [root@linux ~]# head -q -n k file1 file2 file3 #显示多文件开头前k行,并且不显示文件名的文件头 [root@linux ~]# head -n -k /etc/passwd #除最后k行外,显示剩余全部内容。
tail
tail - 输出文件的末尾部分
在标准输出上显示每个FILE的最后10行. 如果多于一个FILE,会一个接一个地显示, 并在每个文件显示的首部给出文件名. 如果没有FILE,或者FILE是-,那么就从标准输入上读取.
--retry
即使tail开始时就不能访问 或者在tail运行后不能访问,也仍然不停地尝试打开文件. -- 只与-f合用时有用.
-c, --bytes=N
输出最后N个字节
-f, --follow[={name|descriptor}]
当文件增长时,输出后续添加的数据; -f, --follow以及 --follow=descriptor 都是相同的意思
-n, --lines=N
输出最后N行,而非默认的最后10行
--max-unchanged-stats=N
参看texinfo文档(默认为5)
--max-consecutive-size-changes=N
参看texinfo文档(默认为200)
--pid=PID
与-f合用,表示在进程ID,PID死掉之后结束.
-q, --quiet, --silent
从不输出给出文件名的首部
-s, --sleep-interval=S
与-f合用,表示在每次反复的间隔休眠S秒
-v, --verbose
总是输出给出文件名的首部
--help
显示帮助信息后退出
--version
输出版本信息后退出
如果N(字节或者行数)的第一个字符为`+', 那么从每个文件的开头算起的第N项开始显示, 否则, 显示该文件的最后N项. N可以有一个倍数前缀: b表示512,k表示1024,m表示1048576(1兆). 第一个选项 -VALUE 或+VALUE 以-n VALUE或-n +VALUE 方式看待,除非VALUE含有[bkm]后缀倍数 中的一个,在这种情况下,它被看作 -c VALUE 或者-c +VALUE
使用--follow (-f)时,tail默认后接文件描述符, 这意味着即使tail显示的文件改名了,tail仍然可以 追踪到其末尾部分. 如果你确实希望查询文件的实际名而非文件描述符 (例如,日志轮转时), 这种默认的操作就不是你所期望的了. 在这种情况下应使用--follow=name. 这将导致tail通过周期性地重新打开所指定的文件来 追踪其是否被删除了,或者被其他程序重新创建了.
[root@linux ~]# tail /etc/passwd #默认,显示最后10 行。 [root@linux ~]# tail -n 2 /etc/passwd #显示最后2行 [root@linux ~]# tail -q -n k file1 file2 file3 #显示多文件最后k行,并且不显示文件名的文件头 [root@linux ~]# tail -n +k /etc/passwd #从开头第k字节处开始输出。 [root@linux ~]# tail -f /var/log/messages #参数-f使tail不停地去读最新的内容,因此有实时监视的效果,用Ctrl+c来终止
显示第i行信息: tail -n+i file.txt | head -1,i为行数,如下:
# tail -n+10 file.txt | head -1 #显示file.txt的第10行
tree
tree命令详解:
-a 显示所有文件和目录。
-A 使用ASNI绘图字符显示树状图而非以ASCII字符组合。
-C 在文件和目录清单加上色彩,便于区分各种类型。
-d 显示目录名称而非内容。
-D 列出文件或目录的更改时间。
-f 在每个文件或目录之前,显示完整的相对路径名称。
-F 在执行文件,目录,Socket,符号连接,管道名称名称,各自加上"*","/","=","@","|"号。
-g 列出文件或目录的所属群组名称,没有对应的名称时,则显示群组识别码。
-i 不以阶梯状列出文件或目录名称。
-I 不显示符合范本样式的文件或目录名称。
-l 如遇到性质为符号连接的目录,直接列出该连接所指向的原始目录。
-L 层级显示
-n 不在文件和目录清单加上色彩。
-N 直接列出文件和目录名称,包括控制字符。
-p 列出权限标示。
-P 只显示符合范本样式的文件或目录名称。
-q 用"?"号取代控制字符,列出文件和目录名称。
-s 列出文件或目录大小。
-t 用文件和目录的更改时间排序。
-u 列出文件或目录的拥有者名称,没有对应的名称时,则显示用户识别码。
-x 将范围局限在现行的文件系统中,若指定目录下的某些子目录,其存放于另一个文件系统上,则将该子目录予以排除在寻找范围外。
[root@localhost ~]# tree -L 2 #-L n 只显示 n 层目录 (n 为数字) [root@localhost ~]# tree -t #-t 用文件和目录的更改时间排序 [root@localhost ~]# tree -r #-r 以相反次序排列 [root@localhost ~]# tree -F #-F 在执行文件,目录,Socket,符号连接,管道名称名称,各自加上"*","/","=","@","|"号 [root@localhost ~]# tree -f #在每个文件或目录之前,显示完整的相对路径名称 [root@localhost ~]# tree -d #只显示目录 [root@localhost ~]# tree -a #显示所有文件和目录
rmdir
用法:rmdir [选项]... 目录...
删除指定的空目录。
--ignore-fail-on-non-empty
忽略仅由目录非空产生的所有错误
-p, --parents 删除指定目录及其上级文件夹,例如"rmdir -p a/b/c'"
与"rmdir a/b/c a/b a'" 基本相同
-v, --verbose 输出处理的目录详情
--help 显示此帮助信息并退出
--version 显示版本信息并退出
[root@localhost ~]# rmdir test #删除test目录,注意必须是空目录 [root@localhost ~]# rmdir -p a/b/c #删除指定目录及其上级文件夹
xargs
xargs 又称管道命令,构造参数等。是给命令传递参数的一个过滤器,也是组合多个命令的一个工具 它把一个数据流分割为一些足够小的块,以方便过滤器和命令进行处理 。简单的说 就是把 其他命令的给它的数据 传递给它后面的命令作为参数
主要参数
-i 用 {} 代替 传递的数据
-I string 用string来代替传递的数据-n[数字] 设置每次传递几行数据
-n 选项限制单个命令行的参数个数
-t 显示执行详情
-p 交互模式
-P n 允许的最大线程数量为n
-s[大小] 设置传递参数的最大字节数(小于131072字节)
-x 大于 -s 设置的最大长度结束 xargs命令执行
[root@localhost ~]# ls |grep .php |xargs -i mv {} {}.bak #将当前目录下php文件,改名字 [root@localhost ~]# ls |grep .php |xargs -I {} mv {} {}.bak #与上例相同 [root@localhost ~]# find ./ -name "*.tmp" | xargs -i rm -rf {} #删除当前文件夹下的,tmp文件
# find ./ -type f -print0 |xargs -0 rm #删除该目录的所有普通文件
# find ./ -type f -exec rm '{}' \; #同上
# find ./ -type f -exec rm '{}' + #同上
find
find 查找目录和文件
find 路径 -命令参数 [输出形式]
参数说明:
路径:告诉find在哪儿去找你要的东西,
命令参数:参数很多下面会说到
输出形式:输出形式很多,-print,-printf,-print0,-exec,-ok,-ls反正很多自己看手册吧。
说一下exec,
-exec find命令对匹配的文件执行该参数所给出的其他linux命令。相应命令的形式为' 命令 - and' {} \;,注意{ }和\;之间的空格。
-ok 和- exec的作用相同,只不过和会人交互而已,OK执行前会向你确认是不是要执行。
find命令主要参数:
-name 按照文件名查找文件。
-perm 按照文件权限来查找文件。
-prune 使用这一选项可以使find命令不在当前指定的目录中查找,如果同时使用了- depth选项,那么-prune选项将被find命令忽略。
-user 按照文件属主来查找文件。
-group 按照文件所属的组来查找文件。
-mtime -n +n 按照文件的更改时间来查找文件, -n表示文件更改时间距现在n天以内,+n表示文件更改时间距现在n天以前。find命令还有-atime和-ctime选项,但它们都和-mtime选项
相似,所以我们在这里只介绍-mtime选项。
-nogroup 查找无有效所属组的文件,即该文件所属的组在/etc/groups中不存在。
-nouser 查找无有效属主的文件,即该文件的属主在/etc/passwd中不存在。
-newer file1 ! file2 查找更改时间比文件file1新但比文件file2旧的文件。
-type 查找某一类型的文件,诸如:
b - 块设备文件。
d - 目录。
c - 字符设备文件。
p - 管道文件。
l - 符号链接文件。
f - 普通文件。
s - socket文件
-size n[c] 查找文件长度为n块的文件,带有c时表示文件长度以字节计。
-depth 在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找。
-fstype 查找位于某一类型文件系统中的文件,这些文件系统类型通常可以在配置文件
/etc/fstab中找到,该配置文件中包含了本系统中有关文件系统的信息。
-mount 在查找文件时不跨越文件系统mount点。
-follow 如果find命令遇到符号链接文件,就跟踪至链接所指向的文件。
-cpio 对匹配的文件使用cpio命令,将这些文件备份到磁带设备中。
a,通过名字来查找
[zhangy@BlackGhost ~]$ find ~ -name memcached.pid -print #查找home目录下文件名为memcache.pid的文件 /home/zhangy/memcached/memcached.pid [zhangy@BlackGhost ~]$ find . -name "*.pid" -print #.代表当前目录,查找所有以pid结尾的文件 ./memcached/memcached.pid ./.tencent/qq/95219454.pid [zhangy@BlackGhost ~]$ find ~ -name "[0-9]*.pid" -print #查找以数字开头的所有pid文件,在这里要说[0-9]*不能匹配23,它跟一般的语言类正则不太一样,shell里面的*可以代表一切字符(单个,多个都行),如果想匹配2345只能这样写[0-9][0-9][0-9][0-9] /home/zhangy/.tencent/qq/95219454.pid [zhangy@BlackGhost ~]$ find /home/zhangy/.tencent/ -name "[0-9]*.pid" -print #在.tencent文件夹下面找pid文件 /home/zhangy/.tencent/qq/95219454.pid
b,通过文件权限来查找
[zhangy@BlackGhost css]$ find ~ -perm 755 -print |more #~代表的是$home目录,查找权限为755的文件 /home/zhangy/www/css2/c_textshadow.html /home/zhangy/www/css2/c_textautospace.html [zhangy@BlackGhost css]$ find . -perm 700 -name "u_*" -print |more #查找所有以产u_开头的,并且权限为700的文件 ./css2/u_length_cm.html ./css2/u_length_px.html
c,prune来忽略目录来查找
[zhangy@BlackGhost download]$ find . -name "*.gz" -prune -o \( \! -name aaa \) -print #查找在前目录中,不在以aaa结尾的目录中的,不以gz结尾的文件 . ./eaccelerator-0.9.5.3.tar ./fix-crash-in-excerpts.patch ./AddFeed_Widget_WordPress_Plugin.zip ./jQuery china-addthis plugin 1.07.rar
d,根据文件类型来查找文件
[zhangy@BlackGhost download]$ find . -type d -print #查找当前目录下面的目录 . ./ddd [zhangy@BlackGhost download]$ find . ! -type d -print #找当前目录下面的非目录文件 ./eaccelerator-0.9.5.3.tar ./haproxy-1.3.15.7.tar.gz ./fix-crash-in-excerpts.patch
e,根据文件所属用户和用户组来找文件
[zhangy@BlackGhost download]$ find . -nouser -print #查找当前目录中,没有归属的文件 [zhangy@BlackGhost download]$ find /home/zhangy/download -user zhangy -group users -print #查找用户组为users,所属用户为zhangy的文件 /home/zhangy/download /home/zhangy/download/eaccelerator-0.9.5.3.tar /home/zhangy/download/haproxy-1.3.15.7.tar.gz
f,根文件大小来查找
[zhangy@BlackGhost download]$ find /home/zhangy/download -size +1000000c -print #查找文件大小大于1000000字符的文件,注意+号表示大于 /home/zhangy/download/eaccelerator-0.9.5.3.tar /home/zhangy/download/mmseg-0.7.3.tar.gz [zhangy@BlackGhost download]$ find /home/zhangy/download -size -10 -print #查找文件大小小于10块的文件,注意-号表示小于,一块等于512b /home/zhangy/download /home/zhangy/download/fix-crash-in-excerpts.patch /home/zhangy/download/test.sql.zip
g,根文件的修改时间来查找
[zhangy@BlackGhost download]$ find /home/zhangy -mtime -5 -print #5天修改过的文件,- 表示以内 /home/zhangy/www/css2/c_textshadow.html /home/zhangy/www/css2/c_textautospace.html [zhangy@BlackGhost download]$ find /home/zhangy -mtime +5 -print #查找5天前修改过的文件,+表示以前 /home/zhangy/www/test.php [root@vmx14420 www]# find ./ -mmin -5 -print #查找5分钟以内修改过的文件 ./cache/index.html
h,exec解释
[zhangy@BlackGhost download]$ find . -type f -size +1000000c -exec ls -al {} \; #显示当前目录下面所有大于1000000的文件,exec后面执行了一个命令,{}这个代表文件名 -rw-r--r-- 1 zhangy users 3624960 2009-03-08 ./eaccelerator-0.9.5.3.tar -rw-r--r-- 1 zhangy users 3091711 12-18 13:48 ./mmseg-0.7.3.tar.gz -rw-r--r-- 1 zhangy users 1191330 2009-06-26 ./pcre-7.9.tar.gz
i,匹配
[tank@localhost workspace]$ find ./database/ -name '*.sql' -print #查找以sql结尾的文件 ./database/28toplearning.sql [tank@localhost workspace]$ find ./database/ -name '*.sql*' -print #查找文件名包括sql文件 ./database/28toplearning.sql [tank@localhost workspace]$ find ./database/ -name '28*' -print #查找以28开头的文件 ./database/28toplearning.sql
andy@ubuntu:~$ find ./ -name "null_*" -exec basename {} \; | sort #搜索文件,并只显示文件名,以升序排列。
null_0
null_1
null_2
null_3
null_4
null_5
null_6
null_7
null_8
null_9
# find ./ -type f -name "*.log" | xargs grep -r "error" #查找当前目录.log文件,并找出包含“error”的行
awk
awk是linux下的一个命令,他对其他命令的输出,对文件的处理都十分强大,其实他更像一门编程语言,他可以自定义变量,有条件语句,有循环,有数组,有正则,有函数等。他读取输出,或者文件的方式是一行,一行的读,根据你给出的条件进行查找,并在找出来的行中进行操作,感觉他的设计思想,真的很简单,但是结合实际情况,具体操作起来就没有那么简单了。他有三种形势,awk,gawk,nawk,平时所说的awk其实就是gawk。
1,变量
变 量 | 描述 |
---|---|
$n | 当前记录的第n个字段,字段间由 FS分隔。 |
$0 | 完整的输入记录。 |
ARGC | 命 令行参数的数目。 |
ARGIND | 命令行中当前文件的位置(从0开始算)。 |
ARGV | 包 含命令行参数的数组。 |
CONVFMT | 数字转换格式(默认值为%.6g) |
ENVIRON | 环 境变量关联数组。 |
ERRNO | 最后一个系统错误的描述。 |
FIELDWIDTHS | 字 段宽度列表(用空格键分隔)。 |
FILENAME | 当前文件名。 |
FNR | 同 NR,但相对于当前文件。 |
FS | 字段分隔符(默认是任何空格)。 |
IGNORECASE | 如 果为真,则进行忽略大小写的匹配。 |
NF | 当前记录中的字段数。 |
NR | 当 前记录数。 |
OFMT | 数字的输出格式(默认值是%.6g)。 |
OFS | 输 出字段分隔符(默认值是一个空格)。 |
ORS | 输出记录分隔符(默认值是一个换行符)。 |
RLENGTH | 由 match函数所匹配的字符串的长度。 |
RS | 记录分隔符(默认是一个换行符)。 |
RSTART | 由 match函数所匹配的字符串的第一个位置。 |
SUBSEP | 数组下标分隔符(默认值是\034)。 |
2,运算符
运算符 | 描述 |
---|---|
= += -= *= /= %= ^= **= | 赋值 |
?: | C条件表达式 |
|| | 逻 辑或 |
&& | 逻辑与 |
~ ~! | 匹 配正则表达式和不匹配正则表达式 |
< <= > >= != == | 关 系运算符 |
空格 | 连接 |
+ - | 加,减 |
* / & | 乘,除与求余 |
+ - ! | 一元加,减和逻辑非 |
^ *** | 求幂 |
++ -- | 增加或减少,作为前缀或后缀 |
$ | 字 段引用 |
in | 数组成员 |
3,awk的正则
匹配符 | 描述 |
---|---|
\Y | 匹配一个单词开头或者末尾的空字符串 |
\B | 匹配单词内的空字符串 |
\< | 匹配一个单词的开头的空字符串,锚定开始 |
\> | 匹配一个单词的末尾的空字符串,锚定末尾 |
\W | 匹配一个非字母数字组成的单词 |
\w | 匹配一个字母数字组成的单词 |
\' | 匹配字符串末尾的一个空字符串 |
\‘ | 匹配字符串开头的一个空字符串 |
4,字符串函数
函数名 | 描述 |
---|---|
sub | 匹配记录中最大、最靠左边的子字符串的正则表达式,并用替换字符串替换这些字符串。如果没有指定目标字符串就默认使用整个记录。替换只发生在第一次匹配的 时候 |
gsub | 整个文档中进行匹配 |
index | 返回子字符串第一次被匹配的位置,偏移量从位置1开始 |
substr | 返回从位置1开始的子字符串,如果指定长度超过实际长度,就返回整个字符串 |
split | 可按给定的分隔符把字符串分割为一个数组。如果分隔符没提供,则按当前FS值进行分割 |
length | 返回记录的字符数 |
match | 返回在字符串中正则表达式位置的索引,如果找不到指定的正则表达式则返回0。match函数会设置内建变量RSTART为字符串中子字符串的开始位 置,RLENGTH为到子字符串末尾的字符个数。substr可利于这些变量来截取字符串 |
toupper和tolower | 可用于字符串大小间的转换,该功能只在gawk中有效 |
5,数学函数
函数名 | 返回值 |
---|---|
atan2(x,y) | y,x 范围内的余切 |
cos(x) | 余弦函数 |
exp(x) | 求 幂 |
int(x) | 取整 |
log(x) | 自然对 数 |
rand() | 随机数 |
sin(x) | 正弦 |
sqrt(x) | 平 方根 |
srand(x) | x是rand()函数的种子 |
int(x) | 取 整,过程没有舍入 |
rand() | 产生一个大于等于0而小于1的随机数 |
测试文件test
root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/bin/false daemon:x:2:2:daemon:/sbin:/bin/false mail:x:8:12:mail:/var/spool/mail:/bin/false ftp:x:14:11:ftp:/home/ftp:/bin/false &nobody:$:99:99:nobody:/:/bin/false zhangy:x:1000:100:,,,:/home/zhangy:/bin/bash http:x:33:33::/srv/http:/bin/false dbus:x:81:81:System message bus:/:/bin/false hal:x:82:82:HAL daemon:/:/bin/false mysql:x:89:89::/var/lib/mysql:/bin/false aaa:x:1001:1001::/home/aaa:/bin/bash ba:x:1002:1002::/home/zhangy:/bin/bash test:x:1003:1003::/home/test:/bin/bash @zhangying:*:1004:1004::/home/test:/bin/bash policykit:x:102:1005:Po
例a
cat test | awk -F: '{\ if ($1 == "root"){\ print $1;\ }else if($1 == "bin"){\ print $2;\ }else{\ print $3;\ } \ }'
例b
awk '{\ for(i=0;i<NF;i++){\ if ($i ~/^root/){\ print $i;\ }else if($i ~/zhangy/){\ print $i;continue;\ }else if($i ~/mysql/){\ print $i;next;\ }else if($i ~/^test/){\ print $i;break;\ } \ }\ }' test
例c
tail test | awk 'BEGIN{while(getline d){ split(d,test);for(i in test){\ print test[i]\ }}}'
例d
ls -al /home/zhangy/mytest | awk 'BEGIN{while(getline d){ split(d,test);\ print test[9] ;} }'
例e
echo "32:34" |awk -F: '{print "max = ",max($1,$2)}\ function max(one,two){ if(one > two){ return one; }else{ return two; } }'
例f
awk -F: '{mat=match($1,/^[a-zA-Z]+$/);print mat,RSTART,RLENGTH}' test
例g
cat test |awk -F: '\ NF != 7{\ printf("line %d,does not have 7 fields:%s\n",NR,$0)}\ $1 !~ /^[A-Za-z0-9]/{printf("line %d,non alpha and numeric user id:%s: %s\n",NR,$1,$0)}\ $2 == "*" {printf("lind %d,no password:%s\n",NR,$0)}'
测试文件
[root@Blackghost test2]# cat aaa //测试文件aaa 1111:23434:zhang hoadsf:asdf:ccc [root@Blackghost test2]# cat ccc //测试文件ccc 1111:23434:zhang hoadsf:asdf:ccc tank:zhang:x20342 ying:zhasdf:72342 hosa:asdfa:2345sdf
例a
[root@Blackghost test2]# awk '{print NR;print FNR;print $0;}' aaa 1 //NR 1 //FNR 1111:23434:zhang 2 2 hoadsf:asdf:ccc
例b
[root@Blackghost test2]# awk '{print NR;print FNR;print $0;}' aaa ccc 1 1 1111:23434:zhang 2 //NR 2 //FNR hoadsf:asdf:ccc 3 //NR 1 //FNR 下面的数据是来自ccc,所以NFR重置为1 1111:23434:zhang 4 2 hoadsf:asdf:ccc 5 3 tank:zhang:x20342 6 4 ying:zhasdf:72342 7 5 hosa:asdfa:2345sdf
只显示出现过一次的记录
# cat aaa 59314 46791 59992 60311 60134 59992 60311 97343 # cat aaa | awk '!a[$1]++' 59314 46791 59992 60311 60134 97343
#输出/etc/passwd中关于root的第二个位置的内容
# cat /etc/passwd |grep root |awk '{print $2}'
sed
sed对文本的处理很强大,并且sed非常小,参数少,容易掌握,他的操作方式根awk有点像。sed按顺序逐行读取文件。然后,它执行为该行指定的所有操作,并在完成请求的修改之后的内容显示出来,也可以存放到文件中。完成了一行上的所有操作之后,它读取文件的下一行,然后重复该过程直到它完成该文件。在这里要注意一点,源文件(默认地)保持不被修改。sed 默认读取整个文件并对其中的每一行进行修改。说白了就是一行一行的操作。我用sed主要就是用里面的替换功能,真的很强大。下面以实例,详细的说一下,先从替换开始,最常用的。
sed -h
-n, --quiet, --silent 取消自动打印模式空间
-e 脚本, --expression=脚本 添加“脚本”到程序的运行列表
-f 脚本文件, --file=脚本文件 添加“脚本文件”到程序的运行列表
--follow-symlinks 直接修改文件时跟随软链接
-i[扩展名], --in-place[=扩展名] 直接修改文件(如果指定扩展名就备份文件)
-l N, --line-length=N 指定“l”命令的换行期望长度
--posix 关闭所有 GNU 扩展
-r, --regexp-extended 在脚本中使用扩展正则表达式
-s, --separate 将输入文件视为各个独立的文件而不是一个长的连续输入
-u, --unbuffered 从输入文件读取最少的数据,更频繁的刷新输出
--help 打印帮助并退出
--version 输出版本信息并退出
测试文件
root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/bin/false daemon:x:2:2:daemon:/sbin:/bin/false mail:x:8:12:mail:/var/spool/mail:/bin/false ftp:x:14:11:ftp:/home/ftp:/bin/false &nobody:$:99:99:nobody:/:/bin/false zhangy:x:1000:100:,,,:/home/zhangy:/bin/bash http:x:33:33::/srv/http:/bin/false dbus:x:81:81:System message bus:/:/bin/false hal:x:82:82:HAL daemon:/:/bin/false mysql:x:89:89::/var/lib/mysql:/bin/false aaa:x:1001:1001::/home/aaa:/bin/bash ba:x:1002:1002::/home/zhangy:/bin/bash test:x:1003:1003::/home/test:/bin/bash @zhangying:*:1004:1004::/home/test:/bin/bash policykit:x:102:1005:Po
例a,这个例子,把test文件中的root替换成tankzhang,只不过只替换一次及终止在这一行的操作,转到下一行
[zhangy@BlackGhost mytest]# sed 's/root/tankzhang/' test |grep tank tankzhang:x:0:0:root:/root:/bin/bash
例b,这个例子,用tankzhang把文件test中的root全部替换掉,请注意g这个字母,global的缩写
[zhangy@BlackGhost mytest]# sed 's/root/tankzhang/g' test |grep zhang tankzhang:x:0:0:tankzhang:/tankzhang:/bin/bash zhangy:x:1000:100:,,,:/home/zhangy:/bin/bash ba:x:1002:1002::/home/zhangy:/bin/bash @zhangying:*:1004:1004::/home/test:/bin/bash
例c,加了-n p后表示只打印那些发生替换的行(部分替换),上面的例子,我并没有加上grep
[zhangy@BlackGhost mytest]# sed -n 's/root/tankzhang/p' test tankzhang:x:0:0:root:/root:/bin/bash
例d,加了-n pg后表示只打印那些发生替换的行(全部替换),上面的例子,我并没有加上grep
[zhangy@BlackGhost mytest]# sed -n 's/root/tankzhang/pg' test tankzhang:x:0:0:tankzhang:/tankzhang:/bin/bash
例e,在第二行,到第八行之间,替换以zhang开头的行,用ying来替换,并显示替换的行
[zhangy@BlackGhost mytest]# cat test | sed -ne '2,8s/^zhang/ying/gp' yingy:x:1000:100:,,,:/home/zhangy:/bin/bash
例f,当有多个命令要执行时,可以用分号来分开,并且分隔符可以自定义,默认是/。上面的例子意思是在第二行,到第八行之间,替换以zhang开头的行,用ying来替换,在5,到10间,用goodbay来替换dbus,并显示替换的行
[zhangy@BlackGhost mytest]# cat test | sed -n '2,8s/^zhang/ying/gp;5,10s#dbus#goodbay#gp' yingy:x:1000:100:,,,:/home/zhangy:/bin/bash goodbay:x:81:81:System message bus:/:/bin/false
例g,这个例子根上面的那个例子一样,只不过有一点不同,那就是-e来充当了分号的作用,-e也能分割多个命令。
[zhangy@BlackGhost mytest]# cat test | sed -ne '2,8s/zhang/ying/gp' -ne '5,10s#dbus#goodbay#gp' yingy:x:1000:100:,,,:/home/yingy:/bin/bash goodbay:x:81:81:System message bus:/:/bin/false
例h,正则的用法,在sed里面用括号的话要加上\的,不然会报错的。
[zhangy@BlackGhost mytest]# sed -ne '2,8s/^\(zhangy\)/\1ing/gp' test zhangying:x:1000:100:,,,:/home/zhangy:/bin/bash [root@masters ~]# sed -ne '2,8s/^\(zhangy\)/&ing/gp' test zhangying:x:1000:100:,,,:/home/zhangy:/bin/bash
例i,&的用处是,在找到的字符串后加上&后面的字符串,zhang后都加上了ying
[zhangy@BlackGhost mytest]# sed -ne '2,15s/zhang/&ying/gp' test zhangyingy:x:1000:100:,,,:/home/zhangyingy:/bin/bash ba:x:1002:1002::/home/zhangyingy:/bin/bash @zhangyingying:*:1004:1004::/home/test:/bin/bash
例j,这个例子是说,在以zhang开头的行开始,到匹配Po的行结束,在他们之间进行替换
[zhangy@BlackGhost mytest]# sed -ne '/^zhang/,/Po/s/zhang/ying/gp' test yingy:x:1000:100:,,,:/home/yingy:/bin/bash ba:x:1002:1002::/home/yingy:/bin/bash @yingying:*:1004:1004::/home/test:/bin/bash
例k,n;这里的n是next的缩写,找到root的行后,将其下一行的中的bin换成tank
[zhangy@BlackGhost mytest]$ sed '/root/{n;s/bin/tank/}' test root:x:0:0:root:/root:/bin/bash tank:x:1:1:bin:/bin:/bin/false
例m,y的作用是将匹配的字符换成大写,不过替换字符和被替换字符长度要一样
[zhangy@BlackGhost mytest]$ sed -e '1,2y/root/ROOT/' test ROOT:x:0:0:ROOT:/ROOT:/bin/bash bin:x:1:1:bin:/bin:/bin/false
例n,h的作用是将找到的行,放到一个缓存区,G的作用是将缓存区中的内容放到最后一行
[zhangy@BlackGhost mytest]$ sed -e '/root/h' -e '$G' test ................................ ............................. ba:x:1002:1002::/home/zhangy:/bin/bash test:x:1003:1003::/home/test:/bin/bash @zhangying:*:1004:1004::/home/test:/bin/bash root:x:0:0:root:/root:/bin/bash
例o,行替换,用匹配root的行,来替换匹配zhangy的行
[zhangy@BlackGhost mytest]$ sed -e '/root/h' -e '/zhangy/g' test root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/bin/false daemon:x:2:2:daemon:/sbin:/bin/false mail:x:8:12:mail:/var/spool/mail:/bin/false ftp:x:14:11:ftp:/home/ftp:/bin/false &nobody:$:99:99:nobody:/:/bin/false root:x:0:0:root:/root:/bin/bash http:x:33:33::/srv/http:/bin/false dbus:x:81:81:System message bus:/:/bin/false hal:x:82:82:HAL daemon:/:/bin/false mysql:x:89:89::/var/lib/mysql:/bin/false aaa:x:1001:1001::/home/aaa:/bin/bash root:x:0:0:root:/root:/bin/bash test:x:1003:1003::/home/test:/bin/bash root:x:0:0:root:/root:/bin/bash
例p,这个例子是说,在以zhang开头的行开始,到匹配Po的行结束,在他们之间进行替换
[zhangy@BlackGhost mytest]# sed -ne '/^zhang/,/Po/s/zhang/ying/gp' test yingy:x:1000:100:,,,:/home/yingy:/bin/bash ba:x:1002:1002::/home/yingy:/bin/bash @yingying:*:1004:1004::/home/test:/bin/bash
例q,3q的意思是到第三行的时候,退出
[zhangy@BlackGhost mytest]$ sed -e 's/bin/tank/g;3q' test root:x:0:0:root:/root:/tank/bash tank:x:1:1:tank:/tank:/tank/false daemon:x:2:2:daemon:/stank:/tank/false
例r,特殊匹配
匹配数字别忘了中括号外面还有一个中括号。 [:alnum:] 字母数字 [a-z A-Z 0-9] [:alpha:] 字母 [a-z A-Z] [:blank:] 空格或制表键 [:cntrl:] 任何控制字符 [:digit:] 数字 [0-9] [:graph:] 任何可视字符(无空格) [:lower:] 小写 [a-z] [:print:] 非控制字符 [:punct:] 标点字符 [:space:] 空格 [:upper:] 大写 [A-Z] [:xdigit:] 十六进制数字 [0-9 a-f A-F] [zhangy@BlackGhost mytest]# sed -ne '2,15s/zhangy.*[[:digit:]]/=======/gp' test =======:,,,:/home/zhangy:/bin/bash @=======::/home/test:/bin/bash
例a,删除1,14行
[zhangy@BlackGhost test]$ sed -e '1,14d' test @zhangying:*:1004:1004::/home/test:/bin/bash policykit:x:102:1005:Po
例b,删除4以后的行,包括第4行,把$当成最大行数就行了。
[zhangy@BlackGhost mytest]$ sed -e '4,$d' test root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/bin/false daemon:x:2:2:daemon:/sbin:/bin/false
例c,删除包括false的行,或者包括bash的行,别忘了加\
[zhangy@BlackGhost mytest]$ sed -e '/\(false\|bash\)$/d' test policykit:x:102:1005:Po
例d,删除从匹配root的行,到匹配以test开头的行,中间的行
[zhangy@BlackGhost mytest]$ sed -e '/root/,/^test/d' test @zhangying:*:1004:1004::/home/test:/bin/bash policykit:x:102:1005:Po
例a,读取test2的内容,并将其写入到匹配行的下面
[zhangy@BlackGhost mytest]$ sed -e '/^root/r test2' test root:x:0:0:root:/root:/bin/bash ============= ------------- +++++++++++++ bin:x:1:1:bin:/bin:/bin/false daemon:x:2:2:daemon:/sbin:/bin/false
例b,将匹配数字的行,写入test2中
[zhangy@BlackGhost mytest]$ sed '/[[:digit:]]/w test2' test
例c,将要插入的东西,插入匹配行的下面
[zhangy@BlackGhost mytest]$ sed '/root/a\\ ===aaaa====' test root:x:0:0:root:/root:/bin/bash ===aaaa==== bin:x:1:1:bin:/bin:/bin/false
例d,正好根a相反,将要插入的东西,插入到匹配行的上面
[zhangy@BlackGhost mytest]$ sed '/^daemon/i\\=================' test root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/bin/false ================= daemon:x:2:2:daemon:/sbin:/bin/false mail:x:8:12:mail:/var/spool/mail:/bin/false
grep
grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。Unix的grep家族包括grep、egrep和fgrep。egrep和fgrep的命令只跟grep有很小不同。egrep是grep的扩展,支持更多的re元字符, fgrep就是fixed grep或fast grep,它们把所有的字母都看作单词,也就是说,正则表达式中的元字符表示回其自身的字面意义,不再特殊。Linux使用GNU版本的grep。它功能更强,可以通过-G、-E、-F命令行选项来使用egrep和fgrep的功能。
grep的工作方式是这样的,它在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名。搜索的结果被送到屏幕,不影响原文件内容。
grep可用于shell脚本,因为grep通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不存在,则返回2。我们利用这些返回值就可进行一些自动化的文本处理工作。
grep --help
匹配模式选择:
-E, --extended-regexp 扩展正则表达式egrep
-F, --fixed-strings 一个换行符分隔的字符串的集合fgrep
-G, --basic-regexp 基本正则
-P, --perl-regexp 调用的perl正则
-e, --regexp=PATTERN 后面根正则模式,默认无
-f, --file=FILE 从文件中获得匹配模式
-i, --ignore-case 不区分大小写
-w, --word-regexp 匹配整个单词
-x, --line-regexp 匹配整行
-z, --null-data 一个 0 字节的数据行,但不是空行
杂项:
-s, --no-messages 不显示错误信息
-v, --invert-match 显示不匹配的行
-V, --version 显示版本号
--help 显示帮助信息
--mmap use memory-mapped input if possible
输入控制:
-m, --max-count=NUM 匹配的最大数
-b, --byte-offset 打印匹配行前面打印该行所在的块号码。
-n, --line-number 显示的加上匹配所在的行号
--line-buffered 刷新输出每一行
-H, --with-filename 当搜索多个文件时,显示匹配文件名前缀
-h, --no-filename 当搜索多个文件时,不显示匹配文件名前缀
--label=LABEL print LABEL as filename for standard input
-o, --only-matching 只显示一行中匹配PATTERN 的部分
-q, --quiet, --silent 不显示任何东西
--binary-files=TYPE 假定二进制文件的TYPE 类型;
TYPE 可以是`binary', `text', 或`without-match'
-a, --text 匹配二进制的东西
-I 不匹配二进制的东西
-d, --directories=ACTION 目录操作,读取,递归,跳过
-D, --devices=ACTION 设置对设备,FIFO,管道的操作,读取,跳过
-R, -r, --recursive 递归调用
--include=PATTERN 只查找匹配FILE_PATTERN 的文件
--exclude=PATTERN 跳过匹配FILE_PATTERN 的文件和目录
--exclude-from=FILE 跳过所有除FILE 以外的文件
-L, --files-without-match 匹配多个文件时,显示不匹配的文件名
-l, --files-with-matches 匹配多个文件时,显示匹配的文件名
-c, --count 显示匹配了多少次
-Z, --null 在FILE 文件最后打印空字符
文件控制:
-B, --before-context=NUM 打印匹配本身以及前面的几个行由NUM控制
-A, --after-context=NUM 打印匹配本身以及随后的几个行由NUM控制
-C, --context=NUM 打印匹配本身以及随后,前面的几个行由NUM控制
-NUM 根-C的用法一样的
--color[=WHEN],
--colour[=WHEN] 使用标志高亮匹配字串;
-U, --binary 使用标志高亮匹配字串;
-u, --unix-byte-offsets 当CR 字符不存在,报告字节偏移(MSDOS 模式)
测试文件
root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/bin/false,aaa,bbbb,cccc,aaaaaa DADddd:x:2:2:daemon:/sbin:/bin/false mail:x:8:12:mail:/var/spool/mail:/bin/false ftp:x:14:11:ftp:/home/ftp:/bin/false &nobody:$:99:99:nobody:/:/bin/false zhangy:x:1000:100:,,,:/home/zhangy:/bin/bash http:x:33:33::/srv/http:/bin/false dbus:x:81:81:System message bus:/:/bin/false hal:x:82:82:HAL daemon:/:/bin/false mysql:x:89:89::/var/lib/mysql:/bin/false aaa:x:1001:1001::/home/aaa:/bin/bash ba:x:1002:1002::/home/zhangy:/bin/bash test:x:1003:1003::/home/test:/bin/bash @zhangying:*:1004:1004::/home/test:/bin/bash policykit:x:102:1005:Po
a,匹配含有root的行
[root@krlcgcms01 test]# grep root test root:x:0:0:root:/root:/bin/bash
b,匹配以root开头或者以zhang开头的行,注意反斜杠
[root@krlcgcms01 test]# cat test |grep '^\(root\|zhang\)' root:x:0:0:root:/root:/bin/bash zhangy:x:1000:100:,,,:/home/zhangy:/bin/bash
c,匹配以root开头或者以zhang开头的行,注意反斜杠,根上面一个例子一样,-e默认是省去的
[root@krlcgcms01 test]# cat test |grep -e '^\(root\|zhang\)' root:x:0:0:root:/root:/bin/bash zhangy:x:1000:100:,,,:/home/zhangy:/bin/bash
d,匹配以zhang开头,只含有字母
[root@krlcgcms01 test]# echo 'zhangying' |grep '^zhang[a-z]*$' zhangying
e,匹配以bin开头的行,用的egrep,在这里可以换成-F,-G
[root@krlcgcms01 test]# cat test |grep -E '^bin' bin:x:1:1:bin:/bin:/bin/false,aaa,bbbb,cccc,aaaaaa
f,在匹配的行前面加上该行在文件中,或者输出中所在的行号
[root@krlcgcms01 test]# cat test|grep -n zhangy 7:zhangy:x:1000:100:,,,:/home/zhangy:/bin/bash 13:ba:x:1002:1002::/home/zhangy:/bin/bash 15:@zhangying:*:1004:1004::/home/test:/bin/bash
g,不匹配以bin开头的行,并显示行号
[root@krlcgcms01 test]# cat test|grep -nv '^bin' root:x:0:0:root:/root:/bin/bash DADddd:x:2:2:daemon:/sbin:/bin/false mail:x:8:12:mail:/var/spool/mail:/bin/false ftp:x:14:11:ftp:/home/ftp:/bin/false &nobody:$:99:99:nobody:/:/bin/false zhangy:x:1000:100:,,,:/home/zhangy:/bin/bash http:x:33:33::/srv/http:/bin/false dbus:x:81:81:System message bus:/:/bin/false hal:x:82:82:HAL daemon:/:/bin/false mysql:x:89:89::/var/lib/mysql:/bin/false aaa:x:1001:1001::/home/aaa:/bin/bash ba:x:1002:1002::/home/zhangy:/bin/bash test:x:1003:1003::/home/test:/bin/bash @zhangying:*:1004:1004::/home/test:/bin/bash policykit:x:102:1005:Po
h,显示匹配的个数,不显示内容
[root@krlcgcms01 test]# cat test|grep -c zhang 3
i,匹配system,没有加-i没有匹配到东西。
[root@krlcgcms01 test]# grep system test [root@krlcgcms01 test]# grep -ni system test 9:dbus:x:81:81:System message bus:/:/bin/false
j,匹配zhan没有匹配到东西,匹配zhangy能匹配到,因为在test文件中,有zhangy这个单词
[root@krlcgcms01 test]# cat test|grep -w zhan [root@krlcgcms01 test]# cat test|grep -w zhangy zhangy:x:1000:100:,,,:/home/zhangy:/bin/bash ba:x:1002:1002::/home/zhangy:/bin/bash
k,在这里-x后面东西,和输出中的整行相同时,才会输出
[root@krlcgcms01 test]# echo "aaaaaa" |grep -x aaa [root@krlcgcms01 test]# echo "aaaa" |grep -x aaaa aaaa
l,最多只匹配一次,如果把-m 1去掉的话,会有三个
[root@krlcgcms01 test]# cat test |grep -m 1 zhang zhangy:x:1000:100:,,,:/home/zhangy:/bin/bash
m,匹配行的前面显示块号,这个块号是干什么的,不知道,有谁知道可否告诉我一下
[apacheuser@krlcgcms01 test]$ cat test |grep -b zha 241:zhangy:x:1000:100:,,,:/home/zhangy:/bin/bash 480:ba:x:1002:1002::/home/zhangy:/bin/bash 558:@zhangying:*:1004:1004::/home/test:/bin/bash
n,多文件匹配时,在匹配的行前面加上文件名
[apacheuser@krlcgcms01 test]$ grep -H 'root' test test2 testbak test:root:x:0:0:root:/root:/bin/bash test2:root testbak:root:x:0:0:root:/root:/bin/bash
o,多文件匹配时,在匹配的行前面不加上文件名
[apacheuser@krlcgcms01 test]$ grep -h 'root' test test2 testbak root:x:0:0:root:/root:/bin/bash root root:x:0:0:root:/root:/bin/bash
p,多文件匹配时,显示匹配文件的文件名
[apacheuser@krlcgcms01 test]$ grep -l 'root' test test2 testbak DAta test test2 testbak
q,没有-o时,有一行匹配,这一行里面有3个root,加上-o后,这个3个root就出来了
[apacheuser@krlcgcms01 test]$ grep 'root' test root:x:0:0:root:/root:/bin/bash [apacheuser@krlcgcms01 test]$ grep -o 'root' test root root root
r,递归显示匹配的内容,在test目录下面建个mytest目录,copy test目录下面的test文件到mytest下面,能看到上面的结果
[root@krlcgcms01 test]# grep test -R /tmp/test/mytest /tmp/test/mytest/test:test:x:1003:1003::/home/test:/bin/bash /tmp/test/mytest/test:@zhangying:*:1004:1004::/home/test:/bin/bash
s,显示匹配root后面的3行
[root@krlcgcms01 test]# cat test |grep -A 3 root root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/bin/false,aaa,bbbb,cccc,aaaaaa daemon:x:2:2:daemon:/sbin:/bin/false mail:x:8:12:mail:/var/spool/mail:/bin/false
vim
用法: vim [参数] [文件 ..] 编辑指定的文件
或: vim [参数] - 从标准输入(stdin)读取文本
或: vim [参数] -t tag 编辑 tag 定义处的文件
或: vim [参数] -q [errorfile] 编辑第一个出错处的文件
参数:
-- 在这以后只有文件名
-v Vi 模式 (同 "vi")
-e Ex 模式 (同 "ex")
-s 安静(批处理)模式 (只能与 "ex" 一起使用)
-d Diff 模式 (同 "vimdiff")
-y 容易模式 (同 "evim",无模式)
-R 只读模式 (同 "view")
-Z 限制模式 (同 "rvim")
-m 不可修改(写入文件)
-M 文本不可修改
-b 二进制模式
-l Lisp 模式
-C 兼容传统的 Vi: 'compatible'
-N 不完全兼容传统的 Vi: 'nocompatible'
-V[N] Verbose 等级
-D 调试模式
-n 不使用交换文件,只使用内存
-r 列出交换文件并退出
-r (跟文件名) 恢复崩溃的会话
-L 同 -r
-A 以 Arabic 模式启动
-H 以 Hebrew 模式启动
-F 以 Farsi 模式启动
-T <terminal> 设定终端类型为 <terminal>
-u <vimrc> 使用 <vimrc> 替代任何 .vimrc
--noplugin 不加载 plugin 脚本
-P[N] 打开 N 个标签页 (默认值: 每个文件一个)
-o[N] 打开 N 个窗口 (默认值: 每个文件一个)
-O[N] 同 -o 但垂直分割
+ 启动后跳到文件末尾
+<lnum> 启动后跳到第 <lnum> 行
--cmd <command> 加载任何 vimrc 文件前执行 <command>
-c <command> 加载第一个文件后执行 <command>
-S <session> 加载第一个文件后执行文件 <session>
-s <scriptin> 从文件 <scriptin> 读入正常模式的命令
-w <scriptout> 将所有输入的命令追加到文件 <scriptout>
-W <scriptout> 将所有输入的命令写入到文件 <scriptout>
-x 编辑加密的文件
-i <viminfo> 使用 <viminfo> 取代 .viminfo
-h 或 --help 打印帮助(本信息)并退出
--version 打印版本信息并退出
1. 查找
/xxx(?xxx) 表示在整篇文档中搜索匹配xxx的字符串, / 表示向下查找, ? 表示
向上查找.其中xxx可以是正规表达式,关于正规式就不多说了.
一般来说是区分大小写的, 要想不区分大小写, 那得先输入
:set ignorecase
查找到以后, 再输入 n 查找下一个匹配处, 输入 N 反方向查找.
*(#) 当光标停留在某个单词上时, 输入这条命令表示查找与该单词匹配的
下(上)一个单词. 同样, 再输入 n 查找下一个匹配处, 输入 N 反方
向查找.
g*(g#) 此命令与上条命令相似, 只不过它不完全匹配光标所在处的单词, 而
是匹配包含该单词的所有字符串.
gd 本命令查找与光标所在单词相匹配的单词, 并将光标停留在文档的非
注释段中第一次出现这个单词的地方.
% 本命令查找与光标所在处相匹配的反括号, 包括 () [] {}
f(F)x 本命令表示在光标所在行进行查找, 查找光标右(左)方第一个x字符.
找到后:
输入 ; 表示继续往下找
输入 , 表示反方向查找
2. 快速移动光标
在 vi 中, 移动光标和编辑是两件事, 正因为区分开来, 所以可以很方便的进行光标定
位和编辑. 因此能更快一点移动光标是很有用的.
w(e) 移动光标到下一个单词.
b 移动光标到上一个单词.
0 移动光标到本行最开头.
^ 移动光标到本行最开头的字符处.
$ 移动光标到本行结尾处.
H 移动光标到屏幕的首行.
M 移动光标到屏幕的中间一行.
L 移动光标到屏幕的尾行.
gg 移动光标到文档首行.
G 移动光标到文档尾行.
c-f (即 ctrl 键与 f 键一同按下) 本命令即 page down.
c-b (即 ctrl 键与 b 键一同按下, 后同) 本命令即 page up.
'' 此命令相当有用, 它移动光标到上一个标记处, 比如用 gd, * 等查
找到某个单词后, 再输入此命令则回到上次停留的位置.
'. 此命令相当好使, 它移动光标到上一次的修改行.
`. 此命令相当强大, 它移动光标到上一次的修改点.
3. 拷贝, 删除与粘贴
在 vi 中 y 表示拷贝, d 表示删除, p 表示粘贴. 其中拷贝与删除是与光标移动命令
结合的, 看几个例子就能够明白了.
yw 表示拷贝从当前光标到光标所在单词结尾的内容.
dw 表示删除从当前光标到光标所在单词结尾的内容.
y0 表示拷贝从当前光标到光标所在行首的内容.
d0 表示删除从当前光标到光标所在行首的内容.
y$ 表示拷贝从当前光标到光标所在行尾的内容.
d$ 表示删除从当前光标到光标所在行尾的内容.
yfa 表示拷贝从当前光标到光标后面的第一个a字符之间的内容.
dfa 表示删除从当前光标到光标后面的第一个a字符之间的内容.
特殊地:
yy 表示拷贝光标所在行.
dd 表示删除光标所在行.
D 表示删除从当前光标到光标所在行尾的内容.
关于拷贝, 删除和粘贴的复杂用法与寄存器有关, 可以自行查询.
4. 数字与命令
在 vi 中数字与命令结合往往表示重复进行此命令, 若在扩展模式的开头出现则表示行
号定位. 如:
5fx 表示查找光标后第 5 个 x 字符.
5w(e) 移动光标到下五个单词.
5yy 表示拷贝光标以下 5 行.
5dd 表示删除光标以下 5 行.
y2fa 表示拷贝从当前光标到光标后面的第二个a字符之间的内容.
:12,24y 表示拷贝第12行到第24行之间的内容.
:12,y 表示拷贝第12行到光标所在行之间的内容.
:,24y 表示拷贝光标所在行到第24行之间的内容. 删除类似.
5. 快速输入字符
在 vi 中, 不要求你输入每一个字符, 可以有很多种方法快速输入一些字符.
使用 linux/unix 的同学一定有一个经验, 在命令行下输入命令时敲入头几个字符再按
TAB 系统就会自动将剩下的字符补齐, 假如有多个匹配则会打印出来. 这就是著名的命令
补齐(其实windows中也有文件名补齐功能). vi 中有许多的字符串补齐命令, 非常方便.
c-p(c-n) 在编辑模式中, 输入几个字符后再输入此命令则 vi 开始向上(下)搜
索开头与其匹配的单词并补齐, 不断输入此命令则循环查找. 此命令
会在所有在这个 vim 程序中打开的文件中进行匹配.
c-x-l 在编辑模式中, 此命令快速补齐整行内容, 但是仅在本窗口中出现的
文档中进行匹配.
c-x-f 在编辑模式中, 这个命令表示补齐文件名. 如输入:
/usr/local/tom 后再输入此命令则它会自动匹配出:
/usr/local/tomcat/
abbr 即缩写. 这是一个宏操作, 可以在编辑模式中用一个缩写代替另一个
字符串. 比如编写java文件的常常输入 System.out.println, 这很
是麻烦, 所以应该用缩写来减少敲字. 可以这么做:
:abbr sprt System.out.println
以后在输入sprt后再输入其他非字母符号, 它就会自动扩展为System.
out.println
6. 替换
替换是 vi 的强项, 因为可以用正规表达式来匹配字符串.以下提供几个例子.
:s/aa/bb/g 将光标所在行出现的所有包含 aa 的字符串中的 aa 替换为 bb
:s/\<aa\>/bb/g 将光标所在行出现的所有 aa 替换为 bb, 仅替换 aa 这个单词
:%s/aa/bb/g 将文档中出现的所有包含 aa 的字符串中的 aa 替换为 bb
:12,23s/aa/bb/g 将从12行到23行中出现的所有包含 aa 的字符串中的 aa 替换为 bb
:12,23s/^/#/ 将从12行到23行的行首加入 # 字符
:%s= *$== 将所有行尾多余的空格删除
:g/^\s*$/d 将所有不包含字符(空格也不包含)的空行删除.
7. 多文件编辑
在一个 vim 程序中打开很多文件进行编辑是挺方便的.
:sp(:vsp) 文件名 vim 将分割出一个横(纵)向窗口, 并在该窗口中打开新文件.
从 vim6.0 开始, 文件名可以是一个目录的名称, 这样, vim 会
把该目录打开并显示文件列表, 在文件名上按回车则在本窗口打
开该文件, 若输入 O 则在新窗口中打开该文件, 输入 ? 可以看
到帮助信息.
:e 文件名 vim 将在原窗口中打开新的文件, 若旧文件编辑过, 会要求保存.
c-w-w vim 分割了好几个窗口怎么办? 输入此命令可以将光标循环定位
到各个窗口之中.
:ls 此命令查看本 vim 程序已经打开了多少个文件, 在屏幕的最下方
会显示出如下数据:
1 %a "usevim.html" 行 162
2 # "xxxxxx.html" 行 0
其中:
1 表示打开的文件序号, 这个序号很有用处.
%a 表示文件代号, % 表示当前编辑的文件,
# 表示上次编辑的文件
"usevim.html" 表示文件名.
行 162 表示光标位置.
:b 序号(代号) 此命令将指定序号(代号)的文件在本窗口打开, 其中的序号(代号)
就是用 :ls 命令看到的.
:set diff 此命令用于比较两个文件, 可以用
:vsp filename
命令打开另一个文件, 然后在每个文件窗口中输入此命令,就能看
到效果了.
8. 宏替换
vi 不仅可以用 abbr 来替换文字, 也可以进行命令的宏定义. 有些命令输起来很费劲,
因此我把它们定义到 <F1>-<F12> 上, 这样就很方便了.这些配置可以预先写到 ~/.vimrc
(windows 下为 $VIM/_vimrc) 中, 写进去的时候不用写前面的冒号.
:nmap <F2> :nohls<cr> 取消被搜索字串的高亮
:nmap <F9> <C-W>w 命令模式下转移光标到不同窗口
:imap <F9> <ESC><F9> 输入模式下运行<F9>
:nmap <F12> :%s= *$==<cr> 删除所有行尾多余的空格.
:imap <F12> <ESC><F12> 同上
:java 中: (注, 这里为什么说 java 中, 因为以下定义对其他文件格式不起作用, 下文
会说到如何实现这一点)
:nmap <F3> :comp javac<CR>:mak -d . %<CR>
此命令用 javac 编译 java 文件, 它会自动将光标定位到出错点. 不过这需要定
义一个 javac.vim 文件在 $VIM/compiler 下, 在 javac.vim 里面只有两行字:
setlocal makeprg=javac
setlocal errorformat=%A%f:%l:\ %m,%-Z%p^,%-C%.%#
:nmap <F4> :comp ant<CR>:mak<CR>
此命令用 ant 编译 java 文件, 它会自动将光标定位到出错点. 一般来说, 安装
vim 后已经有了compiler/ant.vim文件, 因此这个命令可以直接使用. 但是需要
在当前目录下有 build.xml 文件, 当然还必须安装 ant 才行.
:nmap <F5> :cl<CR> 此命令用于查看所有的编译错误.
:imap <F5> <ESC><F5>
:nmap <F6> :cc<CR> 此命令用于查看当前的编译错误.
:imap <F6> <ESC><F6>
:nmap <F7> :cn<CR> 此命令用于跳到下一个出错位置.
:imap <F7> <ESC><F7>
:nmap <F8> :cp<CR> 此命令用于跳到上一个出错位置.
:imap <F8> <ESC><F8>
:nmap <F11> :JavaBrowser<cr>
此命令用于在窗口左部分割出一个新窗口, 里面的内容是 java 的资源树, 包括
本文件中出现的类, 类的成员变量及成员方法, 就好像 JCreator 表现的那样.
在这个窗口中输入 ? 会看到帮助. 嘿嘿, 很好用, 不过需要 ctags 支持.
:imap <F11> <ESC><F11>
9. TAB
TAB 就是制表符, 单独拿出来做一节是因为这个东西确实很有用.
<< 输入此命令则光标所在行向左移动一个 tab.
>> 输入此命令则光标所在行向右移动一个 tab.
5>> 输入此命令则光标后 5 行向右移动一个 tab.
:12,24> 此命令将12行到14行的数据都向右移动一个 tab.
:12,24>> 此命令将12行到14行的数据都向右移动两个 tab.
那么如何定义 tab 的大小呢? 有人愿意使用 8 个空格位, 有人用4个, 有的用2个.
有的人希望 tab 完全用空格代替, 也有的人希望 tab 就是 tab. 没关系, vim 能
帮助你.以下的设置一般也都先写入配置文件中, 免得老敲.
:set shiftwidth=4 设置自动缩进 4 个空格, 当然要设自动缩进先.
:set sts=4 即设置 softtabstop 为 4. 输入 tab 后就跳了 4 格.
:set tabstop=4 实际的 tab 即为 4 个空格, 而不是缺省的 8 个.
:set expandtab 在输入 tab 后, vim 用恰当的空格来填充这个 tab.
10. autocmd
这个命令十分的强大, 可以用这个命令实现对不同的文件格式应用不同的配置; 可以
在新建文件时自动添加上版权声明等等. 这些命令一般定义在 ~/.vimrc 这样的配置文件
里面. 由于他很强大, 所以我不能给出很具体的说明, 只能举几个例子, 详细的请看帮助.
:autocmd! 删除所有之前的自动命令.
autocmd FileType java source ~/.vim/files/java.vim
autocmd FileType java source ~/.vim/files/jcommenter.vim
以上两条命令让我在打开 java 文件时才应用后面提到的两个配置文件.
autocmd BufNewFile *.java 0r ~/.vim/files/skeletons/java.skel
以上这条命令让我在新建 java 文件时自动加入 java.skel 文件的内容.
autocmd BufNewFile *.java normal gnp
以上这条命令让我在新建 java 文件时自动运行 gnp 命令, 这个命令进行一些特殊化
处理, 比如将新 java 文件中的 __date__ 替换成今天的日期什么的.
11. 常用脚本
在 vim.sf.net 你可以发现很多脚本(script), 这些脚本常常有让你意想不到的作用.
我常用的有:
jcommenter.vim 自动加入 javadoc 风格的注释.
JBrowser.vim 类资源浏览. C, C++ 等可以用 Tlist
还有许多有用的, 比如 checkstyle.vim 可以检验你的编程风格, jad.vim 可以直接
反编译 .class 文件等等.
12. 常用配置
在~/.vimrc 配置文件中你常常需要一些个性化配置. 比如上面写的一些宏定义, 一些
autocmd 定义等等. 比如:
set suffixes=.bak,~,.o,.h,.info,.swp,.aux,.bbl,.blg,.dvi,.lof,.log,.lot,.ps,.toc
这样在vim中打开文件时, 按 tab 键补齐文件名时它会忽略上述文件.
set nu 显示行号
set ai 设置自动缩进
map Y y$ 让 Y 和 D 一样, 要不然 Y 的本意和 yy 一样.
13. 其他
还有许多有意思的命令, 记录在这里免得忘记.
. 重复上次编辑命令.
:g/^/exec "s/^/".strpart(line(".")." ", 0, 4) 在行首插入行号。
:runtime! syntax/2html.vim 转换 txt 成 html, 会按照你的颜色配置来转换
[root@linux test]# vim test.php #编辑文件
seq
用法:seq [选项]... 尾数
或:seq [选项]... 首数 尾数
或:seq [选项]... 首数 增量 尾数
以指定增量从首数开始打印数字到尾数。
-f, --format=格式 使用printf 样式的浮点格式
-s, --separator=字符串 使用指定字符串分隔数字(默认使用:\n)
-w, --equal-width 在列前添加0 使得宽度相同
--help 显示此帮助信息并退出
--version 显示版本信息并退出
如果省略了首数或者增量,则默认其值为1,即使这样尾数仍小于首数。
首数、增量和尾数均以浮点数形式解释。当首数小于尾数时增量一般为正值,
相反在首数大于尾数时增量一般为负数。
指定的格式必须适用于显示"double"类型的参数;当首数、增量和尾数均为指定
精确度的定点十进制数时默认为"%.精确度f",否则默认为"%g"。
[root@localhost ~]# seq 1 5 #打印1到5 1 2 3 4 5 [root@localhost ~]# seq 3 5 #打印3到5 3 4 5 [root@localhost ~]# seq 1 3 8 #打印1到8,跨度3 1 4 7