在linux种有一句话,叫做一切皆文件。文件有个特点,它是个文本。它可以读、可以写,如果是二进制文件,它还能执行。这样的话,我们在使用linux的时候,多数时间都是要和各式各样文件打交道的。那么,熟悉文本的读取、编辑、筛选就是linux系统管理员的必备技能。
幸而,在linux中,有三个很牛逼的文本处理工具。它们分别是:grep、sed、awk。下面我们用三篇文章来简单讲讲他们仨。
第一个登场的,是grep。它是(global search regular expression and print out the line,全面搜索正则表达式并将其打印到命令行)的缩写。它是以行来进行搜索的,同时,以行进行输出。它可以直接使用,也可以通过管道符(“|”)来与其他命令混合使用,达到更好的切割文本的效果。
基本用法:
grep “选项“ ”模式“ 文件
其中,”选项“是指常用的几种功能,”模式“指要搜的正则表达式,文件则代表搜索对象。
下面一个一个介绍:
* 常用的一些功能选项:
-v: 显示版本号
-E: 默认模式为扩展正则表达式,相当于使用了egrep
-F: 默认模式为固定字符串列表,相当于使用了fgrep
-n: 输出行数
-v: 反向查找
-i: 忽略大小写
-o:只显示被选中的表达式,不显示整行
-w: 匹配整词,精确的单词,不是模糊匹配。单词的两边必须是非字符符号,以保证中间是一个完整的单词。
-A 行数:匹配到搜索行以及该行下面n行
-B 行数:匹配到搜索行以及该行上面n行
-C 行数:匹配到搜索行以及该行上下n行
* 常用的一些模式介绍:
‘^$’:空行
‘.‘: 任意一个字符
[xyz]: x、y、z任意一个
[[:space:]]: 空格及tab
[a-zA-Z]: 相当于[[:alpha:]]
[^123]:除了123以外的字符,这里的^和通配符里边的"^"意义完全不一样,且在正则表达式中,这些符号的意义与通配符中的意义完全不一样。如果按照通配符的标准来学习正则表达式,那就GG了~
[a-zA-Z0-9]: 相当于[[:alnum:]]
[A-Z]: 相当于[[:UPPER:]]
[a-z]: 相当于[[:lower:]]
[[:punct:]]: 相当于标点符号
下面举几个例子,来演示以下它们怎么使用:
我在/tmp下建立了一个test_file,抄了Bob Dylan的《make you feel my love》进去。我们来测试:
1) cat test_file|grep -w 'love',精准查找关键词'love'.
2) cat test_file|grep -v 'feel my love',grep不会打印带有'feel my love'的行。
3)cat test_file |grep -A 5 'love',grep会打印找到的love行,并其下边的5行一起打印。
4)cat test_file|grep -n '^$',输出空格行行数;若想去除空格行,可以使用grep -v '^$';若想去除注释行,可用egrep -v '#'。
5) 去除/etc/ssh/sshd_config的空格和注释,并打印行数。其中,-v表示反向输出;-E表示使用扩展正则表达式;-n表示输出行数。而'^#|^$'则表示,以"#"开头的注释和空行。|表示“或”的意思。