项目里要下发一批数据文件,下游提出要有一个检验文件,用于记录每个文件的信息,格式有要求如下:
1序号 | 2 文件名 | 3 字节数 | 4 行数 | |
---|---|---|---|---|
例如 | 1 | batchjob.log | 823 | 17 |
实例文档如下:
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
至此,生成的校验文件完美符合预期了。