提高工作效率的命令

背景介绍

经常蹦出来一些想法,又苦于找不到更快的方法实现,摸索一些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即可。

posted @ 2018-08-19 17:11  xcw0754  阅读(380)  评论(0编辑  收藏  举报