[效率编程]-几个-shell小工具(-Expect-Htop-Ccat-Z-Iotop)

目录

背景介绍

总结记录几个shell小工具,都是很常用且很好用的东西.

  • expect : 实现人机交互的一个命令行工具
  • ccat : linux 下上色版本的cat
  • htop : 上色增强版本的top
  • 软连接
  • z: 快速的cd
  • iotop: 查看服务器IO.
  • jq: 命令行格式化json.

最终实现了,高效的登录至服务器,不用输入密码.以及使用ccat查看源码,使用htop观察机器内存等信息.

Expect

介绍

Expect是Unix系统中用来进行自动化控制和测试的软件工具,由Don Libes制作.

通俗的讲,就是允许你在脚本里设定一些”原本要手动输入”的东西.

安装

mac OS: brew install expect

几个重要的命令

  • send:向进程发送字符串,用于模拟用户的输入。注意一定要加\r回车
  • expect:从进程接收字符串
  • spawn:启动进程(由spawn启动的进程的输出可以被expect所捕获)
  • interact:用户交互

Demo

1
2
3
4
5
6
7
8
9
10
#!/usr/local/bin/expect
set server [lindex $argv 0]
set timeout -1
set passwd XXXXXXX
spawn ssh jump
expect {
"*Enter passphrase*" {send "$passwd\r";exp_continue}
"*Welcome to*" {send "$server\r";}
}
interact

这是实现的一个expect的简单应用.实现了自动登录跳板机并选择机器进行登入.具体解释一下.

  • 第一行注释,说明此文件使用expect解释器
  • 第二行设置一个变量,server=输入的第一个参数
  • 第三行设置一个变量,passwd=密码
  • 第四行新起了一个进程来执行ssh jump命令,
  • expect命令匹配到Enter passphrase时输入密码.
  • 匹配到welcome*时输入server.
  • 交给用户来交互

<a href=”http://xstarcd.github.io/wiki/shell/expect.html" 很不错的expect教程 中有多个常用的expect的示例.可以参考.

ccat

安装

brew install ccat

效果

输出一个java文件

2019-04-02-17-34-21

htop

安装

brew install htop

常用功能键

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
F1 : 查看htop使用说明
F2 : 设置
F3 : 搜索进程
F4 : 过滤器,按关键字搜索
F5 : 显示树形结构
F6 : 选择排序方式
F7 : 减少nice值,这样就可以提高对应进程的优先级
F8 : 增加nice值,这样可以降低对应进程的优先级
F9 : 杀掉选中的进程
F10 : 退出htop

/ : 搜索字符
h : 显示帮助
l :显示进程打开的文件: 如果安装了lsof,按此键可以显示进程所打开的文件
u :显示所有用户,并可以选择某一特定用户的进程
s : 将调用strace追踪进程的系统调用
t : 显示树形结构

H :显示/隐藏用户线程
I :倒转排序顺序
K :显示/隐藏内核线程
M :按内存占用排序
P :按CPU排序
T :按运行时间排序

上下键或PgUP, PgDn : 移动选中进程
左右键或Home, End : 移动列表
Space(空格) : 标记/取消标记一个进程。命令可以作用于多个进程,例如 "kill",将应用于所有已标记的进程

效果

2019-04-02-17-35-13

在这个界面,可以使用f3搜索,f4过滤,具体操作

linux设置软连接

经过上面的第一个步骤,我们有了一个jump的脚本,但是每次都要去执行脚本也是一件非常麻烦的事情.

我们希望可以像使用mysql等等命令那样在全局都可以.

这里有两种实现方式:

软连接

/usr/local/bin目录下设置一个目标脚本的软连接即可.

1
ln -s ~/jump /usr/local/bin/jump

使用zsh的全局别名

/.zshrc文件中加入`alias=”/jump”`即可.

Z

这个名字真的是简洁.

这是一个快速管理你的cd命令的脚本.github仓库

基本实现就是:

你安装了z,之后你的cd会被记录到.z文件,然后当你想切换目录的时候,只需要z xx + tab即可. xx是你想去的目录的部分名字即可,z使用正则表达式来匹配,所以只要你输入的xx足够不重复,基本是无敌精准的.

安装

使用zsh的朋友,打开~/.zshrc,将其中的plugins={git} 添加z,变成plugins={git z},然后执行source ~/.zshrc即可.

使用bash的朋友, 可以首先创建一个目录,然后克隆仓库,之后将source命令加入.bashrc即可.如下放的命令:

1
2
3
4
mkdir ~/code
cd ~/code && git clone https://github.com/rupa/z.git
echo 'source ~/code/z/z.sh' >> ~/.bashrc
source ~/.bashrc

使用

先瞎cd几下.然后z:

2019-04-02-20-25-53

iotop

查看磁盘IO的工具.

在ubuntu环境下:

1
2
3
wget http://guichaz.free.fr/iotop/files/iotop-0.6.tar.bz2
tar -xjvf iotop-0.6.tar.bz2
cd iotop-0.6/

之后执行./iotop.py即可.

如果嫌麻烦,可以设置软连接即可全局使用啦.

1
2
3
4
# 仅显示实际在做io的进程
iotop -o
# 根据pid进行筛选
iotop -p

jq

作为后端开发,经常要接触到一些json格式的数据,想要肉眼可读需要将其格式化,一般情况下我都是用在线的格式化工具,比如 json在线格式化,越来越觉得有点麻烦,且有时候在服务器上,还要copy下来,贼麻烦.就找到一个命令行工具来做.

这就是jq,在mac上使用brew安装,brew install jq即可.在其他linux上需要自己找一个安装方式.

安装完成之后, 使用-h参数来了解他都可以干什么?

2019-08-05-17-47-53

或者可以使用man jq 来查看.

我们使用{"name":"huyan", "url":"http://huyan.couplecoders.tech/", "age":18}来测试一下:

2019-08-05-17-54-48

图中我们简单的操作了一下,可以将输入字符串进行格式化,获取其中某个键的值,获取全部的键.等等.

其实jq的功能远比这个强大,它支持管道,过滤,切片,数组操作等等,但是对我个人来说,学习那些的成本高于我获得的收益,因为我只需要格式化和获取某个键的值就基本够用了.所以这里不再展开讲详细的高阶操作.需要进一步深入学习的朋友google或者在参考文章处有一篇不错的教程.

这样使用,每次都要echo,太麻烦了,所以我们写一个小脚本,如下所示

1
2
3
#!/bin/bash

echo $1 | jq .

然后将此文件软连接到/usr/local/bin目录下面,起名为jqh. 然后就可以愉快的jqh 'content'了.

参考文章

很不错的expect教程

中文版expect教程

jq使用
完.





ChangeLog

2019-04-02 完成 2019-04-03 添加Z 2019-04-21 添加iotop 2018-08-05 添加jq

以上皆为个人所思所得,如有错误欢迎评论区指正。

欢迎转载,烦请署名并保留原文链接。

联系邮箱:huyanshi2580@gmail.com

更多学习笔记见个人博客——>呼延十