概述:
shell中文本处理命令是非常强大的,本篇文章只是简略的介绍一下他们的用法,诸如像sed,awk这样命令的详解将在以后仔细介绍。
1.diff比较文件命令
1)直接使用diff
[root@station ~]# cat a
123
456
[root@station ~]# cat b
123
[root@station ~]# diff a b
2d1
< 456
比较两个文件的内容表示这里2d1表示b文件比a文件少了一行,那一行驶< 456
[root@station ~]# diff -y -w a b
123 123
456 <
[root@station ~]#
这种比较方式较前一种更直观,其中-y表示以两排格式输出,-w表示比较的时候忽略空格。
[root@station ~]# diff -c a b
*** a 2016-11-06 07:20:03.754590831 -0500
--- b 2016-11-06 07:20:09.643590831 -0500
***************
*** 1,2 ****
123
- 456
这个-c参数是将比较结果以竖列的方式输出,上面先比较两个文件的时间戳,下面则比较文件的内容,这里有三个特殊符号。
+ 比较的文件的后者比前着多一行
- 比较的文件的后者比前着少一行
! 比较的文件两者有差别的行
[root@station ~]# diff -u a b
--- a 2016-11-06 07:20:03.754590831 -0500
+++ b 2016-11-06 07:20:09.643590831 -0500
@@ -1,2 +1 @@
123
-456
-u参数是将两个文件的差异以标准方式输出,这个参数不只改变了输出的格式,而且可以将这个输出结果导入另一个文件,通过使用patch命令可以对文件打补丁。
[root@station ~]# cat a
123
[root@station ~]# cat b
123
456
[root@station ~]# diff -u a b > test
[root@station ~]# patch a test
patching file a
[root@station ~]# cat a
123
456
总之就是将一个文件通过打补丁的形式变成另一个文件。
[root@station ~]# mkdir test1
[root@station ~]# mkdir test2
[root@station ~]# diff -r test1 test2
[root@station ~]# touch test1/aaa
[root@station ~]# touch test2/bbb
[root@station ~]# diff -r test1/ test2/
Only in test1/: aaa
Only in test2/: bbb
[root@station ~]# touch test2/aaa
[root@station ~]# diff -r test1/ test2/
Only in test2/: bbb
[root@station ~]# vim test1/aaa
[root@station ~]# vim test2/aaa
[root@station ~]# diff -r test1/ test2/
diff -r test1/aaa test2/aaa
1c1
< abc
---
> hjk
Only in test2/: bbb
-r参数为比较文件夹的不同(通常来说-r,-R都是与递归有关的,一旦涉及递归就会涉及目录)
而且这个比较既有对目录下文件名字的比较也有对其内容的比较。
2)grep命令(global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)
-i: 忽略匹配串的大小写进行查找
-n:显示所找出关键字所在的行
[root@station ~]# grep -n a test1/aaa
1:abc
-c
显示符合匹配要求结果的个数
-v 反向过滤
将/etc/passwd文件复制到/mnt下,我现在想找到不含有root字段的行
[root@station mnt]# grep -v root passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
-E "关键字1|关键字2" 过滤多个关键字,也就是可以加多个条件
[root@station mnt]# grep -E "root|bin" passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
其中两个关键字为或的关系。
-r(又是-r参数)在目录中查找有关键字的文件,这个命令有的时候非常有用,比如我想找到我的http服务器下(就是/var/www/html/)哪个文件是我的自动化安装脚本,但是我记得我的安装脚本中有一句是ks=http://172.25.254.3/rhel7.1,我们就可以以这个条件进行搜索。
两个重要的关键字 ^与$分别代表行首和行尾,在搜索的时候很有作用,这其实是正则表达式的知识。
3)cut(截取字符命令)
我们主要谈两个参数,分别是-d和-f。
-d指定分隔符
-f指定以分割符分开的哪一部分
<span style="font-size:18px;">[root@foundation3 mnt]# cut -d: -f 1 passwd
</span>
因为passwd文件以:作为分割,所以这个命令可以将passwd文件的所有第一部分,也就是用户名显示出来。
4)sort 排序
不加任何参数的时候是只将每一行的行首进行排序
-n 按数字顺序排序
-u去掉重复的字符
-c显示重复的个数
-t指定分隔符(在查man文档的时候经常看到specify这个单词,就是指定的意思)
[root@foundation3 mnt]# sort -t : -k 2 -n a
3
3:
3:a
3:b
3:1
3:2
3:4
5)uniq
-u#去掉冗余行并显示冗余次数
-c#显示冗余行
-d#显示唯一行
6)sed (流编辑器)
这个命令也会涉及到正则表达式,在这里先不多讲
sed 's/原字符/替换字符/g' file
sed '3,5s/原字符/替换字符/g' file #将3行到5行替换
sed xd file #删除指定的行
sed xp file #复制指定的行(或者说是输出,但是因为流编辑器会把输入进的流也输出,所以会看起来像复制一样,加入-n参数就可以解决)
sed -e '策略1' -e '策略2' file
这个命令可以起到一个补充作用,比如刚才的p命令,我想输出4到6行可以使用
[root@foundation3 ~]# sed -n '1,3p' a.c
#include <stdio.h>
#include <unistd.h>
int main(void)
但是我想只输出4行和6行呢,这时这个-e参数就排上用场了
[root@foundation3 ~]# sed -n -e '1p' -e '3p' a.c
#include <stdio.h>
int main(void)
7)awk命令(这个命令真的是非常强大,因为毕竟这一个命令都可以写一本书)
这里就讲几个简单的例子,之后慢慢补充
现在举个例子,我想取出ifconfig命令中enp2s0的ip地址
方法1:
[root@2+2 ~]# ifconfig | grep inet\ |sed -n '1p'| cut -d' ' -f 10
192.168.1.239
这是使用了cut的版本,其他的都还好,主要是最后的-f 10是什么鬼,就是随机试出来的第10段,可移植性也非常差。
方法2:
[root@2+2 ~]# ifconfig | grep inet\ |sed -n '1p'| awk -F ' ' {'print $2'}
192.168.1.239
awk就会非常清楚的将ifconfig的输出分开,将' '理解为空白字符。