最近用到的命令

November 4, 2013

在可以按行处理,而且每行的格式都固定的时候,用各种Unix工具做字符串操作还是比较方便的。下面是这几天用到的一些命令,应该有更高效的方法,不过我只会用每个工具的基本用法。

统计常用的命令

1
2
3
4
5
awk '$0 !~ /^#/ {print $N}' ~/.bash_history |
    sed 's/ | /\n/g' |
    awk '{print $1}' |
    sort | uniq -c |
    sort -nr

每一行的作用:

  1. 读取~/.bash_history,去掉#开头的时间信息
  2. |换成换行,被管道连接的命令也要计算
  3. 输出每行的第一个字段
  4. 排序,计算每个命令出现的次数
  5. 按次数排序

最常用前十个命令和次数:

cd 852
zathura 562
\rm 558
cat 556
ls 543
sudo 474
lsl 455
grep 334
cp 334
opera 318

统计安装的Haskell包

因为以前用cabal-dev分开管理不同的Haskell项目,所以有些包重复安装了在不同的项目里,所以想看一下一共安装那些包。

1
2
3
4
find . -type f -name "*.conf" |
    awk -F / '{print $NF}' |
    rev | cut -b 39- | awk -F - '{print $2}' | rev |
    sort -u

每一行的作用:

  1. 找到全部包的信息文件路径
  2. 得到信息文件名
  3. 得到包名
  4. 排序去重

信息文件的文件名的格式是包名-版本-32位哈希.conf,因为包名里可能有-,根据-取第一个字段不一定是完整的包名。但是后面的-32位哈希.conf的长度是固定的,所以我先用rev反转然后用cut去掉这固定长度的部分,然后再根据-拿到反转的包名,最后再转回来。

迁移GHC安装位置

直接把文件移动到其他地方还不行,因为包的信息文件里也有路径信息,移动文件后要修改。

1
2
3
4
for f in *.conf ;  do
    sed s,/usr/lib/ghc,/opt/ghc-7.7,g $f > new;
    cp new $f ;
done