相当好用的sed和awk工具

sed本身是管道命令,这里主要讲对数据的替换,删除,新增,选取特定行的功能介绍,书本就将这么多哈

上案例

1)nl  /etc/passwd | sed '2,5d' #删除文件的2到5行

sed  [n1,[n2]] function

其中function  参数如下

a 新增 c替换 d 删除 i 插入 p打印  s替换 ,格式为   ‘s\old\new\g'

sed 接动作需要用 单引号,一个动作的时候 -e可以忽略,多个动作不可以忽略

2)nl /etc/passwd|sed '2a drink tea' #文件第二行增加字符串 drink tea,注意是追加

如果在前面,则换成2i,如果增加多行则需要用\来分割,可以自己尝试下

3)nl /etc/passwd |sed '2,5c No 2-5 number' #替换2-5行内容为 No 2-5 number

4)昨天的例子,取出文件第11到20行,head -n 20|tail -n 10,用sed就非常简单了

nl /etc/passwd | sed -n '11,20p'#不加n会输出很多,不知道为啥,有了解的希望私信或留言哈

5)找到IP

/sbin/ifconfig eth0     |   grep 'inet addr'   |     sed 's/^.*addr://g'   |    sed 's/Bcast.*$//g'

#分段解释第一段,显示本机网络信息

第二段,找到inet addr相关的记录行

第三段和第四段 :替换尾部是addr:的字符串,Bcast开头的字符串到结尾,就是ip地址的前后部分替换成空格的意思

总之写命令sed时候可以逐步分析操作,这样比较清晰

扩展正则表达式不讲了,等用到时候再说吧

二 格式化打印:printf这个最熟悉不过了,以前学习c语言的时候也是这个,上案例

print '%s\t  %s\t' $(cat printf.txt),#格式化输出

字符串1   tab键  字符串2

其中s表示字符串,i表示integer ,N.nf表示长度N,小数点后n位小数,小数点算一位

%ns  %ni 可以设置固定长度来格式化输出数据

print '%5s\t %10i' $(cat printf.txt)   长度为5的字符串,长度为10的整数

突然想到:今天用alias 设置别名,发现取值需要$(var)才可以,不是${var},大家可以尝试下

第二个工具 :awk 这个按字段处理,sed按行处理,话不多说,就是实践,这玩意学理论困的要死

awk '条件1{}动作1} 条件2 {}动作2}..' filename #格式,注意动作在{动作}  也是用单引号

last -n 5 #显示登录信息最近的5条记录

last -n 5 |awk   '{printf $1  "\t"   $3}’  #文件中第一列字段和第三列字段格式化输出,中间用tab分隔

有几个内置参数 NF 每行总字段数 $0表示一整行数据,字段1用$1表示,以此类推

NR当前处理行    FS目前的分隔符 默认是空格,案例

last -n 5|awk '{printf $1 "\t lines:" NR "\t columes:"NF}'#字段信息,第一列,lines当前处理行,col总列数

2) awk的逻辑运算 > >= < <= != 上面的案例都是对显示的所有行操作,所以没有条件限制,限制的在这里,利用逻辑运算符控制

cat /etc/passwd | awk '{FS=":"}  $3<10 {printf $1 "\t" $3}'#文件已冒号分割,输出第三列数值小于10的记录,边打印出出 第一,三列的记录

注意:这里不包含第一行,如果设置,需要写这个‘BEGIN {FS=":"}’

案例 ,字段列2,3,4,求和显示  ,1列是姓名,增加列total 第一行显示类别不累加,和表格一样

cat pay.txt | awk ‘NR==1 {printf "%s\t '%s\t %s\t %s\t %s\t\n",$1,$2,$3,$4,"Total"}

NR>=2 {total=$2+$3+$4

printf "%10s %10d %10d %10d %10d\n",$1,$2,$3,$4,total)'

注意:在bash,shell中,变量取值直接用名字就行,不用$符号

意思:文件行数为第一行时,打印输出标题,末尾增加列Total

行数大于等于2的时候,打印出各字段内容,并将2,3,4求和给total列显示出来

最近正则表示的学习,如果纯理论真是不好研究,平时多多积累练习才能了解。

第三:文件比较工作,案例是,找出新旧文件不同,生成补丁文件,更新和还原操作,多用于更新源文件的变更,不同的文件比较意义不大,比如生产配置文件的更新,补丁更新等

diff 和 cmp

首选创建一个文件passwd.old

然后坐下简单的修改

cat passwd.old | sed -e '4d' -e '6c no six line' >passwd.new

这里sed超过2个动作时候需要参数e,之前就一个动作,可以不加,刚刚介绍了,这里有数据流定向,将结果写入到passwd.new文件里面,删除第四行,替换第6行

可以利用diff passwd.old passwd.new来看下结果,会显示出更改的地方

这个文件先放这里,一会用

2)cmp比较,主要利用字节去比较,没有diff用途广泛,

可以 cmp passwd.old passwd.new看下结果,不过多介绍了,重点来了

patch 命令,他和diff相关,切极为密切,制作补丁文件,更新和还原在这里,直接上

制作补丁

diff -Naur passwd.old passwd.new >passwd.patch

#把两个文件的改动地方显示出来并记录到passwd.patch文件里面,小白的理解就是word有个审阅的功能,生成的文件类似审阅时候的文档(被修改过的会标记出来),可以同意更改,也可以不同意更改还原。这就是补丁文件

更新

patch -p0

还原

patch -R -p0

-pN中N表示取消基层目录的意思,同一目录不需要减掉了

-R还原

新文件我们可以根据时间命名,这样以后如果想要恢复某个时间段的配置文件信息,方便查找,利用补丁文件,很简单的就可以还原啦,好了,睡觉了,明天见

你可能感兴趣的:(linux,运维,服务器)