accu=0;sed -ne ‘s/.*bytesIn=\”\([0-9]*\)\”\/>/\1/p’ stage_3.xml |while read num;do cur=$(($num-$accu));accu=$num; echo $(($cur/20/1024/1024));done
记在这里了,先不解释了。
accu=0;sed -ne ‘s/.*bytesIn=\”\([0-9]*\)\”\/>/\1/p’ stage_3.xml |while read num;do cur=$(($num-$accu));accu=$num; echo $(($cur/20/1024/1024));done
记在这里了,先不解释了。
为了分析hadoop的日志,特地写了个一行的程序,来分析日志程序。Hadoop 是个分布式程序,程序分布在多个节点上,日志自然也是多份的,这里用一行脚本提取所有日志中的关键内容,进行重新排序,方便跟踪,主要是 sed 应用
grep "blk_" hadoop-testhdp-* | sed -ne ‘s/^hadoop-testhdp-\([a-z]\{8\}\)-[a-z]\+-\([0-9]\{1,2\}-[0-9]\{1,2\}\).local.log[^:]*:\(20[0-9]\{2\}-1\?[0-9]-[0-9]\{1,2\} [0-9:,]\{10,12\}\)\(.*\)\(blk_-\?[0-9]\{19\}_[0-9]\{4\}\)\(.*\)$/ \5 \3 [\1] c\2: \4 [The BLK] \6/p’| sort |while read blk remain;do [ "$blk" != "$last" ] && echo "—————-" ; last=$blk ; echo $blk $remain ;done > blocks_log_seg.txt
这个程序主要有两个部分,while之前的是将所有日志放在一起,并提取每行的关键信息,重新排列,然后排序,这样就按照我们关心的方式来排列了,后面一部分(while)是将首个字段发生变化的位置标记出来,以方便查看。sed里面有这么一些关键点:
后面的 while 实际上保存了上一行的 $blk,然后和当前行作比较,如果不同就加如一行减号,从而分隔开不同的行,如果没有需要的话可以去掉,这样会运行得更快些。
注意,该程序的 while 部分在 linux 中运行速度尚可,在 cygwin 中几乎无法接受,如果用 cygwin 的话,建议要么去掉这部分,要么做好等很长时间的准备。
这也是个一行命令
find ../hadoop-0.18.1/ \
‘(‘ -name "*.jar" -o -name "*.a" -o -name "*.so*" -o -name "*.gif" -o -name "*.png" -o -name "*.jpg" -o -name "*.pdf" ‘)’ \
-exec ‘echo’ ‘{}’ ‘{}’ ‘;’ | \
sed -ne ‘s/\([^ ]*\) \.\.\/hadoop-[\.0-9]*\/\([^\ ]*\)/cp \1 \.\/\2/p’ | \
/bin/sh
这个命令的 find 部分从平级的一个子目录中寻找各种二进制文件,然后把文件路径完整地输出两次,而之后用 sed 把第二遍的目录前缀去掉,换到本目录中的相同位置,再在前面加上 cp 命令,这就构成了一个复制命令。
嗯,这个命令算不算变态要看有多少文件要处理,并且要处理多少次类似操作,如果多的话,费这么点力气写个超长命令行还是值得的。
下了一个openclipart 的 daily 发布包,所有文件是按照用户名排序的,文件辨识分类很困难,不管别的了,先选择所有 svg 文件,计算 md5sum,并提取不包含路径的文件名、然后按文件名排序,方便索引。
find . -name "*.svg" -exec ‘md5sum’ ‘{}’ | \
sed -e "s/\([^ ]*\) .*\/\([-a-zA-Z0-9_().]*\.svg\)/\2,\1/g" | \
sort > md5sums_sorted.csv
md5sum 的输出结果是 md5sum 路径名,这里去掉了前面的路径,只保留文件名,然后把它放在前面,md5sum放在后面,中间用逗号分开,构成csv格式,文件名包括字母、数字、横线、下划线、括号和点。