2017年4月

有用的 shell&vim 命令

shell 相关

工作中,总会碰到一些『乍一看处理起来巨麻烦』的问题,特别是一些文本处理类的,但事实上只要能合理巧妙的运用 shell 命令,就能迅速的得到想要的答案,省时又省力。本文将记录下这些有用的 shell 命令,并持续更新。PS: 这里给出的方案不一定是最佳,如果有更好的方案,请留言指出:)

文本处理类

假设请求日志格式为:10.18.122.28 - - [01/Apr/2017:08:15:55 +0000] "GET /sug?channel=type_map&word=%E5%8C%97%E4%BA%AC HTTP/1.1" 200 1508 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36" "-" -0.023

1. 怀疑有坏人在刷请求,如何快速定位到对应的一批 ip。

➜ tail -f access.log | awk '{print $1}' > t.txt
先将 ip 信息先收集到单独的文件中,可减少计算量
➜ cat t.txt | sort | uniq -c | sort -nr | head -10
将结果排序|去重并记录条数|倒序|取前十条。

2. web服务器负载异常,想确认是否是 qps 过高导致。

➜ tail -f access.log | grep "\"GET " | awk '{print $4}' | uniq -c
找到请求时间戳|计算次数,也可以查到某个接口的 qps,grep 到那个接口就行。不过这样会有一个小问题,如果日志中的时间不是增量,就会有重复的情况,但基本能得到一个粗略的结果。

网络系统类

1. 查看系统最占用资源的进程

ps aux | head -1;ps aux | grep -v PID | sort -rn -k +3 | head # CPU
ps aux | head -1;ps aux | grep -v PID | sort -rn -k +4 | head # 内存
其实就是将进程的按某列倒序排序而已,友情提示:ps 查看的是进程启动以来的平均CPU利用率,并不反应实时的。

查找类

1. 提取文件名&目录名

# 1. 使用 ${}
➜  ~  var=/Users/itsmikej/zsh_ext.sh.tar.gz
➜  ~  echo ${var%%.*}
/Users/itsmikej/zsh_ext
➜  ~  echo ${var%/*}
/Users/itsmikej
➜  ~  echo ${var#*.}
sh.tar.gz
➜  ~  echo ${var##*.}
gz
➜  ~  echo ${var##*/}
zsh_ext.sh.tar.gz
# 2. 使用 basename 和 dirname
➜  ~  echo $(dirname $var)
/Users/itsmikej
➜  ~  echo $(basename $var)
zsh_ext.sh.tar.gz

关于 ${}
#:表示从左边算起第一个
%:表示从右边算起第一个
##:表示从左边算起最后一个
%%:表示从右边算起最后一个
换句话来说,#总是表示左边算起,%总是表示右边算起。
:表示要删除的内容
via:http://blog.csdn.net/ljianhui/article/details/43128465

常用数据结构&语法

......

vim 相关

普通模式

  • * 查找当前目标单词(:set hls 高亮),选中之后可以执行 cw n 批量修改。
  • b (begin)移动到单词的开头
  • e (end)移动到单词的最后
  • x 删除当前字符
  • d{motion} 删除,dd行,dl字符,daw(delete a word)单词,dap段落。(dw, db, de, dw)
  • f{char} 跳转
  • c{motion} 修改, cw 删除当前选中单词,并切换到插入模式
  • y{motion} 复制
  • g 切换大小写,g~反转,gU转大写,gu转小写
  • < > 缩进

可视模式

  • v 进入面向字符的可视模式
  • V 进入面向行的可视模式
  • ctrl+v 进入面向列块的可视模式
  • gv 重选上次的高亮选区
  • o 返回起始的选中位置

选中内容之后,就能做一些有用的操作了,比如

多行缩进:Vj 选中行,然后 >. 缩进
列操作:ctrl+v 3j 选中列, c|I|d 操作,esc 所有选中项执行该修改

......