Posts Tagged ‘sed’

卓越购书单生成命令行

August 17th, 2010

拿到一个小组准备买书的列表,大家把书的卓越的url都放进去了,我决定帮负责订书的同事mm一个忙,不要一个一个点啦,咱们这样,把书的url保存成一个csv文件,比如Book1.csv,然后这么干:

url=http://www.amazon.cn/gp/item-dispatch?submit.addToCart=addToCart; inc=1; sed -ne ‘s/.*\(B0[0-9A-Z]\{8\}\).*/\1/p’ Book1.csv | while read bookid; do url=`echo ${url}\&asin.${inc}\=${bookid}`; inc=$(($inc+1));echo $inc: $url; done;

这样,每行会打出一个url,这个url里的结尾部分就是 &asin.1=B0xxxxxxxx&asin.2=B0xxxxxxxx&asin.3….以此类推,不管有多少本,都可以放到一个URL里,实际测试到75本,没有问题,可以一次性加入。

登录卓越后,打开这个URL就可以一次性添加了。

呵呵,自娱自乐。

一行的日志统计计算脚本

January 20th, 2010

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

记在这里了,先不解释了。

同时操作多台主机的命令行

September 27th, 2009

先让命令行亮相一下:

cat conf/slaves| xargs echo |sed -e "s/ /,/g" | \

sed -e "s/^\(.*\)$/pdsh -f 200 -w \"\1\" \"jps|grep JobShell|cut -f1 -d\’ \’ |xargs kill -9 \"/" | \

/bin/bash

第一行主要就是将一行一个的 slave 整成全在一行里,逗号分隔,第一行的 sed 用 tr 也能干。

第二行的用途是整成一个 pdsh 命令行,这是个同时操作多台机器的工具,pdsh –w 后面是节点列表,也就是刚才那个一行的文件列表。后面用引号引起来一群命令行,这些命令行会送到每台计算机去执行,上面这行实际是去杀掉每个节点上的 JobShell Java 进程。最后,第三行里,是把上面合成的命令行交给 shell 执行

这个命令行看起来长,但实际上并不复杂,这里还有一个变形版本

cat conf/slaves| xargs echo |sed -e ‘s/ /,/g’ | \

sed -e "s/^\(.*\)$/pdsh -f 200 -w \"\1\"
\’ for i in \`seq 2001 2100\`;
do  \/share\/home\/testhdp\/hadoop-0\.19\.2\/bin\/hadoop fs -touchz \`uname -n\`\.\$i ;
done \’ /" | \

/bin/bash

中间一行被断成四行写了,实际不应该断行的,这里面的头一部分和上面是一样的,之后的关键实际是怎么把反引号送出去,而不是当场在本机shell被直接变量替换了,实际处理很简单——将命令行放在单引号里,当然,各种引号和 i 前面的 $ 需要反斜线,否则在送到 bash 之前就被当前 shell 给解释了。这样处理后,反引号会被送到每台机器上,由那台机器上的shell来将反引号打开、变量替换也会在远程进行。

嗯,这个命令行长,但是并不很复杂,有兴趣的朋友可以修改并反馈哈。

一行的日志分析脚本

November 30th, 2008

为了分析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里面有这么一些关键点:

  • 指定某个表达式的长度:
    • \{8\} 8个长
    • \{10,12\} 10到12个长
    • \+ 至少一个长
    • \? 可能有一个
    • * 多少个都有可能,没有也有可能
  • \( \) 括起来的内容在后面依次可以用  \1, \2, \3…. 的方式来引用
  • 使用 [ ] 来指定可能的字符,或用 [^] 来排除没有的,如 [^:] 就是不包含冒号的,上述[^:]* 如果替换成 .* 的话,可能在 log: 2008-11-28 13:05:33 中做最大匹配,一直到33前面,红色部分的匹配可能是无门不希望看到的。

后面的 while 实际上保存了上一行的 $blk,然后和当前行作比较,如果不同就加如一行减号,从而分隔开不同的行,如果没有需要的话可以去掉,这样会运行得更快些。
注意,该程序的 while 部分在 linux 中运行速度尚可,在 cygwin 中几乎无法接受,如果用 cygwin 的话,建议要么去掉这部分,要么做好等很长时间的准备。

文件路径处理并生成处理命令

October 31st, 2008

这也是个一行命令

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 命令,这就构成了一个复制命令。

嗯,这个命令算不算变态要看有多少文件要处理,并且要处理多少次类似操作,如果多的话,费这么点力气写个超长命令行还是值得的。

md5sum 收集并排序

October 25th, 2008

下了一个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格式,文件名包括字母、数字、横线、下划线、括号和点。

整理手机图片用的一个批量改名命令(bash)

February 16th, 2008

一行命令文件改名:

for f in *.jpg;
do
    mv $f \
    $(echo ${f%.jpg}| sed -e 's/\([0-9]\{2\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)_\([0-9]\{4\}\)/20\3-\2-\1_\4/').jpg;
done

原来的文件是 日-月-年_时间.jpg,成批改成 年-月-日_时间.jpg

如15-02-08_2303.jpg 就会变成 2008-02-15_2303.jpg

Switch to our mobile site