笔记 by 车东

GNU工具箱

内容摘要: GNU很推崇“工具箱”哲学:很多复杂的问题都可以通过几个更简单的工具通过一定的组合加以解决的。

  • 编辑器:vi pico
  • 行处理:awk sed perl grep sort uniq

下载/解包:wget tar gzip

shell 脚本本身的一些变量: $_ shell环境名称 如 /bin/sh ; $0 shell脚本本身,如 test.sh ; $1 $2 ..$9 命令行参数 test.sh -a -b 的$1 = -a $2 = -b

编辑器:VI pico emacs

vi中显示行号: :set nu 去文件尾部:G 去行尾 $ 添加 i a 删除 x

脚本和行文字处理

给文件批量加前缀: 先用awk生成命令列表: ls -1 *|awk ‘{print “uniq -c “$1” pre_"$1”|sort -rn"}’ > batch_rename.sh

然后执行生成的脚本: sh batch_rename.sh

我的每月访问TOP10 统计脚本: awk -F ‘\t’ ‘{print $4}’ 2004_2.txt| grep chedong.com/tech/|sort |uniq -c|sort -rn|head -10 awk -F ‘\t’ 用TAB分割; grep chedong.com/tech 只列出笔记目录下的文档; sort 排序 uniq -c 汇总计数 sort -rn 按数值排序 head -10 TOP 10

我的每月来源TOP10统计脚本: grep –binary-files=text chedong.com 2004_2.txt |awk -F ‘\t’ ‘{print $3}’| awk -F ‘/’ ‘{print “http://"$3}’|grep -v chedong.com|sort|uniq -c |sort -rn|head -10 grep –binary-files=text 强制按text文本处理 awk -F ‘\t’ 用TAB分割; awk -F ‘/’ 获得域名; grep -v chedong.com 排除自身网站; sort 排序 uniq -c 汇总计数 sort -rn 按数值排序 head -10 TOP 10

grep 打印上下文5行 grep -A 5 -B 5 sometext my.file

去掉#开头的注释,如:apache的httpd.conf grep -v “#” filename

打印大文档中的某一行: sed -n 1234p access_log

将每4行数据变成一行 pr -a -J -T –columns=4 source.log -a 横向输出 -J 合并成行 -T 忽略页头和页尾 –columns=4 每4个单元一次

已一些簡單的例子,解說 sed 的使用 最後,還列出 sed 的 manual page


  1. 將 filename 檔案內的 Giga 字串取代成 GigaRama

sed s/Giga/GigaRama/ filename


  1. 將 filename 檔案內的 xfish 字串那一行刪除

sed /xfish/d filename


  1. 指定哪一行,將之刪除

sed ‘4d’ filename


  1. 或指定第一行到第幾行,將之刪除

sed ‘1,4d’ filename


  1. 將第一行到第五行印出

sed -n 1,5p filename


  1. 將 file 檔案內的出現 xfish 字串的那一行單獨寫到 file2 內

sed -n ‘/xfish/w file2’ file


  1. 萬用字元的使用,將 file 檔案內的 xfis? 哪一行寫到 file2 內

sed ‘/xfis./w file2’ file


  1. 萬用字串的使用,將 file 檔案內的 xfis* 哪一行寫到 file2 內

sed ‘/xfis*/w file2’ file


  1. 選定字元的使用,將 file 檔案內的 xfis[abcd] 哪一行寫到 file2 內

sed ‘/xfis[abcd]/w file2’ file


  1. 特別符號的取消,利用 /

sed s/// file


  1. 一行的起頭的取代,將 file 檔案的每一行起頭都加上 Hi..

sed s/^/Hi.. / file


  1. 一行的結尾的取代,將 file 檔案的每一行結尾都加上 Hi..

sed s/$/Hi.. / file


  1. 多重條件的指定,利用 -e 選項

sed -e ’s/Giga/GigaRama/’ -e ’s/^/Hi../’ file


下载解包:wget tar gz

wget -P output_dir –cut-dirs=1 -nH -m ftp://username:password@123.123.123.123:21/dir1/dir2/

选项说明: -P 指定输出目录名 –cut-dirs=2 不创建目录层次 dir1/dir2/ -nH 不创建域名目录:123.123.123.123/ -m 镜像

例子: wget -P backup –cut-dir=1 -nH ftp://myname:mypass@www.chedong.com:21/tech/

打包:使用GZ tar czf house.tgz house 解包:使用gz tar xzf house.tgz 打包:使用bz2 tar cjf house.tbz2 house 解包:使用bz2 tar zjf house.tbz2

ssh -p 12345 username@hostname.com sftp -oPort=12345 username@hostname.com

对开源软件的印象:开源社区很像一个基于互联网的原始丛林,那些经过近乎“物竞天择”式的发展并能够长期留存下来的工具/开发库往往都是非常“强 壮”的,GNU这些工具包的高效稳定给我留下了深刻印象,而且由于很多开源软件都来自资深工程师的实践,实际上可重用度也很高。如果从生态的角度来解释的 话,开源软件生存下去比同类商资软所需要的件要少。多