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