1. 帮助文档

很多命令或程序都会通过执行的参数来展示参考文档,如命令加上 -h 或者 –help。

man

查看命令的参考文档

man <cmd>

info

查看命令的参考文档

info <cmd>

2. 命令

sh/bash

使用sh或bash执行脚本

-n 检查语法

-x 调试,打印执行过程语句

sh a.sh
bash a.sh

ssh

登录远程机器

-p port 指定端口,默认端口22

-o stricthostkeychecking=no 首次登陆免输yes登录

-i file 使用密钥文件

ssh <user>@,ip>
ssh <user>@<ip>:<path>

# 登录远程机器直接执行命令
ssh <use>r@<ip> <cmd>

sshpass

执行执行命令时,明文指定密码。如登陆远程服务器,远程执行命令或脚本,文件跨机器复制。

-p passwd 密码

sshpass -p <passwd> <cmd>

# 登陆远程服务器
sshpass -p '123456' ssh root@192.168.1.2

# 远程执行命令或脚本
sshpass -p '123456' ssh root@192.168.1.2 "touch a.txt"

# 文件跨机器复制
sshpass -p '123456' scp a.txt root@192.168.1.2:/data/

ssh-keygen

创建ssh key

公钥:~/.ssh/id_rsa.pub

私钥:~/.ssh/id_rsa

-f ~/.ssh/id_rsa 指定密钥文件名

-C “comment” 设置注释

ssh-keygen -t rsa

# 将公钥发送给远程机器
ssh-copy-id <user>@<ip>

exit

退出当前shell

exit

type

查看命令是程序还是alias还是shell关键字

-a 列出所有

type <cmd>

whatis

命令介绍

whatis <cmd>

whereis

显示命令、用户手册、源代码的位置

-b 仅二进制文件

-s 仅源代码

whereis <cmd>

which

查找命令的位置

which <cmd>

alias

命令别名

# 设置命令别名
alias l='ls -l'

# 查看命令别名
alias l

unalias

取消命令别名

unalias <name>

declare

声明变量

-a 数组

-i 整型

-x 全局变量

-r 只读

declare <var>=<value>

export

声明全局变量,在子进程也可用

export <var>=<value>

nohup

后台运行命令,忽略挂起信号

标准输出默认为 nohup.out

nohup <cmd> &

# 重定向标准输出和异常输出
nohup <cmd> & >> a.log 2>&1

xargs

将标准输入分隔,依次作为后面命令的参数执行。通常接在管道后面,将其标准输出作为标准输入。

-t 打印命令和输出

-p 在每次执行命令时提示用户确认

# 打印文件的每一行
cat a.txt | xargs echo

# 查看目录中所有文件的类型
ls | xargs file

# 找出所有文件中包含某个字符串的文件
find . -name '*.cpp' | xargs grep 'stdlib.h'

watch

定期执行命令并输出结果

-n x 指定间隔x秒

-d 高亮显示输出差异

-t 不显示标题

watch <cmd>

history

查看历史命令

-c 删除当前shell命令记录

history

# 查看最近n条
history n

3. 系统

env

查看环境变量

env

uname

操作系统名

-a Linux内核版本

uname

lsb_release

LSB版本信息

-a 操作系统信息

lsb_release

查看操作系统信息。

cat /etc/os-release

hostname

机器名

hostname

shutdown

关机,默认1分钟后

-h +n/20:00/now 设置时间

-r 重启

-c 取消

shutdown

poweroff

关机

poweroff

reboot

重启

reboot

passwd

修改密码

# 修改当前用户密码
passwd

# 修改指定用户密码
passwd <user>

service

系统服务管理

# 查看所有服务状态
service --status-all

# 查看服务状态
service <serv> status

# 启动服务
service <serv> start

# 关闭服务
service <serv> stop

# 重启服务
service <serv> restart

systemctl

系统服务管理

管理的服务可以在 /usr/lib/systemd/system 中查看

# 查看服务状态
systemctl status <serv>

# 启动服务
systemctl start <serv>

# 停止服务
systemctl stop <serv>

# 重启服务
systemctl restart <serv>

# 设置服务开机启动
systemctl enable <serv>

# 取消服务开机启动
systemctl disable <serv>

# 列出当前加载的内容
systemctl list-units # 单元
systemctl list-sockets # socket单元
systemctl list-unit-files # 安装的单元

# 重新加载系统配置
systemctl daemon-reload

ulimit

查看各系统选项的限额

# 查看所有选项
ulimit -a

# 设定某个限额
ulimit -<option> n

# 不限制core文件大小,用于生成core文件进行分析
ulimit -c unlimited

timedatectl

查看和设置时区

# 查看系统时区,如 Asia/Shanghai (CST, +0800)
timedatectl

# 列出所有时区
timedatectl list-timezones

# 设置时区,使用一个可用的时区名称
sudo timedatectl set-timezone Asia/Shanghai

4. 工具

sleep

等待一段时间

# 等待n秒
sleep n

date

系统时间

+‘format’ 格式化时间

format:

  • %Y 年
  • %m 月
  • %d 日
  • %H 时
  • %M 分
  • %S 秒
  • %s 时间戳
  • %N 一秒内的纳秒数

-s time 设置时间

-d time 显示指定时间

time:

  • @1691660040 时间戳
  • 2017-03-08 12:00:00 日期加时间
  • 1 day ago
  • 2 hour
  • 3 minute
date

# 格式化时间
date +'%Y-%m-%d %H:%M:%S'

# 时间戳
date +%s

time

计算命令执行的时间

-o FILE 将结果输出文件

-a 追加到文件

-f FORMAT 设置结果显示格式

time <命令>

cal

日历

cal

bc

计算器

bc

dos2unix

去掉Windows的格式符

dos2unix <file>

md5sum

计算文件md5

md5sum <file>

5. 库文件

ldd

查看动态库依赖的库

ldd lib.so

readelf

显示elf文件的信息

-a 全部信息,等价于 -h -l -S -s -r -d -V -A -I

-h 头文件

-l 程序头

-S 节头

-s 符号表段的项

-r 可重定位段

-d 动态段

-V 版本段

-A CPU架构

-I 符号柱状图

readelf lib.so
readelf lib.a
readelf <exe>

# 查看执行文件所依赖的库
readelf -d exe | grep 'NEEDED'

strace

跟踪系统调用

-e trace= 只跟踪指定调用,如open,close,rean,write,file,process等

-e signal= 指定系统信号

-o file 输出写到文件

-p pid 指定进程

-u user 指定用户

strace <exe>

6. 进程

top

进程面板

-p pid 只显示该进程,可以带多个

-H 线程模式

内部指令:

  • M 按内存排序
  • P 按CPU排序
  • T 按CPU时间排序
  • c 显示命令/完整命令行
  • i 忽略闲置和僵死进程
  • 1 展示多cpu
  • m 切换内存展示行
  • s 更改刷新周期
  • q 退出
top
# Mc 按内存排序且显示完整命令

uptime

显示系统运行时间和平均负载。

-p 简化展示更易读

-s 系统最后一次启动时间

uptime

ps

进程列表

-ef 所有进程

-aux 所有进程,包括进程线程状态

-aL 查看轻量级进程

-l 详细信息

ps -ef

pstree

打印进程树

-p pid 指定进程

# 所有进程的进程树
pstree

# 指定进程及其子进程
pstree -p 1234

pgrep

根据进程名称查找进程id

-l 列出进程id和名称

-a 列出进程id和执行命令

-c 只输出匹配的进程数量

pgrep <process>

jobs

当前终端在后台运行的进程

-l 显示pid

jobs

fg

将进程转为前台运行

fg <jobid>

bg

将进程转为后台进行

bg <jobid>

free

内存占用,默认单位是 KB

-h 大小转为合适单位

-b B单位

-k KB单位

-m MB单位

-g GB单位

free

vmstat

查看虚拟内存情况。

-a 活跃和不活跃的内存

-f 启动以来创建的进程数量

-s 各种事件统计

-d 磁盘统计

-t 显示当前时间

vmstat

mpstat

显示每个 CPU 的占用情况。

-P <n> 指定监控的CPU,序号从 0 开始,ALL 表示监控所有 CPU

# 监控所有 CPU
mpstat -P ALL

# 设置采样间隔
mpstat -P ALL 1

# 设置采样间隔和采样次数
mpstat -P ALL 1 10

pidstat

显示每个进程的 CPU 使用情况。

-C <name> 只显示名字匹配的进程,可以用正则表达式

-d 显示磁盘读写速度

-l 显示程序的完整执行路径和参数

-r 显示内存页需从磁盘加载数量和虚拟内存信息

-s 显示堆栈信息

-w 显示进程上下文切换速度

pidstat

# 设置采样间隔
pidstat 1

# 设置采样间隔和采样次数
pidstat 1 10

sar

监控系统的 CPU、内存、磁盘。

-A 所有方面的情况

-u CPU负载情况

-d 硬盘使用情况

-r 内存使用情况

-b 缓冲区使用情况

-v 内核表统计信息

-q 运行列表的进程统计情况

-B 内存分页情况

-w 系统交换活动状态

-n DEV/EDEV/SOCK/FULL 网络运行状态

sar

# 设置采样间隔
sar 1

# 设置采样间隔和采样次数
sar 1 10

kill

向进程发送信号,默认信号15(SIGTERM,自行停止)

-n 指定信号

-l 列出信号

# 杀死进程
kill -9 <pid>

# 列出信号
kill -l

killall

根据进程名杀死进程

killall <process>

lsof

列出打开的文件

-p <pid> 指定进程开启的文件

-c <进程名> 指定进程开启的文件

-i <条件> 符合条件的进程

+d <dir> 目录下当前一层被进程开启的文件

+D <dir> 目录下所有层被进程开启的文件

-u uid/user 该用户打开的文件

# 列出打开文件的进程
lsof <file>

# 列出进程打开的文件
lsof -p <pid>

# 列出所有打开的端口
lsof -i

# 列出端口被哪些进程占用
lsof -i:<port>

fuser

查看文件或 socket 被哪些进程使用

-u 同时展示用户名

-v 显示详细信息

-k 关闭使用该文件的进程

fuser a.log

7. 网络

netstat

查看网络连接

-t tcp连接

-u udp连接

-l 监听中的连接

-a 全部监听和未监听的连接

-n 展示数字形式的ip地址

-p 展示pid和程序名称

netstat -tunap

# 查看监听中的端口
netstat -tunap | grep LISTEN

ifconfig

查看网络接口

ifconfig

ping

发送IP数据包,测试网络连通

ping <ip>
ping <hostname>

nmap

扫描网络中的所有主机

-sn 表示用 ping 扫描,每个活动主机的 IP 地址和 ping 延迟都会被列出来

-sT tcp扫描

-sU udp扫描

-sS syn扫描

-sA ack扫描

–script=FILE 执行指定脚本

nmap 目标

# 使用 ping 扫描
nmap -sn 192.168.0.0/24

traceroute

跟踪数据到达主机所经路由

traceroute <ip>
traceroute <hostname>

nc

连接与监听TCP/UDP

nc <ip> <port>

curl

下载URL的内容,默认输出到命令行。

> file 内容保存到文件

-o file 内容保存到文件

-O 根据url中的文件名保存

-H 添加HTTP请求的头

-X POST 指定请求方法

-d/–data 指定POST请求的数据体

curl <url>

# 发送 GET 请求
curl -X GET https://example.com/api/endpoint

# 发送 POST 请求,JSON数据
curl -X POST \
  -H "Content-Type: application/json" \
  --data '{"key1":"value1", "key2":"value2"}' \
  https://example.com/api/endpoint
# 发送 POST 请求,表单数据
curl -X POST \
  -H "Content-Type: application/x-www-form-urlencoded" \
  --data "param1=value1&param2=value2" \
  https://example.com/api/endpoint
curl -X POST \
  -F "param1=value1" \
  -F "file=@localfile.txt" \
  https://example.com/upload

wget

下载URL的内容,默认保存到本地文件。

-q 不输出信息

-d 打印调试信息

-o file 输出信息保存到文件

-i file 从文件读取url

-a file 指定日志文件

wget <url>

8. 磁盘

iotop

查看磁盘IO使用情况。

-o 只显示有IO操作的进程

-d n 每n秒刷新一次

-p pid 监控特定进程

-u user 监控特定用户的进程

内部指令:

  • r 改变排序顺序
  • o 只显示有IO操作的进程
  • a 累计使用量/间隔时间内速率
iotop

iostat

查看磁盘操作活动情况。

-c 显示CPU使用情况

-d 显示磁盘使用情况

-k 单位为KB

-m 单位为MB

-N 磁盘阵列LVM信息

-n 显示NFS使用情况

-x 显示更多详细信息

iostat

df

分区磁盘占用

-h 大小转为合适单位

df -h

du

文件磁盘占用

-s 按文件夹汇总

-h 大小转为合适单位

du -sh <dir>

mount

挂载文件系统

-a 按照/etc/fstab的配置挂载

-t type 指定文件系统

mount <设备> <挂载目录>

# 将cdrom驱动器挂载到目录上
mount /dev/hdc /mnt/cdrom

umount

取消挂载

umount <设备/挂载目录>

fdisk

磁盘分区工具

-l 列出各设备的分区表

fdisk <设备>

mkfs

磁盘格式化

-t type 指定文件系统

mkfs <设备>

fsck

磁盘检验

-t type 指定文件系统

-f 强制细化检验

-C 显示进度

fsck <设备>

chmod

设置文件权限

文件权限为三位八进制数字,代表user/group/others的read/write/execute权限,如600表示user拥有read/write权限。

mode:

  • 三位八进制数字,如644
  • +/- r/w/x
  • u/g/o +/- r/w/x

-R 递归设置目录

-f 强制

chmod <mode> <file>

# 给文件指定权限
chmod 644 a.log

# 给文件所有角色增加执行权限
chmod +x a.sh
chmod u+x a.sh

chown

修改文件或文件夹的所有者

-R 递归修改文件夹

chown <user> <file>
chown <group>:<user> <file>

chgrp

修改文件的组

chown <group> <file>

umask

新文件权限的补码

# 查险现在的补码
umask

# 设置补码
umask 022

sync

内存数据写回到磁盘

sync

9. 用户

who

显示有哪些正在登录计算机的用户

who

whoami

显示当前用户的名字

whoami

id

显示用户id和所属群组id

# 获取用户id和群组id
id

# 获取用户id
id -u

su

切换用户,需要root密码。

su 后面添加 - 表示切换用户后,加载该用户的环境变量等设置。

-c 不切换用户,而是直接以该用户执行指定命令

# 切换为root
su

# 切换为root,并将目录切换至/root
su -

# 切换用户
su <user>

# 切换用户,并将目录切换至该 home 目录
su - <user>

# 使用用户执行指定命令
su - <user> -c <cmd>

sudo

使用root权限执行命令,需要当前用户密码。

用户是否拥有该权限的配置在 /etc/sudoers 中。

# 使用root权限
sudo <cmd>

# 切换用户为root
sudo su

# 使用某个用户执行命令
sudo -u <user> <cmd>

useradd

创建用户

useradd <user>

userdel

删除用户

userdel <user>

groupadd

创建组

groupadd <group>

groupdel

删除组

groupdel <group>

usermod

修改用户账户

-u uid 更改用户ID

-d dir 更改登陆目录

-s shell 更改登录的shell

# 把用户加入组
sudo usermod -aG group name

10. 目录

ls

显示目录内容

-a 显示隐藏文件

-l 显示详细信息

-r 逆序展示

-t 按时间排序

-S 按大小排序

-i 显示inode号

-h 大小转为合适单位

-f 取消排序,同时会应用-a,当文件夹文件数量非常大时默认排序会很慢,可以用这个选项

–full-time 完整时间格式

# 显示当前目录
ls

# 显示指定目录或文件
ls <dir>
ls <file>

# 显示当前目录,按修改时间从旧到新排序
ls -lrt

tree

以树形结构显示目录内容,默认是当前目录,也可以指定目录。

tree

cd

进入目录

# 进入$HOME目录
cd

# 进入指定目录
cd <dir>

# 回到前一个目录
cd -

pwd

显示当前目录绝对路径

pwd

dirs

显示目录栈,通过命令切换目录并将目录加入目录栈,以及移除目录栈内容,来记住之前的目录。

# 显示目录栈
dirs

# 目录加入目录栈,切换目录
pushd <dir>

# 移除目录栈顶,切换目录
popd

touch

创建空文件,如果已有文件则会更新时间

touch <file>

mkdir

创建目录

-m MODE 指定权限

-p 如果某一层目录不存在则创建,直到最底层的子目录

mkdir <dir>

rmdir

删除空目录

-p 同时删除空的父目录

-r 删除非空目录

rmdir <dir>

11. 文件

cp

复制文件

-f 强制

-r 复制目录

-p 复制权限和修改时间

-i 覆盖已有文件时提示

cp <file1> <file2>

install

复制文件和目录,并设置文件属性。

-d, –directory 所有参数都作为目录处理,且创建指定目录的所有主目录

-D 创建目标的目录并将文件复制

-g <group>, –group=<group> 设置所属组

-o <user>, –owner=<user> 设置所有者

-m <mode>, –mode=<mode> 设置权限模式

-p, –preserve-timestamps 保留文件的时间属性

-v, –verbose 打印处理的每个文件/目录名称

# 复制文件
install <src> <dst>
install <src>... <dst>
install -t <dst> <src>...

# 设置文件夹
install <option> -d <dir>...

mv

移动文件,重命名。

-f 强制

-i 覆盖已有文件时提示

mv <file1> <file2>

rm

删除文件

-f 强制

-r 删除目录

rm <file>

ln

创建文件链接,默认为硬链接(同文件索引节点)

-s 软连接(索引文件)

# 创建硬链接
ln <oldfile> <newfile>

# 创建软链接
ln -s <oldfile> <newfile>

wc

统计文件的行数、单词数、字节数

-l 行数

-w 单词数

-c 字节数

wc <file>

file

文件类型

-f file 对文件每一行看作文件名查看文件类型

file <file>

stat

查看文件状态,包括大小、inode信息、权限、创建更改访问时间。

stat <file>

find

搜索目录的所有文件。当目录中有大量文件时,ls 统计全部文件可能会很卡和出现大量打开错误,这时候可以使用 find 来替代。

! 取反

-a 且

-o 或

-name file 文件名

-iname file 文件名,不区分大小写

-mtime n/+n/-n 改动时间等于/大于/小于n天

-atime n 访问时间

-size n/+n/-n 文件大小等于/大于/小于n,指定单位

-inum <inode> 查询文件inode

# 列出目录下所有文件
find <dir>

# 按文件名搜索文件,支持通配符
find <dir> -name *.log

# 搜索1天内修改的文件
find <dir> -mtime -1

# 搜索大于1GB的文件
find <dir> -size +1G

# 查看目录下文件数量
find <dir> | wc -l

locate

通过系统索引寻找文件的位置

locate <file>

updatedb

更新文件位置系统索引

updatedb

scp

在不同机器间复制文件,其中一个是本机器则不用写用户名和IP。

-r 复制目录

-P port 指定端口,默认端口22

-q 复制过程不打印进度

scp <user>@<ip>:<file> <user>@<ip>:<file>

rsync

在不同及其间复制文件,其中一个是本机器则不用写用户名和IP。与 scp 的区别在于 scp 是全量拷贝,而 rsync 默认只拷贝变动的文件。

-r 复制目录

rsync <user>@<ip>:<file> <user>@<ip>:<file>

sz

从服务器传文件到本地

-a 文本

-be 二进制

-y 覆盖已有文件

sz <file>

rz

从本地传文件到服务器

-b 二进制

-y 覆盖已有文件

rz

ar

文件归档

-v 显示执行时的信息

# 将文件放入存档
ar -r <bak> <file>

# 将存档的文件取出
ar -x <bak>

# 显示存档的文件
ar -t <bak>

# 删除存档的某文件
ar -d <bak> <file>

# 编译静态链接库
ar cr liba.a a.o

tar

压缩工具

# 压缩文件
tar -zcf a.tgz a

# 解压文件
tar -zxf a.tgz

# 归档文件
tar -cf a.tar a

# 恢复归档
tar -xf a.tar

zip

压缩工具

-r 压缩目录

-q 不显示执行过程

-P passwd 设置密码

-m 压缩后删除源文件

zip a.zip <file>

unzip

解压工具

-q 不显示执行过程

-P passwd 解压密码

-d dir 解压到指定目录

unzip a.zip

gzip

压缩工具

-d 解压

-c 输出到标准输出

-r 压缩目录

gzip <file>

12. 文本打印

cat

查看文件内容并输出

-n 加行号

-E/-e 每行末加’$’

-t 制表符^I,换页符^L

-v 显示非打印字符

cat <file>

tac

按行倒序查看文件内容并输出

tac <file>

strings

输出文件的可打印字符,如用于二进制文件,将可打印的内容展示出来。

strings <file>

more

每次一屏查看文件,按空格下一屏,按回车下一行,按q退出。

-n 每次n行

+n 从第n行开始

more <file>

less

查看文件,可以通过方向键或者jk向前向后看。

less <file>

显示文件开始几行,默认10行。

-n 前n行

head <file>

tail

显示文件最后几行,默认10行。

-n 后n行

-f 不退出,随着文件追加继续打印,一般用于查看正在打印的日志文件。等同于命令 tailf。

tail <file>

# 查看文件实时追加的内容
tail -f a.log

echo

打印文本

-e 允许转义

\c 去掉换行符

echo <text>

od

输出文件内容的八进制格式

-c 打印字符

-t d1 打印ASCII码

od <file>

13. 文本处理

grep

文件内容匹配

-c 打印匹配行数

-i 忽略大小写

-n 打印行号

-v 输出非匹配行

-E 增强正则表达式,相当于egrep

-o 打印匹配的串

-l 只打印文件名

-w 打印匹配整行的

-r 递归目录查找

-q 用于 if 逻辑判断,不打印任何内容

–line-buffered 缓冲输出

-A n 额外打印每处匹配的后n行

-B n 额外打印每处匹配的前n行

-C n 额外打印每处匹配的前后n行

grep <regex> <file>

sed

文本处理

command:

  • s替换
    • ’s/aa/bb/’ 文本替换,每行只替换第一次
    • ’s/aa/bb/g’ 文本替换,每行多次
  • d删除
    • ‘/aa/d’ 匹配并删除
    • ‘1,3d’ 删除行
  • a新增
    • ‘2,3a text’ 每行的下一行插入文本
  • c取代
    • ‘2,3c text’ 这几行取代为文本
  • p打印
    • -n ‘2,3p’ 打印行
  • i插入
    • ‘2i text’ 每行前插入文本

-i 修改后的内容保存到文件

-r 扩展regex

-n 安静模式,只有p有输出

sed '<command>' <file>

# 将每个aa替换为bb
sed 's/aa/bb/g' a.log

awk

文本处理

command:

  • ‘/aa/’ 匹配行
  • ‘{print $1}’ 打印某一域,$0为全行,$NF为最后一域
  • {} 每行执行
  • BEGIN{} 开始执行
  • END{} 结束执行

变量:

  • NR 当前记录数,每行递增
  • FNR 当前记录数,每行递增,重新打开文件置1
  • NF 本行字段数
  • FS 分隔字符

-F ‘sep’ 指定分割域的串

-f file 从文件读取命令

-v var=x 定义awk内的变量,用数字、字符串、shell变量赋值,使用时直接用var

awk '<command>' <file>

# 以-为分隔符打印每行的第2、3段内容
awk -F"-" '{print $2,$3}' a.log

# 合并文件列
# file1:
#1	13
#2	423
#3	55
# file2:
#1	a
#2	b
awk 'NR==FNR{a[$1]=$2}NR>FNR{if(a[$1]!="")print $1,a[$1],$2}' file1 file2

cut

剪切每行字符并输出

-b n 每行第n个字节

-c n 每行第n个字符

-d sep 指定字段分割字符,默认为tab

-f n 输出第n段

-f m,n 输出第m和第n段

-f m-n 输出第m至n段

# 输出以-为分隔符每行第二段内容
cut -d '-' -f 2 a.log

paste

水平连接多个文件

paste <files>

sort

文件每行排序

-t ’’ 设置分隔符,默认为空格制表符

-k n 按照第n个域排序

-r 反序

-n 数字排序

sort <file>

uniq

删除连续的重复行

-c 打印连续次数

-d 只输出重复的

-u 只输出不重复的

uniq <file>

# 文件并集
cat file1 file2 | sort | uniq

# 文件交集
sort file1 | uniq > f1; sort file2 | uniq > f2; cat f1 f2 | sort | uniq -d

diff

文件比较

diff <file1> <file2>

# 打开vim比较文件
vimdiff <file1> <file2>