# Linux常用命令

### ps

用于显示当前进程 (process) 的状态

```
ps -ef 
e：显示所有进程；f：全格式。

ps -T -p 15436
查看进程15436创建的所有线程
```

### netstat

显示网络状态

```
netstat -anp | grep 8080   
查询占用8080端口的进程号  a：所有连线中的socket；n：直接使用IP地址，而不通过域名服务器；p：显示正在使用Socket的程序识别码和程序名称。

Recv-Q和Send-Q分别表示接收队列和发送队列，一般都是0，如果不是则表示包正在队列中堆积，这种情况是非常少见的。
```

> 参考：
>
> https://www.runoob.com/linux/linux-comm-netstat.html

### top

实时显示 process 的动态 CPU占有率等

```
如何添加增加展示的属性？
1.top
2.f（进入属性选择列表）
3.p（选中swp，拿swap举例，其他类似）
4.回车

如何按指定属性排序？
1.top
2.shift + f (进入属性选择列表)
3.p（选中swp，拿swap举例，其他类似）
4.回车

top -p 139 
显示指定进程的状态

top -c
显示完整命令

top -H 显示线程

P：按照cpu使用率来排序
M：按照内存来排序

top -H -p 15436
实时显示进程15436下所有线程状况
Tasks: 102 total,   0 running, 102 sleeping,   0 stopped,   0 zombie
Cpu(s): 15.7%us,  2.7%sy,  0.0%ni, 81.5%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:  65940140k total, 48233180k used, 17706960k free,   345604k buffers
Swap: 12582904k total,        0k used, 12582904k free,  7675716k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                       15436 work      20   0 5473m 2.5g  19m S  0.0  4.0   0:00.00 java                         15448 work      20   0 5473m 2.5g  19m S  0.0  4.0   0:26.85 java                         15449 work      20   0 5473m 2.5g  19m S  0.0  4.0   0:00.87 java                         15450 work      20   0 5473m 2.5g  19m S  0.0  4.0   0:00.82 java                         15451 work      20   0 5473m 2.5g  19m S  0.0  4.0   0:00.85 java
  
  进入top，再按1显示每个cpu的使用信息。
  
us — 用户空间占用CPU的百分比。
sy — 内核空间占用CPU的百分比。
ni — 改变过优先级的进程占用CPU的百分比
id — 空闲CPU百分比
wa — IO等待占用CPU的百分比
hi — 硬中断（Hardware IRQ）占用CPU的百分比
si — 软中断（Software Interrupts）占用CPU的百分比

列的含义：

序号  列名    含义
a    PID     进程id
b    PPID    父进程id
c    RUSER   Real user name
d    UID     进程所有者的用户id
e    USER    进程所有者的用户名
f    GROUP   进程所有者的组名
g    TTY     启动进程的终端名。不是从终端启动的进程则显示为 ?
h    PR      优先级
i    NI      nice值。负值表示高优先级，正值表示低优先级
j    P       最后使用的CPU，仅在多CPU环境下有意义
k    %CPU    上次更新到现在的CPU时间占用百分比
l    TIME    进程使用的CPU时间总计，单位秒
m    TIME+   进程使用的CPU时间总计，单位1/100秒
n    %MEM    进程使用的物理内存百分比
o    VIRT    进程使用的虚拟内存总量，单位kb。VIRT=SWAP+RES
p    SWAP    进程使用的虚拟内存中，被换出的大小，单位kb。
q    RES     resident memory usage 常驻内存，进程使用的、未被换出的物理内存大小，单位kb。RES=CODE+DATA
r    CODE    可执行代码占用的物理内存大小，单位kb
s    DATA    可执行代码以外的部分(数据段+栈)占用的物理内存大小，单位kb
t    SHR     共享内存大小，单位kb
u    nFLT    页面错误次数
v    nDRT    最后一次写入到现在，被修改过的页面数。
w    S       进程状态(D=不可中断的睡眠状态,R=运行,S=睡眠,T=跟踪/停止,Z=僵尸进程)
x    COMMAND 命令名/命令行
y    WCHAN   若该进程在睡眠，则显示睡眠中的系统函数名
z    Flags   任务标志，参考 sched.h
```

> 参考：
>
> https://mp.weixin.qq.com/s/eNvm8N\_tY9T6qpN3UKb1XQ

### 包管理

apt-get install package-name 安装软件包

apt-cache search package-name 搜索软件源中可安装的软件包

apt-get update 更新软件列表

apt-get upgrade 更新软件

apt-get remove package-name 卸载软件

apt-get remove --purge package-name 卸载并清除配置

apt-cache madison package-name 列出所有版本

apt-get install package=version 安装指定版本

### 解压&压缩

解压：tar -zxvf eg：tar -zxvf jdk-8u101-linux-x64.tar.gz

压缩：tar -zcvf eg: tar -zcvf test.tar.gz test

解压zip：unzip test.zip

### find命令

find ./ -name {fileName} 当前位置根据name查找某个文件

find -maxdepth 查找的最大深度。eg：find . -maxdepth 2 -name "Wuziqi.class"

find -type 查找某一类型的文件，eg：d：目录；l -：符号链接文件；f：普通文件。\[默认啥类型的都查找]

### grep

```shell
# 在当前目录以及子目录查找字符串timeline
grep -r "timeline" ./
# 查询字符串，显示带上行号
grep -n "tiemline" TimeLine.log
# 显示匹配行数的上下几行
grep -C 5 foo file 显示file文件里匹配foo字串那行以及上下5行
grep -B 5 foo file 显示foo及前5行
grep -A 5 foo file 显示foo及后5行
# 只显示匹配部分
grep -o "test" test.log
# 不显示匹配的文件名
grep -h "test" test.log
# 匹配正则 -E或者-P [https://blog.csdn.net/yufenghyc/article/details/51078107]
grep -E "start*" test.log
# 或
grep -E '123|abc' test.log
# 不包含
grep -v "string"
# 不区分大小写
grep -i "string"
# 只显示匹配的前x行（grep -m 1表示只显示第一行）
grep -m 1 "string"

# 在指定的文件类型中查找
find -name "*.c" | xargs grep "aaa"
# 有的时候查询会报是二进制文件，可以使用-a解决
grep -a string file.log
```

### ln软链接

创建软链接

```shell
# 在当前目录创建一个软链接HTTPConten，指向/var/www/html
ln -s /var/www/html httpContent
```

### 环境变量

```shell
# 查看所有的环境变量
export
# 查看指定的环境变量
echo $PATH
```

### which

查找某个命令所在的绝对路径，比如：

```shell
which java
/home/wangjun/jdk1.8.0_181/bin/java
which sudo
/usr/bin/sudo
```

### whereis

查找特定目录下符合条件的文件，比如：

```shell
whereis java
java: /usr/share/java /usr/share/man/man1/java.1.gz
# 以上输出信息从左至右分别为查询的程序名、java路径、java的man 手册页路径。
```

### wget

下载命令，用法：wget {url}

### 光标移动删除

ctrl + k      删除光标后面所有字符

ctrl + u      删除光标前面所有字符

ctrl + y      恢复ctrl+u上次执行时删除的字符

ctrl + a      将光标移动到命令行开头

ctrl + e      将光标移动到命令行结尾处

ctrl + w 向后删除一个单词

option + f 向前移动一个单词

option + b 向后移动一个单词

### 查看内存占用情况

```shell
# 第一种方式
cat /proc/meminfo
MemTotal:        1017788 kB
MemFree:          357644 kB
Buffers:            7096 kB
Cached:            68120 kB
SwapCached:            0 kB
Active:           544024 kB
Inactive:          65336 kB
Active(anon):     534148 kB
Inactive(anon):     9848 kB
Active(file):       9876 kB
Inactive(file):    55488 kB
......
# 第二种方式，free命令是一个快速查看内存使用情况的方法，它是对 /proc/meminfo 收集到的信息的一个概述。
free -h
             total       used       free     shared    buffers     cached
Mem:          993M       657M       336M       9.6M       9.3M        76M
-/+ buffers/cache:       571M       422M
Swap:           0B         0B         0B

【解释】
total：总内存大小。
used：已经使用的内存大小(这里面包含cached和buffers和shared部分)。
free：空闲的内存大小。
shared：进程间共享内存(一般不会用，可以忽略)。
buffers：要写到磁盘的东西在内存写完先缓存起来，这样快速响应请求，后面数据再定期刷到磁盘上。
cached：内存中读完缓存起来内容占的大小(这部分是为了下次查询时快速返回，省去了寻址等过程)。

-/+ buffers/cache看做两部分：
-buffers/cache：正在使用的内存大小(注意不是used部分，因为buffers和cached并不是正在使用的，组织和人民需要是它们是可以释放的)，其值=used-buffers-cached。
+buffers/cache：可用的内存大小(同理也不是free表示的部分)，其值=free+buffers+cached。

# 第三种方式，查看每个进程的内存情况
ps命令可以实时的显示各个进程的内存使用情况。Reported memory usage information includes %MEM (percent of physical memory used), VSZ (total amount of virtual memory used), and RSS (total amount of physical memory used)。你可以使用 “–sort”选项对进程进行排序，例如按RSS进行排序：

$ ps aux --sort -rss
```

### 查看CPU核数

```shell
# 总核数 = 物理CPU个数 X 每颗物理CPU的核数 
# 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数

# 查看物理CPU个数
cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l

# 查看每个物理CPU中core的个数(即核数)
cat /proc/cpuinfo| grep "cpu cores"| uniq

# 查看逻辑CPU的个数
cat /proc/cpuinfo| grep "processor"| wc -l
```

### 权限控制

```shell
# 将文件所有权付给group用户组下的user用户
chown user:group file1.txt

# 更改读写执行权限
# 所有人可读
chmod ugo+r file1.txt #u:user,g:group,o:others,r:read
# 所有人可读取
chmod a+r file1.txt
将文件file1.txt 与 file2.txt设为拥有者，同群体用户可写入，但其他以外的人则不可写入 :
chmod ug+w,o-w file1.txt file2.txt
# 也可以使用数字
r=4，w=2，x=1
若要rwx属性则4+2+1=7；
若要rw-属性则4+2=6；
若要r-x属性则4+1=5。
chmod ug=rwx,o=x file
和
chmod 771 file
效果一样

# 将文件夹及其所有子文件夹和文件赋予权限777
chmod -R 777 folder
```

### lsof

List open files。是一个列出当前系统打开文件的工具，因为在Linux下任何事物都以文件的形式存在，所以lsof打开的文件可以是：普通文件、目录、网络文件系统的文件、字符或设备文件、（函数）共享库、管道、符号链接、网络文件(网络Socket等)还有其他类型的文件等。

```shell
# 查看端口被哪个进程占用
lsof -i:14814
# 查看文件被哪个进程打开
sudo lsof test.log
# 查看当前目录所有文件的占用情况
lsof +d ./
# 查看被删除文件的占用进程
lsof|grep del

# 命令参数：
-a 列出打开文件存在的进程
-c<进程名> 列出指定进程所打开的文件
-g  列出GID号进程详情
-d<文件号> 列出占用该文件号的进程
+d<目录>  列出目录下被打开的文件
+D<目录>  递归列出目录下被打开的文件
-n<目录>  列出使用NFS的文件
-i<条件>  列出符合条件的进程。（4、6、协议、:端口、 @ip ）
-p<进程号> 列出指定进程号所打开的文件
-u  列出UID号进程详情
-h 显示帮助信息
-v 显示版本信息

参考：
https://www.cnblogs.com/peida/archive/2013/02/26/2932972.html
```

### 查看网络带宽dstat -nt

```shell
# 每一秒统计一次，第一列是入网速度，第二列是出网速度
dstat -nt
-net/total- ----system----
 recv  send|  date/time   
   0     0 |27-11 16:05:32
1287k  384k|27-11 16:05:33
1618k  350k|27-11 16:05:34
 907k  255k|27-11 16:05:35
 413k  294k|27-11 16:05:36
 327k  353k|27-11 16:05:37
```

### tcpdump抓包

```shell
#-s 0 : 抓取数据包时默认抓取长度为68字节。加上-s 0 后可以抓到完整的数据包 
# -X 当分析和打印时, tcpdump 会打印每个包的头部数据, 同时会以16和ASCII码形式打印出每个包的数据(但不包括连接层的头部).这对于分析一些新协议的数据包很方便.
# 'tcp dst port 8080'是tcpdump条件表达式，表示过滤出目的端口是本机8080的tcp协议数据包
sudo tcpdump -s 0 -X 'tcp dst port 8080'
# 保存成文件，可以使用wireshark分析
sudo tcpdump -s 0 -X 'tcp dst port 8080' -w test.log
```

> 参考：
>
> https://www.cnblogs.com/Jtianlin/p/4330723.html

### 查找历史命令

```shell
# history：显示历史执行命令，可以配合grep使用
# 按下Ctrl + r进入命令搜索模式，输入搜索的命令，如果有多个匹配到，再次按Ctrl + r向上查找。
```

### du 查看大小

```
# 列出当前目录下所有目录和文件的大小
du -sh *
# 列出大小并排序
du -sh *|sort -hr
# 查看当前文件夹所有文件总大小
du -s ./
# 列出当前目录下所有目录和子目录的大小
du
# 列出当前目录下所有目录的大小（不包括子目录）
du --max-depth=1
```

### nc

```shell
# 监听端口数据,只能监听没被使用的端口
nc -l 11317
# 巧用：可以用来传送文件
# 1.在被接收方开一个端口进行监听数据,并将数据写入文件
nc -l 3456 > test.log
# 2.在发送方将数据写入目标的ip,port
nc 10.235.111.248 3456 < test.log
# 查看端口是否启动
nc -z 127.0.0.1 9429
Connection to localhost 9429 port [tcp/*] succeeded!
```

### !号的妙用

```shell
# 使用history会列出历史命令，每条命令前面有个数字，使用! + 数字就可以执行历史命令，例如
$ history | grep export
 1573  export NAMESRV_ADDR=localhost:9876
 2001  history | grep export
wangjun@iZ94pe2uk6bZ:~$ !1573
export NAMESRV_ADDR=localhost:9876
# 执行上一条命令
!!
# 在上一条命令之前加参数
$  /opt/user/test.txt  #忘记输入more
$  more !!      #这样是不是快多了？
# !$表示上条命令的最后一个参数，!^表示上条命令的第一个参数

# 执行上一条以关键字开头的命令
$ !find  #执行上条以find开头的命令


```

### 行数统计 wc

```shell
# testfile文件的统计信息  
wc testfile           
3 92 598 testfile       # testfile文件的行数为3、单词数92、字节数598 
# 统计三个文件
wc testfile testfile_1 testfile_2
3 92 598 testfile                    #第一个文件行数为3、单词数92、字节数598  
9 18 78 testfile_1                   #第二个文件的行数为9、单词数18、字节数78  
3 6 32 testfile_2                    #第三个文件的行数为3、单词数6、字节数32  
15 116 708 总用量                    #三个文件总共的行数为15、单词数116、字节数708

# grep + wc 统计此文件匹配的行数
grep "thread:Thread-" file.log*|wc -l

-c或--bytes或--chars 只显示Bytes数。
-l或--lines 只显示行数。
-w或--words 只显示字数。
```

### dmesg

查看core信息，一般有进程挂掉，dmesg会记录此信息。

### 查看某个进程使用的环境变量

vim /proc/{进程号}/environ

### pstree显示线程

以树状图的方式展现进程之间的派生关系，显示效果比较直观。

```shell
# 显示进程下面的线程
pstree -p 23304
```

### dig

dig命令主要用来从DNS域名服务器查询主机地址信息。

```shell
$ dig miliao.com

; <<>> DiG 9.9.5-3ubuntu0.2-Ubuntu <<>> miliao.com  ## 1：显示dig命令的版本和输入参数
;; global options: +cmd
;; Got answer:  ## 2：显示返回的一些详情，比如status的值为NOERROR，表示查询成功
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 48542
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:  ## 3：QUESTION SECTION显示我们要查询的域名
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;miliao.com.			IN	A

;; ANSWER SECTION:  ## 4：查询结果
miliao.com.		600	IN	CNAME	orig.sc.g.mi.com.  ## 分别表示要解析的地址，TTL(缓存时间) ，查询类，类型，解析到的地址
orig.sc.g.mi.com.	600	IN	A	36.110.204.140

;; Query time: 36 msec ## 5：本次查询的一些统计信息，比如用了多长时间，查询了哪个 DNS 服务器，在什么时间进行的查询等等。
;; SERVER: 100.100.2.138#53(100.100.2.138)
;; WHEN: Mon Jul 08 15:50:22 CST 2019
;; MSG SIZE  rcvd: 82
```

参考：[https://www.cnblogs.com/sparkdev/p/7777871.html](https://www.cnblogs.com/sparkdev/p/7777871.html)

### wall 同步信息

```shell
# wall + 字符串可以将字符串发给给同时登陆同一台机器的其他人
wall "test"
# 或者
echo "test"|wall
```

### scp

远程拷贝命令

```shell
# 将本地文件test.log拷贝到远程机器的work目录下面
scp test.log wangjun@10.235.111.248:/home/wangjun/work
```

### tldr(需要安装)

tldr全称Too long, Don’t read，翻译成中文就是\[太长不读]。`tldr`根据二八原则将命令的常用场景给出示例，让人一看就懂。

```shell
# mac上安装，只需要执行一行
brew tap tldr-pages/tldr && brew install tldr
# 查看 netstat命令
```

### awk

awk是一个强大的文本分析工具。

```shell
# 每行按空格或TAB分割，输出文本中的1、4项
awk '{print $1,$4}' log.txt
# 格式化输出
awk '{printf "%-8s %-10s\n",$1,$4}' log.txt
# 使用","分割
awk -F, '{print $1" "$2}' log.txt
# 设置变量
awk -va=1 '{print $1,$1+a}' log.txt
# 根据逗号分割打印出所有的字段
awk -F, '{for(i=1;i<=NF;i++)print $i}' log.txt
```

### xargs

xargs 是给命令传递参数的一个过滤器，也是组合多个命令的一个工具。xargs 是一个强有力的命令，它能够捕获一个命令的输出，然后传递给另外一个命令。

比如：

```shell
# 先找到一个java进程然后杀死
jps -l|grep 'test'|awk '{print $1}'|xargs kill -9
```

> 参考：
>
> [https://www.runoob.com/linux/linux-comm-xargs.html](https://www.runoob.com/linux/linux-comm-xargs.html)

### sort

sort命令用于将文本文件内容加以排序。

```shell
# 默认以ASCII码来排序
# -n 依照数值的大小来排序
# -r 倒叙（默认正序）
# -k n 以第几列来排序
```

### uniq

uniq 命令用于检查及删除文本文件中重复出现的行列，一般与 sort 命令结合使用。

```shell
# -c 在每列旁显示该行重复出现的次数
```

**注意：** 只能合并相邻的相同数据，比如下面的数据：

```
1
1
2
2
3
1
```

uniq后为：

```shell
1
2
3
1
```

所以一般是先sort排序，之后再用uniq。

eg:

```shell
grep "Greet     \] GreetReq:" spp_worker1.20190421.log* |grep -oE "userId.*" | awk -F, '{print $1" "$2}' | awk '{print $4}' > greet.csv
sort greet.csv | uniq -c | sort -n -k 1  > sort.csv
```

### who

查看当前登录客户端的用户都有哪些

```shell
wangjun@iZ94pe2uk6bZ:~# who
wangjun  pts/0        2019-05-14 17:01 (106.39.75.134)
wangjun  pts/1        2019-05-14 17:14 (106.39.75.134)
## 显示标题
wangjun@iZ94pe2uk6bZ:~# who -H
NAME     LINE         TIME             COMMENT
wangjun  pts/0        2019-05-14 17:01 (106.39.75.134)
wangjun  pts/1        2019-05-14 17:14 (106.39.75.134)
## 只显示自己
wangjun@iZ94pe2uk6bZ:~# who -m
wangjun  pts/0        2019-05-14 17:01 (106.39.75.134)
## 精简显示
wangjun@iZ94pe2uk6bZ:~# who -q
wangjun wangjun
# users=2
```

这个时候如果需要强制踢人下线则可以使用pkill：

```shell
wangjun@iZ94pe2uk6bZ:~# pkill -kill -t pts/1
```

### 查看二进制文件

```shell
hd 文件名
# centos下使用hexdump
hexdump 文件名
# od命令，od命令用于将指定文件内容以八进制、十进制、十六进制、浮点格式或ASCII编码字符方式显示
od -c file # ASCII字符或者反斜杠
od -x file # 16进制
od -o 或者 od file # 8进制
od -d file # 10进制
```

### nmap查看端口

nmap是一款网络扫描和嗅探工具，可以扫描目标机器有哪些端口是open状态。

```shell
# 需要安装
apt-get install nmap
# 扫描端口
nmap {ip}
```

> 参考：
>
> https://www.cnblogs.com/freeweb/p/6903915.html

### crontab定时任务

常用命令：

```shell
crontab [-u username]　　　　//省略用户表表示操作当前用户的crontab
    -e      (编辑工作表)
    -l      (列出工作表里的命令)
    -r      (删除工作作)
```

我们用**crontab -e**进入当前用户的工作表编辑，是常见的vim界面。每行是一条命令。crontab的命令构成为 时间+动作，其时间有**分、时、日、月、周**五种，操作符有

* \*\*\*\*\* 取值范围内的所有数字
* **/** 每过多少个数字
* **-** 从X到Z
* \*\*，\*\*散列数字

比如我们写一个定时任务，每1分钟清空一次test文件夹里面的所有文件。

```shell
crontab -e
# 进入编辑界面，输入
*/1 * * * * rm -rf /home/wangjun/test/test/*
# 保存即可
```

> 参考：
>
> https://www.runoob.com/w3cnote/linux-crontab-tasks.html

### 命令执行挂起终止

* Ctrl+C：终止一个正在执行的命令
* Ctrl+Z：将一个正在前台执行的命令放到后台，并处于暂停状态
* jobs：查看当前有多少在后台运行的命令。`jobs -l`选项可显示所有任务的PID，jobs的状态可以是running, stopped, Terminated。但是如果任务被终止了（kill），shell 从当前的shell环境已知的列表中删除任务的进程标识。
* fg：将后台中的命令调至**前台**继续运行。如果后台中有多个命令，可以用fg %jobnumber（是命令编号，不是进程号）将选中的命令调出。
* bg：将一个在后台暂停的命令，变成在**后台**继续执行。如果后台中有多个命令，可以用bg %jobnumber将选中的命令调出。
*   kill：终止进程

    * 方法1：通过jobs命令查看job号（假设为num），然后执行kill %num
    * 方法2：通过ps命令查看job的进程号（PID，假设为pid），然后执行kill pid

    前台进程的终止：Ctrl+c
* nohup：如果让程序始终在后台执行，即使关闭当前的终端也执行（之前的&做不到），这时候需要nohup。该命令可以在你退出帐户/关闭终端之后继续运行相应的进程。关闭中断后，在另一个终端jobs已经无法看到后台跑得程序了，此时利用ps（进程查看命令）

> 参考：
>
> https://www.cnblogs.com/kaituorensheng/p/3980334.html

### curl

```shell
# GET请求
curl {url}
# POST请求
curl -d "user=admin&passwd=12345678" {url}
# TRACE请求 -X 执行HTTP 方法 -v 显示多的信息
curl -v -X {url}
```

### file显示文件类型

可以通过file命令查询文件位数，64位或者32位

```shell
$ file libhadoop.so.1.0.0 
libhadoop.so.1.0.0: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=2c6a0dae993e827ec637437f921b30279487049c, with debug_info, not stripped

# 显示文件MIME类型
$ file -i start.sh 
start.sh: text/x-shellscript; charset=us-ascii
```

### 计算器bc

```shell
bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'. 
1+1
2
# 设计小数点位数，默认为0
scale=3
```

### locate

locate命令其实是"find -name"的另一种写法，但是要比后者快得多，原因在于它不搜索具体目录，而是搜索一个数据库（/var/lib/locatedb），这个数据库中含有本地所有文件信息。Linux系统自动创建这个数据库，并且每天自动更新一次，所以使用locate命令查不到最新变动过的文件。为了避免这种情况，可以在使用locate之前，先使用`updatedb`命令，手动更新数据库。

### date

```shell
# 显示时间
date
# 当前时间转时间戳（秒）
date +%s
# 时间戳转时间
date -d @1587450784
【mac系统】date -r 1587450784
```

### file

```shell
# 确定文件类型
# 可执行文件
$ file test_tool 
test_tool: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, not stripped
# 二进制文件
$ file 200988.dump 
200988.dump: data
# ASCII 文本文件
$ file test.log 
stat.log: ASCII text
```

### 分析二进制

[https://mp.weixin.qq.com/s/Se5hTxB9Li4aq9QAhhMK4g](https://mp.weixin.qq.com/s/Se5hTxB9Li4aq9QAhhMK4g)

### kill

```shell
# kill -9 pid 和 kill -15 pid的区别：kill后面跟数字其实是一个信号量，可以执行kill -l来查看kill支持的所有信号量。
$ kill -l
 1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL	 5) SIGTRAP
 6) SIGABRT	 7) SIGBUS	 8) SIGFPE	 9) SIGKILL	10) SIGUSR1
11) SIGSEGV	12) SIGUSR2	13) SIGPIPE	14) SIGALRM	15) SIGTERM
16) SIGSTKFLT	17) SIGCHLD	18) SIGCONT	19) SIGSTOP	20) SIGTSTP
21) SIGTTIN	22) SIGTTOU	23) SIGURG	24) SIGXCPU	25) SIGXFSZ
26) SIGVTALRM	27) SIGPROF	28) SIGWINCH	29) SIGIO	30) SIGPWR
31) SIGSYS	34) SIGRTMIN	35) SIGRTMIN+1	36) SIGRTMIN+2	37) SIGRTMIN+3
38) SIGRTMIN+4	39) SIGRTMIN+5	40) SIGRTMIN+6	41) SIGRTMIN+7	42) SIGRTMIN+8
43) SIGRTMIN+9	44) SIGRTMIN+10	45) SIGRTMIN+11	46) SIGRTMIN+12	47) SIGRTMIN+13
48) SIGRTMIN+14	49) SIGRTMIN+15	50) SIGRTMAX-14	51) SIGRTMAX-13	52) SIGRTMAX-12
53) SIGRTMAX-11	54) SIGRTMAX-10	55) SIGRTMAX-9	56) SIGRTMAX-8	57) SIGRTMAX-7
58) SIGRTMAX-6	59) SIGRTMAX-5	60) SIGRTMAX-4	61) SIGRTMAX-3	62) SIGRTMAX-2
63) SIGRTMAX-1	64) SIGRTMAX
# -9表示强制杀死进程，-15表示通知进程主动关闭，进程可以监测到，在关闭之前可以做一些事情，比如关闭IO，保存数据，打印日志等操作。
```

我们可以编写一个程序实验一下：

```java
public class Main {

    private static void shutdownCallback() {
        System.out.println("程序马上关闭！");
    }

    public static void main(String[] args) throws InterruptedException {
        Runtime.getRuntime().addShutdownHook(new Thread() {
            @Override
            public void run() {
                shutdownCallback();
            }
        });
        Thread.sleep(100000);
    }
}
```

运行这个程序，然后依次执行kill -15和kill -9，可以看到-15可以输出”程序马上关闭“，-9不能输出：

```shell
kill -15 30397
程序马上关闭！

Process finished with exit code 143 (interrupted by signal 15: SIGTERM)

 kill -9 30447
 
Process finished with exit code 137 (interrupted by signal 9: SIGKILL)
```

PS：`kill -15 pid`等价于`kill pid`。

### head/tail 只显示结果的n行

```shell
# 只显示结果的第一行
grep "String" test.log|head -n 1
# 只显示结果的倒数第一行
grep "String" test.log|tail -n 1
```

### printf

```shell
# 10进制转16进制
$ printf %x 109630
1ac3e$
# 换行 \n
printf '%x\n' 109630
1ac3e
# 转十进制：%d，转八进制：%o
```

### cut

```shell
# 截取字符串
abcd
cut -b 1
# 输出a
cut -b 1,3
# 输出ac
cut -b 1-3
# 输出abc
```

### watch 循环执行某个命令

```shell
# 每隔2s显示时间，-d 变更的内容高亮显示
watch -d date
# 每隔1s显示文件的信息，-n {x} 每x秒执行一次
watch -d -n 1 ls -l test.log
```

### uptime 显示系统平均负载

```shell
$ uptime
14:37:28 up 1 day,  3:00,  1 user,  load average: 0.25, 0.35, 0.35
# 14:37:28 当前时间
# up 1 day,  3:00 系统运行时间
# 1 user 当前登录用户数
# load average: 0.25, 0.35, 0.35 系统平均负载，分别表示系统内1分，5分，15分的平均负载
# 平均负载：平均负载是指单位时间内，系统处于可运行状态和不可中断状态的平均进程数，也就是平均活跃进程数
```

### swapon swap使用情况

```shell
# 查看swap使用情况（也可以用free）
swapon -s
wangjun@raspberrypi:~ $ swapon -s
Filename				Type		Size	Used	Priority
/var/swap              	file    	102396	0	    -2

#第一列：Swap分区存储设备的名称或分区的位置
#第二列：表示存储分区类型
#第三列：表示Swap分区的总容量
#第四列：表示Swap分区的使用情况
#第五列：表示将被使用的优先级

```
