运维笔记14 shell强大的文本管理命令

概述:

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的输出分开,将' '理解为空白字符。






评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值