利用 bash 命令做 SQL 数据修补

如果是把一个 DB 或者一个 table 从一个服务器送到另一个, 那么使用 mysqldump 命令就可以了. 但有的时候, 需要的数据可能只是若干条记录, 就不能用 mysqldump 了. 奇怪的是我 google 了一番居然也没找到很方便的方法. 求人不如求自己吧, 下面是用 bash 命令的解决方法:

mysql <database> -uroot -e “select * from <table> where <condition>…” |tail -n +2 |sed -e ‘s/^/(“/g’ -e ‘s/$/”)/g’ -e ‘s/\t/”,”/g’ |while read values; do echo “insert into <table> values $values”; done

然后把输出的 SQL 在目标服务器上运行即可. 记得把< >里面的变量替换为实际需要的内容. 🙂

Linux 命令行上的文字处理

总是有些用户, 明明是自己手抖点错了, 却偏偏要怪服务器出问题. 如果让我选择相信一个人还是一台机器, 那… 还是选机器比较放心. 当然也不能冤枉好人, 于是如何从若干 GB 的服务器日志里找到线索就成为解决问题的关键了.

首先是 grep. grep 就好像是个过滤器, 将无关的内容滤掉, 却从不漏下真相. 假设服务器日志是 server.log, 其中包含时间, 地点, 人物:

1, 找出所有含 beijing 的记录

grep beijing server.log

2, 包含 2013-12-01 当天, 在 beijing 关于 user 的记录

grep  -E -e ‘2013-12-01.*beijing.*user’ server.log

3, 也可以将 grep 串联起来, 逐步缩小包围圈, 这样如果个别记录不符合时间, 地点, 人物的顺序, 也不会被漏掉. 当然我觉得日志还是规矩一点的好.

grep ‘2013-12-01’ server.log |grep beijing |grep user

另外作为开发人员, 使用 grep 来分析代码也很不错的. 找到目标之后, 很可能需要生成一个报表, 最简单的就是 cut 命令了. 假设日志格式是”date time location user action”, 如果我们只需要”date time user action”, 那么

grep beijing server.log| cut -d ‘ ‘ -f1,2,4,5

其中 -d ‘ ‘ 指定使用空格 ‘ ‘ 来做分隔符, -f1,2,4,5 就分别代表需要输出的字段, 因为 location 是第三个, 因此 3 没有出现. 比 cut 强大的多的就是 awk 了, 生成一个有小计/总计什么的表格完全是小菜. 不过这个不是我的兴趣, 所以就点到为止.

🙂

在 Linux 中充分利用多核 CPU 来转码

上回写的<听美剧, 练英语听力>之后, 发现忘了放个批量处理的脚本. 下面补上, 顺便练习一下多核心协同处理. 嗯, 手机都4核了不是?

用到的命令类似:

avconv -i your.mkv -vn -acodec libmp3lame -ac 2 -f mp3 your.mp3

简单的 bash 单循环写法:

ls *.mkv |while read i; do avconv -i $i -vn -acodec libmp3lame -ac 2 -f mp3 $i.mp3; done

这就只用到了一个 CPU 核心. 如果将 avconv 放到后台执行就可以做到多进程, 但又不方便控制进程数, 当进程数远远大于 CPU 核心数时就可以体验一下一台服务器快被烤熟时的感觉了. 后来发现 xargs 支持指定数目的进程, 简直是无法要求更多了:

ls *.mkv | xargs -n 1 -P 4 -I filename avconv -i filename -vn -acodec libmp3lame -ac 2 -f mp3 filename.mp3

又简单又高效了是不是? 其中 -P 4 就是开启4个进程来执行. 🙂