提高工作效率的命令
背景介绍
经常蹦出来一些想法,又苦于找不到更快的方法实现,摸索一些Linux命令变得很有必要了。这里所记录的命令不同于man cmd
一样教科书般的文字,而是以目的驱动的,即我们的命令只为了达到目的,不会去具体探讨每个生癖的参数,这没用意义,有些参数可能永远都用不到,这取决于个人习惯爱好,达到目的了就行。
我们的约定,每个目的都有编号
,有背景介绍
,有输入
,有输出
,以及适量的文字
辅助理解,这样方便瞄一眼就能理解命令。
命令
- 001
进制转换。
背景: 调试代码时需要打印出来二进制,但为了方便通常打印出来的是10进制,进行简单的转换就很必要了。
很好理解,设定输入/输出进制,就能把输入的数值转成对应的进制。十六进制转十进制,八进制转十进制使用shell计算非常方便。
输入
echo "ibase=2;obase=10;10000" | bc
echo "ibase=10;obase=16;29" | bc
echo $((0xc1))
echo $((071))
输出
16
1D
193
57
- 002
输出列对齐
背景:在终端使用命令打印信息时回碰到列的内容长短不一,没用使用'\t'来分隔每个列,很不直观。比如mount
命令。
输入
mount
mount | column -t
输出
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
hugetlbfs on /dev/hugepages type hugetlbfs (rw,relatime,pagesize=2M)
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
hugetlbfs on /dev/hugepages type hugetlbfs (rw,relatime,pagesize=2M)
- 003
进程信息统计
背景:后台daemon(特别是大功耗的)进程跑久了心里没底 ,都不知道进程运行的怎样,想统计一下缺页错误次数、IO次数等信息来评估评估。
输入
pidstat -r
pidstat -d
输出
23时03分33秒 UID PID minflt/s majflt/s VSZ RSS %MEM Command
23时03分33秒 1000 2012 44.73 0.00 615852 157868 1.95 chrome
23时05分11秒 UID PID kB_rd/s kB_wr/s kB_ccwr/s iodelay Command
23时05分11秒 1000 1983 1.23 0.01 0.00 0 chrome
- 004
进程CPU持续占高
背景:daemon进程有时会突然CPU飙升,持续高涨不下,我想知道它在干什么,什么操作比较耗时。
输入
strace -c -p pid
ubuntu ~ # strace -c -p 28671
Process 28671 attached - interrupt to quit
^CProcess 28671 detached
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
99.96 0.104192 1861 56 ioctl
0.04 0.000045 6 7 wait4
0.00 0.000000 0 38 read
0.00 0.000000 0 16 write
0.00 0.000000 0 16 open
0.00 0.000000 0 37 close
0.00 0.000000 0 15 fstat
0.00 0.000000 0 24 lseek
0.00 0.000000 0 15 mmap
0.00 0.000000 0 15 munmap
0.00 0.000000 0 69 nanosleep
0.00 0.000000 0 7 socket
0.00 0.000000 0 7 clone
0.00 0.000000 0 7 fcntl
0.00 0.000000 0 16 flock
0.00 0.000000 0 1 restart_syscall
0.00 0.000000 0 7 pipe2
------ ----------- ----------- --------- --------- ----------------
100.00 0.104237 353 total
- 004
linux命令超时
背景:有些linux命令是没有超时的,或者超时太大了,执行起来就很久不会终止。有时候只需要获取部分输出就行了,没必要等命令完全执行结束。
输入
timeout 2 netstat -anp
输出
无
// 限制netstat在2秒内执行完毕,否则直接结束netstat
- 005
查看当前内存使用状况
背景:Linux没有像windows那样直观的任务管理器。
输入
free -h
free -h -c 2
输出
total used free shared buff/cache available
Mem: 2.9G 608M 1.6G 30M 722M 2.1G
Swap: 0B 0B 0B
total used free shared buff/cache available
Mem: 2.9G 608M 1.6G 30M 722M 2.1G
Swap: 0B 0B 0B
total used free shared buff/cache available
Mem: 2.9G 608M 1.6G 30M 722M 2.1G
Swap: 0B 0B 0B
- 005
查看指定目录/文件大小
背景:看个文件(夹)的大小也得记个命令。
输入
du -hsc ./
du -hc -d 1
输出
12M ./
12M total
11M ./stl
12M .
- 006
简单计算
背景:嫌打开计算器太慢,想在终端里边直接计算,终端里就是shell,没理由计算不了的。shell计算已经很方便,连按位或/与
都支持。bc弥补了shell计算不了浮点数的缺点。
输入
echo $((25*3))
echo $(((9012+3)%1024))
echo $((0xc1 & 0xc2))
bc <<< "scale=3;20.5/2"
输出
75
823
192
10.250
- 007
查看某个进程下的线程
背景:linux下查看线程,每个线程的运行状况都可以看清楚。由于LInux下的线程是LWP,所以其实也是有进程编号的,从下面的输出可以看出来,进程编号就是主线程的pid。
输入
top -H -p 3102
ps aux | grep "ss-qt5"
pstree -apl | grep "ss-qt" -A 10 -B 1
输出
top - 20:41:33 up 23 min, 1 user, load average: 1.25, 1.36, 1.12
Threads: 9 total, 0 running, 9 sleeping, 0 stopped, 0 zombie
%Cpu(s): 10.0 us, 1.6 sy, 0.0 ni, 88.2 id, 0.3 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 8075832 total, 4340828 free, 1704792 used, 2030212 buff/cache
KiB Swap: 3905532 total, 3905532 free, 0 used. 5754328 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
3088 xiao 20 0 1100380 79760 62236 S 0.3 1.0 0:01.08 ss-qt5
3091 xiao 20 0 1100380 79760 62236 S 0.0 1.0 0:00.08 QXcbEventReader
3092 xiao 20 0 1100380 79760 62236 S 0.0 1.0 0:00.00 dconf worker
3093 xiao 20 0 1100380 79760 62236 S 0.0 1.0 0:00.00 gmain
3094 xiao 20 0 1100380 79760 62236 S 0.0 1.0 0:00.00 gdbus
3101 xiao 20 0 1100380 79760 62236 S 0.0 1.0 0:00.06 QThread
3102 xiao 20 0 1100380 79760 62236 S 0.0 1.0 0:00.06 QThread
3103 xiao 20 0 1100380 79760 62236 S 0.0 1.0 0:00.27 QThread
3104 xiao 20 0 1100380 79760 62236 S 0.0 1.0 0:00.14 QThread
xiao 3088 0.1 0.9 1100380 79760 ? Sl 20:25 0:01 ss-qt5
| | | | `-{sogou-qimpanel},2499
| | | |-ss-qt5,3088
| | | | |-{QThread},3101
| | | | |-{QThread},3102
| | | | |-{QThread},3103
| | | | |-{QThread},3104
| | | | |-{QXcbEventReader},3091
| | | | |-{dconf worker},3092
| | | | |-{gdbus},3094
| | | | `-{gmain},3093
| | | |-unity-panel-ser,1489
| | | | |-{dconf worker},1504
- 008
查找文件
背景:Linux系统下查找文件一般是用find,但是有时会嫌它太慢了。locate可以根据索引查找,速度很快,缺点是一天才更新一次数据库,所以最近更新/删除的文件就查不到了,使用前可以手动执行updatedb
,这样就是相当于实时的查找。
输入
locate -ir "zone$" -l 2 # i忽略大小写,r正则,l输出限制
locate -i "tmp.c" -l 3 # 目录/文件均可搜
输出
/etc/timezone
/home/xiao/zone
/etc/init/mounted-tmp.conf
/home/xiao/glibc/login/getutmp.c
/home/xiao/glibc/login/logwtmp.c
- 009
排查CPU高
背景:CPU高的时候适用。
输入
mpstat -P ALL 1
每秒查看所有CPU
sar -n DEV -d 1
输出
Linux 2.6.30-gentoo-r8 (localhost) 10/05/18 _x86_64_ (2 CPU)
09:24:01 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle
09:24:02 all 6.63 0.00 5.52 0.00 0.00 4.42 0.00 0.00 83.43
09:24:02 0 1.11 0.00 6.67 0.00 0.00 3.33 0.00 0.00 88.89
09:24:02 1 11.96 0.00 4.35 0.00 0.00 6.52 0.00 0.00 77.17
09:22:58 DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
09:22:59 dev8-0 7.00 0.00 120.00 17.14 0.00 0.29 0.29 0.20
09:22:58 IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
09:22:59 lo 31.00 31.00 7.69 7.69 0.00 0.00 0.00
09:22:59 blackhole 0.00 0.00 0.00 0.00 0.00 0.00 0.00
09:22:59 eth0 92.00 0.00 7.59 0.00 0.00 0.00 65.00
09:22:59 eth1 101.00 19.00 9.73 3.46 0.00 0.00 65.00
09:22:59 eth2 24.00 6.00 1.51 0.50 0.00 0.00 0.00
09:22:59 eth3 24.00 0.00 1.51 0.00 0.00 0.00 0.00
09:22:59 eth4 24.00 0.00 1.51 0.00 0.00 0.00 0.00
09:22:59 eth5 24.00 0.00 1.51 0.00 0.00 0.00 0.00
09:22:59 gre0 0.00 0.00 0.00 0.00 0.00 0.00 0.00
09:22:59 vpntun 0.00 0.00 0.00 0.00 0.00 0.00 0.00
- 010
统计相同行数并排序
背景:抓包后统计访问资源次数的时候很适用,直观看出哪些请求频繁被访问,可能会导致性能问题。下面输入中的awk可以去掉的。
输入
cat input | grep "GET" | awk '{print $1}' | sort | uniq -c | sort -n -k1
输出
2 /q
13 /portal/bg.png
14 /connecttest.txt
- 011
两台机器之间快速传目录
背景:通常编译的机器和运行代码的机器不是同一台,所以编译完后快速部署代码就很重要了,下载后再上传的步骤显得很繁琐。
服务端输入
nc -l -p 19333 | tar -C /tmp/ -xf -
客户端输入
tar cf - /target/dir/ | nc 1.2.3.4 19333
- 012
TCP端口转发
背景: 网络上某些中间设备可能会丢指定端口的数据包,可以在服务器上进行端口转发。
在服务器nginx.conf的main
插入配置
stream {
server {
listen 9987; # 监听端口
proxy_pass localhost:443; # 转发至
}
}
- 013
批量修改文件名后缀
背景:STL的库源码都是不带.h
后缀的,用vim看就没有高亮。
批量添加后缀
rename 's/$/\.h/' *
批量去掉后缀
rename 's/\.h//' *
- 014
通过http上传文件
背景:有些服务器无法直接下载文件到本地,唯一的可能就是传到外网某个地方,再从那个地方下载到本地。
curl -F "file=@filename.txt" http://x.x.x.x/
注: 不太注重文件安全,且自己也没有服务器,可以考虑用 https://tmp.link/?tmpui_page=/workspace , 支持通过curl命令上传文件。
- 015
tcp端口转发
背景:把服务器上的端口转发到本地机器上,方便调试。
将本地的1080端口转到192.168.0.5:8080
ncat --sh-exec "ncat 192.168.0.5 8080" -l 1080 --keep-open
注:ncat是升级版的netcat,windows可从这里下载https://nmap.org/ncat/。mac使用brew install nmap即可。