linux wc, sed, nl 结合生成校验文件, sed正则表达式查找替换

项目里要下发一批数据文件,下游提出要有一个检验文件,用于记录每个文件的信息,格式有要求如下:

1序号2 文件名3 字节数4 行数
例如1batchjob.log82317

实例文档如下:

1|batchjob.log|823|17
2|rwalog.log|133|4

想用linux自己的脚本实现,于是一步一步靠近吧。

1 wc生成统计信息
[rwa@tzs-hadoop-02 ~]$ wc -lc *.log
 17 823 batchjob.log
  4 133 rwalog.log
 21 956 total

2 nl命令加上序号
[rwa@tzs-hadoop-02 ~]$ wc -lc *.log | nl
     1   17 823 batchjob.log
     2    4 133 rwalog.log
     3   21 956 total

2 sed命令去掉每行前面的空格
's/^[ \t]*//g'
[rwa@tzs-hadoop-02 ~]$ wc -lc *.log | nl | sed -e 's/^[ \t]*//g'
1        17 823 batchjob.log
2         4 133 rwalog.log
3        21 956 total
3 每行中间的空格换成竖线(|)
-e 's/[ \t]\+/\|/g'
[rwa@tzs-hadoop-02 ~]$ wc -lc *.log | nl | sed -e 's/^[ \t]*//g' -e 's/[ \t]\+/\|/g'
1|1|102|batchjob.log
2|1|94|rwalog.log
3|2|196|total

到这一步已经很接近了,下面就是要交换列位置

4 1.2.3.4列调换成1.4.3.2列

要交换列位置,的先正则表达式,每一个匹配要用()括起来,在替换环节,用\1,\2…来应用这些匹配。

-e 's/\(^[0-9]\+\)|\([0-9]\+\)|\([0-9]\+\)|\(.\+\)$/\1|\4|\3|\2/g'
[rwa@tzs-hadoop-02 ~]$ wc -lc *.log | nl | sed -e 's/^[ \t]*//g' -e 's/[ \t]\+/\|/g' -e 's/\(^[0-9]\+\)|\([0-9]\+\)|\([0-9]\+\)|\(.\+\)$/\1|\4|\3|\2/g'
1|batchjob.log|823|17
2|rwalog.log|133|4
3|total|956|21

基本大功告成了,就是最后多了一行

5 去掉total那一行

本来直接去掉最后一行:

-e '$d'

但是测试发现,wc统计信息时,如果只有一个文件它是不输出统计行的,所以只能查找包含total文字的一行。

-e '/total/d'
[rwa@tzs-hadoop-02 ~]$ wc -lc *.log | nl | sed -e 's/^[ \t]*//g' -e 's/[ \t]\+/\|/g' -e 's/\(^[0-9]\+\)|\([0-9]\+\)|\([0-9]\+\)|\(.\+\)$/\1|\4|\3|\2/g' -e '/total/d'
1|batchjob.log|823|17
2|rwalog.log|133|4

至此,生成的校验文件完美符合预期了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值