转载请注明出处:http://blog.csdn.net/u012842205/article/details/79526050
本文接上一篇:Linux文本处理(一),主要讲解Linux下三个重要工具,并给予一些示例。find、grep和vim。三个工具都用于Linux下的文本处理。
一、grep工具
工具是Globally search a Regular Expression and Print的缩写。按正则表达式查询文件中匹配的行。grep不仅可以查找单个文本文件中的匹配行,也可以查找多个输入文件,或者从某个目录入口,查找此目录树中符合匹配规则的文件,并输出匹配行。
grep工具使用的匹配规则为正则表达式。支持三种风格的正则:
BRE(Basic regular expression);
ERE(Extended regular expression);
PCRE(Perl regular expression);
就我个人而言,我分不清这三种规则,只知道PCRE是Perl原生支持的正则表达式。以下列举一些常用的正则表达式量词与grep内置集合:
对于方括号的解释:方括号中的内容代表字符集合,字符之间不要用空格或者逗号分隔开。比如:
[abcdefg]代表包含元素a、b、c、d、e、f和g这七个字符的集合。
[a-z]代表从a字母到z字母共26个小写字母的集合。
[A-Za-m]代表从字母A到Z的26个字符和小写a到m的共13个字符元素。
常用内置集合如下:
grep的调用格式为:
grep [OPTIONS] PATTERN [FILE...]
PATTERN是正则表达式。FILE部分也可以是目录。这样可以使用-r或者-R递归搜索目录及其子目录中的文件。一般PATTER中含有一些特殊字符,比如*、反斜线或者中括号,大括号等。所以会使用 '\' 进行转义。最好使用单引号将整个PATTER括起来。
下面讲解一些使用grep的用例:
例1:查找文件中的一个或多个连续数字。
grep "[1234567890]\+" ./digit.dat
正则表达式"[1234567890]\+",方括号代表从0到9共十个字符的集合。\+代表前面集合中的字符连续出现一次或多次。
例2:匹配特定格式的字符串:一个小写字母 + 一个到五个数字 + 零个或多个小写字母。
grep "[a-z]\{1\}[[:digit:]]\{1,5\}[a-z]*" ./digit.dat
正则表达式中的"{}" 是量词,
若格式是{a,b},表示前面的元素连续出现a次到b次;
若格式为{a},表示前面的元素连续出现a次;
若格式为{a,},表示前面的元素连续出现不少于a次;
例3:匹配QQ邮箱地址(格式为“QQ号”+“@qq.com”)
grep "[[:digit:]]\{4,13\}@qq\.com" <file_name>
这里我们只匹配了4到13位的QQ号,'@'号可以不用转义符。
例4:匹配回文字符串(格式如123483831234)
grep "\([[:digit:]]\{4\}\)\([[:digit:]]\{2\}\)\2\1" <file_name>
此正则表达式使用了小括号。第一个小括号内容为1234,第二个小括号匹配到的内容是83,按顺序再排列第二个小括号内容和第一个小括号内容,成为回文字符串。
二、find工具
find是命令行工具,用于从文件系统的一个或多个目录树中搜索符合用户指定匹配规则的文件。find也支持很多类型的正则表达式,笔者能力有限,仍然不清楚这些类别的正则表达式有什么区别,但知道可以使用如下命令将支持的种类列出来,且可以使用-regextype指定使用哪种类别:
$ find -regextype help
find: Unknown regular expression type ‘help’; valid types are ‘findutils-default’, ‘awk’, ‘egrep’,
‘ed’, ‘emacs’, ‘gnu-awk’, ‘grep’, ‘posix-awk’, ‘posix-basic’, ‘posix-egrep’, ‘posix-extended’,
‘posix-minimal-basic’, ‘sed’.
以下实例中,没有使用到太难的正则。下面是find工具的调用方法:
find [-H] [-L] [-P] [-D debugopts] [-Olevel] [starting-point...] [expression]
starting-point代表从哪个起始目录开始搜索,这个起始点是整个目录树的根节点,从此节点开始,其下所有的子目录都会被搜索。
expression由一些选项序列组成,序列按功能类别划分为:Test、Actions、Global Options、Positional Options和Operators五类。Test是一些测试,如测试是否为空文件,测试文件的所有者UID小于某个值,文件名是否匹配于正则表达式等;Actions定义匹配到的每个文件将做什么操作,可能是用户定义的一系列Shell命令,也可能是删除等;Operators定义了find识别的一些逻辑计算符,比如逻辑与、逻辑或、逻辑非、小括号等。expression是按用户指定的顺序执行。以下是常用的expression选项:
例1:删除目录下的空文件(size=0)。
find -empty -ok rm {} \;
# 或者
find -empty -delete
例2:列出目录树中非空文件的状态
find \! -empty -exec stat {} \;
例3:列出目录树中的java文件,并列出行数.
find . -name '*.java' -exec wc -l {} \;
例4:列出目录树中的Shell脚本.
find ./ -name '*.sh'
三、vim工具
vim是一款命令行界面编辑器,兼容更早版本的vi工具,可以非常方便地编辑文本文件,特别是用于代码编写。在没有图形界面的服务器环境,vim对于文本编辑,修改配置,查询日志也游刃有余。
vim有丰富的快捷键,支持多模式,支持语法高亮,不只是程序代码,甚至于配置文件、日志文件都可以有高亮。它也是一款免费的开源软件。主流的Linux发行版中原生支持vim或者一个低版本的VI。本文不讲解vi的使用。
下图为vim/vi的快捷键图:
1、vim四种操作模式
(1)正常模式:启动vim后默认处于正常模式。任何模式都通过ESC返回正常模式。此模式不可编辑文本。正常模式下,光标的移动除了可以使用方向键,还可以使用h(左移一字符)、j(下移一字符)、k(上移一字符)、l(右移一字符)四个键进行移动。
(2)插入模式:此模式下,用户可以编辑文本,增删改文本。即是编辑模式。
(3)视图模式:此模式操作类似鼠标选中。
(4)命令模式:此模式接受用户输入命令,包括vim命令或者Bash命令。
2、vim各个模式切换
所有模式通过按ESC可以切换回正常模式。无论当前处于什么模式,要切换到其他模式,必须先切换回正常模式。
3、vim常用快捷键
4、退出vim方法
1)从当前模式转为正常模式(使用ESC);
2)使用冒号按键":"进入命令模式;
3.1)若需要保存修改操作,输入命令"wq"并回车;
3.2)若不需要保存修改操作,输入命令"q!"并回车;
3.3)若没有修改操作,可以输入命令"q"并回车;
另外:也可以使用x命令退出vim,此命令会自动保存修改操作。
5、vim分屏
vim支持水平分屏和垂直分屏,且可以继续递归分屏。在命令行环境下,一个屏幕可以同时显示多个文件,方便操作修改。分屏操作一般在命令模式完成,使用vim的命令vs(垂直分屏)或sp(水平分屏),命令后接要打开的文件作为参数。
例如:当前打开了一个文件A,现在需要垂直分屏,打开服务器的host文件(/etc/hosts),则先切换到正常模式,按ESC,再按冒号键":"进入命令模式,输入vim命令:
vs /etc/hosts
屏幕会分屏显示,右边仍然是A文件内容,左边是/etc/hosts文件内容。分屏后,在正常模式下,可以使用快捷键进行光标移动,在各个分屏间切换光标:
ctrl + w + j 移动光标到当前位置下面的窗口
ctrl + w + k 移动光标到当前位置上面的窗口
ctrl + w + l 移动光标到当前位置右边的窗口
ctrl + w + h 移动光标到当前位置左边的窗口