日常运维的最佳拍档 x 99
显示文件的头部内容,如果不指定参数默认显示10行
# 显示前10行内容
head README.md
# 或者显示多个文件
head README.md package.json
# -n 指定显示行数
head -n 100 README.md
显示文件的末尾部分
# 默认显示末尾10行
tail README.md
# -n 指定显示末尾20行
tail -n 20 README.md
# 实时监听README.md文件变化
tail -f README.md
# 根据文件名进行追踪, 如果删除后创建相同的文件名会继续追踪
tail -F README.md
# 显示文件的最后10个字符
tail -c README.md
显示当前目录下的文件和目录,输出的列表是按字母排序 (某些发行版可能不一样)。
# 显示当前目录列表
ls
# 显示目录列表的详细信息
ls -l
# 显示指定目录
ls ./src
# 显示目录列表详细信息和大小
ls -lh
# 列出所有文件包括隐藏文件
ls -a
# -F 可以显示类型,用以区分是文件还是目录
ls -F # 后缀为 ”/“ 代表是目录,”*“ 为可执行文件,没有则为文件
# 过滤文件列表, * 代表0个或多个字符, ? 代表一个字符
ls javasc*
# -i 查看inode编号, 每一个文件或目录都有一个唯一的编号,这个数字由内核分配给文件系统中的每一个对象
ls -i
显示当前工作目录
pwd
统计文件的行数、字数、字节数, 常见用于统计代码行数
# 统计字节数
wc -c README.md
# 统计行数
wc -l README.md
# 统计字数
wc -w README.md
# 统计字符数
wc -m README.md
统计文件的行数、字数、字节数, 常见用于统计代码行数
# 统计字节数
wc -c README.md
# 统计行数
wc -l README.md
# 统计字数
wc -w README.md
# 统计字符数
wc -m README.md
指定某个目录下查找文件
# 在当前目录递归搜索文件名为 README.md 文件
find . -name README.md
# 通过通配符进行查找, 必须用引号括着, 这里查找所有后缀为 .md 文件
find . -name "*.md"
find . -iname "*.md" # 忽略文件大小写
# 排除文件,只要加 ! , 排除掉所有 .md 后缀的文件
find . ! -name "*.md"
# 根据类型进行过滤搜索
# f 普通文件, l 符号连接
# d 目录, c 字符设备
# b 块设备, s 套接字, p Fifo
find . -type f
# 限定目录递归深度
find . -maxdepth 3 # 最大为3个目录
find . -mindepth 3 # 最小为3个目录
# 查找文件大小大于 25k 文件
find /root -size +25k
# 查找10天前文件 -mtime 修改时间、 -ctime 创建时间、 -atime 访问时间
find /root -mtime +10
创建目录
# 在当前目录下创建 temp 目录
mkdir temp
# 创建多层目录
mkdir -p temp/temp2/temp3
# 基于权限创建
mkdir -m 777 temp
创建临时目录或文件,Linux使用 /tmp
目录来存放不需要永久保留的文件,大多数Linux发行版配置了系统在启动时自动删除 /tmp
目录的所有文件。
默认情况下, mktemp
会在本地目录中创建一个文件,只要指定一个文件名模板就行,模板可以包含任意文本文件名,在文件名末尾加上6个X就行了。
# 创建本地临时文件, 会在当前目录下创建一个叫 log.XXXXXX, XXXXXX是一个随机字符码,保证文件名在目录中是唯一的。
mktemp log.XXXXXX # log.J3awfb
# -t, 在 /tmp 目录创建临时文件, 返回绝对路径地址
mktemp -t log.XXXXXX # /tmp/log.G5g9dX
# -d 创建临时目录, 这样就能用该目录进行任何需要的操作了,比如创建其他的临时文件
mktemp -d dir.XXXXXX
用于修改文件属性
参数:
-
a:让文件或目录仅供附加用途
-
b:不更新文件或目录的最后存取时间
-
c:将文件或目录压缩后存放
-
d:将文件或目录排除在倾倒操作之外
-
i:不得任意更动文件或目录
-
s:保密性删除文件或目录
-
S:即时更新文件或目录
-
u:预防意外删除
-
-R:递归处理,将指令目录下的所有文件及子目录一并处理
-
-v<版本编号>:设置文件或目录版本
-
-V:显示指令执行过程
-
+<属性>:开启文件或目录的该项属性
-
-<属性>:关闭文件或目录的该项属性
-
=<属性>:指定文件或目录的该项属性
# 锁定该文件, 防止文件被修改或删除
chattr +i README.md # chattr -i README.md 解锁
# 可以使用 lsattr 查看赋予的属性
lsattr README.md
分页查看文件内容, 每次查看一屏, 每屏能显示多少内容取决于终端大小。
与 cat
命令不同,cat
只能一次显示全部内容,如果内容太多部分会被截取掉。
快捷键:
空格
或PageUp
- 查看下一屏内容B
或PageDown
- 查看上一屏内容回车
- 查看下一行内容Q
- 退出
more README.md
# 从第10行开始显示
more +10 README.md
# 显示查看进度
more -d README.md # --More--(17%)[Press space to continue, 'q' to quit.]
合并N个文件的列,相当于追加文件内容。
# 1.txt 和 2.txt 合并输出
paste 1.txt 2.txt
# 1.txt 2.txt 合并后保存为 3.txt
paste 1.txt 2.txt > 3.txt
用于显示文件或目录的状态信息
stat logs
# File: ‘logs/’
# Size: 16384 Blocks: 32 IO Block: 4096 directory
# Device: fd01h/64769d Inode: 669067 Links: 5
# Access: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
# Access: 2020-07-07 17:24:23.941816812 +0800
# Modify: 2020-07-12 11:46:55.567707577 +0800
# Change: 2020-07-12 11:46:55.567707577 +0800
# Birth: -
强大的文本搜索工具,被称为Linux命令三剑客。
# 从 README.md 文件中搜索 linux 关键字
grep "linux" README.md
grep "linux" README.md README2.md # 多个文件搜索
# 输出时高亮显示
grep "linux" README.md --color
# -o 只输出匹配部分
grep -o "linux" README.md --color
# -n 输出到匹配的行数
grep -n "linux" README.md
# -c 输出到匹配次数
grep -c "linux" README.md
# -r 递归目录文件搜索
grep -r "linux" ./src
# 使用 glob 风格表达式搜索
egrep "[0-9]" # 等价于 grep -E "[0-9]" README.md
创建一个空文件, 如果文件存在只会修改文件的创建时间
touch README.md
进入指定目录
# 进入当前 src 目录
cd src
# 回到上一次目录
cd -
# 返回上一级目录
cd ..
cd ../../.. # 返回多级
# 进入家目录
cd ~
cd # 或者不带任何参数
# 将上一个命令的参数作为cd参数使用
cd !$
# 模糊匹配目录,有时目录名很长一个一个敲效率就很低
# * 代表0个或多个字符, ? 代表一个字符
cd javasc*
删除指定目录或文件
注: 使用此命令需要非常小心, 一但删除无法恢复
# 删除当前 1.txt 文件
rm 1.txt
# -i 删除前询问是否真的要删除,因为一旦删除无法恢复
rm -i README.md
# 这条命令比较常用, 强制删除目录或文件
# -r 如果是目录递归删除, -f 强制删除 不发出任何警告
rm -rf ./src
删除指定空目录
注:rmdir
实际上用得并不多,因为不是很灵活,基本上使用 rm
代替
# 删除当前 temp 空目录, 如果不是空目录会发出警告
rmdir temp
# -p 参数可以删除多层空目录, 发现temp3是空目录删除掉,然后接着往父级找如果还是空目录继续删除...
rmdir -p temp1/temp2/temp3
# -i 删除前询问确认删除
rmdir -i temp
拷贝文件或目录
# 将当前 README.md 文件拷贝到上一层
cp ./README.md ../README.md
# -a 将原文件属性一同拷贝
cp -a ./README.md ../README.md
# -r 拷贝目录
cp -r home ../home
# -i 如果目标文件存在会询问用户是否需要覆盖
cp -i README.md README.md
查看指定整个文件内容
# 查看 README.md 文件所有内容
cat README.md
cat README.md README2.md # 或者一次性显示多个文件
# -n 每一行显示行号
cat -n README.md
# -b 只给有内容的行显示行号
cat -b README.md
mv
有2个用途:
- 将文件或目录移动到另一个位置
- 将文件或目录重命名
注:实际上 mv
是用来移动文件或目录,只不过有类似重命名的功能而已。
# 将 README.md 重命名为 README-2.md, 如果 README-2.md 存在会直接覆盖。
mv README.md README-2.md
# 将 README.md 移动到上一层目录
mv README.md ../README.md
# -i 交互式操作,如果目标文件存在则进行询问是否覆盖
mv -i README.md ../README.md
搜索文件,与 find
命令很像,但更快,因为是从数据库里查找, 通常每天会进行数据更新。
# 搜索 README.md 相关文件
locate README.md
# 忽略大小写
locate -i README.md
open
命令可在 linux
/ mac
具有可视化界面下进行文本编辑、打开应用程序等功能。
# 在mac下用Finder打开当前目录
open .
# 用默认应用程序打开文件
open README.md
# 用默认编辑器打开文件
open -e README.md
# 如果是一个URL用默认浏览器打开页面
open https://github.com/xjh22222228/linux-manual.git
# 指定某个应用程序打开某个文件, 如果不指定文件默认直接打开程序
open -a /Applications/Google\ Chrome.app README.md
在当前Shell环境中从指定文件读取和执行命令, 通常用于重新执行环境。
别名 .
点符号
source ~/.bash_profile # 等价 . ~/.bash_profile
生成目录树结构, 通常用于描述项目结构。
# 递归当前目录下所有文件并生成目录树
tree
# .
# ├── LICENSE
# ├── README.md
# ├── b.md
# └── media
# └── poster.jpg
# -I 忽略某些目录
tree -I "node_modules|.git|.svn"
# 只显示目录
tree -d
# 指定要递归的目录层级
tree -L 3
将某一个文件在另外一个位置建立并产生同步的链接。 当不同的2个目录需要同时引用某一个文件时此命令就派上用场了。
软链接也可以叫符号链接:
- 软链接,以路径的形式存在。类似于Windows操作系统中的快捷方式
- 软链接可以 跨文件系统 ,硬链接不可以
- 软链接可以对一个不存在的文件名进行链接
- 软链接可以对目录进行链接
硬链接:
- 硬链接,以文件副本的形式存在。但不占用实际空间, 从根本上而言就是同一个文件。
- 不允许给目录创建硬链接
- 硬链接只有在同一个文件系统中才能创建
# 默认创建硬链接,修改 README.md 内容, a.md 也会同步修改, 修改a.md README.md 也会同步修改
ln README.md a.md
# -s 创建软链接
ln -s README.md a.md # 如果删除了 README.md a.md 将失效
# -f 强制执行
ln -f README.md ./src/a.md
查看文件类型, 比如文件、目录、二进制、符号链接等
# 输出 README.md: ASCII text
file README.md
# index.html: HTML document, UTF-8 Unicode text, with very long lines, with no line terminators
file index.html
实时查看系统执行中的程序, top 命令跟 ps
命令相似,但它是实时的。
默认情况下 top
命令启动时会按照 %CPU
值对进程排序。
名称 | 描述 |
---|---|
PID | 进程的ID |
USER | 进程的优先级 |
PR | 进程的优先级 |
NI | 进程的谦让度值 |
VIRT | 进程占用的虚拟内存总量 |
RES | 进程占用的物理内存总量 |
SHR | 进程和其他进程共享的内存总量 |
S | 进程的状态(D=可中断的休眠状态,R在运行状态,S休眠状态,T跟踪状态或停止状态,Z=僵化状态) |
%CPU | 进程使用的CPU时间比例 |
%MEM | 进程使用的内存占可用内存的比例 |
TIME+ | 自进程启动到目前为止的CPU时间总量 |
COMMAND | 进程所对应的命令行名称,也就是启动的程序名 |
# 实时监听进程变化
# PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
# 1 root 20 0 125124 3612 2428 S 0.0 0.2 0:04.88 systemd
top
# 显示2条
top -n 2
# 显示指定的进程信息
top -pid <pid>
# 查看进程所有的线程
top -H -p <pid>
程序以挂起方式运行, 不会影响终端交互。
因为程序会以后台的方式运行,所以标准输出不会显示在屏幕上, 默认情况下会在当前目录生成一个叫 nohup.out
文件,里面包含了标准输出内容。
# 例如运行一个 node.js 程序
nohup node main.js
nohup node main.js & # 可以在最后加 & ,表示后台模式,让出CLI以供其他使用。
# 在当前目录会出现 nohup.out 文件,里面包含了 Hello World
nohuo echo "Hello World"
通常用于监听1个命令的运行结果、定时执行命令
# 每5秒执行一次 tail 命令, 如果不指定-n 默认为2秒
watch -n 5 "tail README.md"
# -d 高亮显示变化内容
watch -n 5 -d "tail README.md"
测试目标地址是否可连接、延迟度
# 测试 github.com 连通性, 按 ctrl + C 停止
ping github.com
# ping 5次后断开
ping -c 5 xiejiahe.com
# 每5秒ping 一次
ping -i 5 xiejiahe.com
查找某个命令存储在哪个位置, 输出绝对路径, which
会在环境变量 $PATH
设置的目录里去查找。
注: 可以通过 echo $PATH
查看设置的目录.
which top # /usr/bin/top
# 查找pwd发现会找不到,因为 pwd 是bash的内置命令
which pwd
# 打印多个命令
which ls vi
将系统关机或重启操作。
# 立即重启系统
shutdown -r now
# 关闭系统并切断电源
shutdown -h now # 立即关机, 实际上调用 init 0
# 把前一个关机或重启取消掉
shutdown -c
# 设定一个时间关机, "&" 符号表示后台模式,让出CLI
shutdown -h 05:33 &
shutdown +5 "5分钟后关机" # 5分钟后关机,同时送出警告信息给登入用户:
有点类似 shutdown
命令, 用于重新启动系统。
# 重启系统
reboot
# -f 强制重启
reboot -f
# 用于模拟重新启动系统,不会真实重启,数据会写入 /var/log/wtmp
reboot -w
# 在重新启动之前关闭所有网络界面
reboot -i
查看当前系统进程状态。
ps
命令非常复杂,且参数极多,由于 ps
历史问题,参数风格支持了三种 UNIX
/BSD
/``GNU` 这里不详细的介绍,感兴趣可以自行了解。
- Unix 风格参数 - 前面加单破折线
- BSD 风格的参数 - 前面不加破折线
- GNU 风格长参数 - 前面加双破折线
参数 | 描述 |
---|---|
-A | 显示所有进程 |
-N | 显示与指定参数不符的所有进程 |
-a | 显示除控制进程和无终端进程外的所有进程 |
-d | 显示除控制进程外的所有进程 |
-e | 显示所有进程 |
-C cmdlist | 显示包含在cmdlist列表中的进程 |
-G grplist | 显示组ID在grplist列表中的进程 |
-U userlist | 显示属主的用户ID在userlist列表中的进程 |
-g grplist | 显示会话或组ID在grplist列表中的进程 |
-p pidlist | 显示PID在pidlist列表中的进程 |
-s sesslist | 显示会话ID在sesslist列表中的进程 |
-t ttylist | 显示终端ID在ttylist列表中的进程 |
-u userlist | 显示有效用户ID在userlist列表中的进程 |
-F | 显示更多额外输出(相对-f参数而言) |
-O format | 显示默认的输出列以及format列表指定的特定列 |
-M | 显示进程的安全信息 |
-c | 显示进程的额外条调度器信息 |
-l | 显示长列表 |
-o format | 仅显示由format指定的列表 |
-y | 不要显示进程标记(process tag, 表明进程状态的标记) |
-Z | 显示安全标签(security context)信息 |
-H | 用层级格式来显示进程(树状,用来显示父进程) |
-n namelist | 定义了WCHAN列显示的值 |
-w | 采用宽输出模式,不限宽显示 |
-L | 显示进程中的线程 |
-V | 显示PS命令的版本号 |
# 显示所有进程信息
ps -A
# 显示指定用户进程信息
ps -u root
# 显示所有进程信息包括命令行
ps -ef # -e 等价于 -A , 即等价于 ps -Af
# 这是 BSD 风格参数,列出所有正在内存中的进程
ps aux
# 配合 grep 查询指定进程
ps -ef | grep nginx
查看系统负载信息, 此命令非常简单,没有太多的参数。
# 21:51:53 当前时间
# up 750 days, 13:24 当前系统运行的天数,小时,分钟 (从上次开机起计算)
# 1 user 当前系统登录用户数
# load average: 0.08, 0.07, 0.06 一分钟、5分钟、15分钟平均负载, 这3个值不能大于CPU个数,如果大于了说明系统负载高,性能低。
uptime # 21:51:53 up 750 days, 13:24, 1 user, load average: 0.08, 0.07, 0.06
周期性执行任务, 通常用于定时备份。
* * * * *
分别含义:
* * * * *
┬ ┬ ┬ ┬ ┬
│ │ │ │ │
│ │ │ │ │
│ │ │ │ └───── 一周中的某一天 (0 - 7) 0或7代表是星期日
│ │ │ └────────── 月份 (1 - 12)
│ │ └─────────────── 一个月的某一天 (1 - 31)
│ └──────────────────── 小时 (0 - 23)
└───────────────────────── 分钟 (0 - 59)
# 列出该用户设置
crontab -l
# 编辑该用户设置
crontab -e
# 删除该用户设置
crontab -r
* * * * * 命令
# 每天18点18分执行 echo `date` > README.md
18 18 * * * echo `date` > README.md
# 每一分钟执行
* * * * */1 echo `date` > README.md
打印系统信息
# 不带任何参数打印当前操作系统内核名称
uname # Linux , 等价于 uname -s
# 打印系统所有信息
uname -a
# -r 打印系统版本 , 如果次版本号都是偶数,说明是一个稳定版
uname -r # 3.10.0-514.26.2.el7.x86_64
# 打印网络节点主机名称
uname -n # Yin.local
# 打印处理器名称
uname -p # i386
# 打印主机的硬件架构名称
uname -m # x86_64
配置或显示系统网卡的网络参数
# 显示所有网络参数信息
ifconfig
# 配置网卡IP地址
ifconfig eth0 192.168.1.111
用来定位指令的二进制程序、源代码文件和man手册页等相关文件的路径。
注意:whereis
是从数据库里查找的,因此特别快,默认情况下一星期更新一次数据,所以有时会查找删除的数据或者刚建立的数据无法找到问题。
# 查找 nginx
whereis nginx # nginx: /usr/sbin/nginx /usr/lib64/nginx /etc/nginx /usr/share/nginx /usr/share/man/man8/nginx.8.gz /usr/share/man/man3/nginx.3pm.gz
# -b 指定只查找二进制
where -b nginx # nginx: /usr/sbin/nginx /usr/lib64/nginx /etc/nginx /usr/share/nginx
# -m 指定查找说明文件 man
whereis -m nginx # nginx: /usr/share/man/man8/nginx.8.gz /usr/share/man/man3/nginx.3pm.gz
结束程序,kill 命令只支持进程id杀死,不支持进程名称。
信号 | 名称 | 描述 |
---|---|---|
1 | HUP | 挂起 |
2 | INT | 中断 |
3 | QUIT | 结束运行 |
9 | KILL | 无条件终止 |
11 | SEGV | 段错误 |
15 | TERM | 尽可能终止 |
17 | STOP | 无条件停止运行,但不终止 |
18 | TSTP | 停止或暂停,但继续在后台运行 |
19 | CONT | 在STOP或TSTP之后恢复执行 |
注:程序进程 id 可通过 top
等命令查看。
# 杀死 pid 为88 进程,不带参数默认等价 kill -15
kill 88
# 无条件终止进程,以下是等价,可以用进程名称信号
kill -KILL 88
kill -9 88
# 显示信号
kill -l
# 杀死指定用户的所有进程
kill -u nginx
杀死进程,可以杀死多个进程,比 kill
要强大, 支持通过进程名称杀死, 还支持通配符。
# 杀死以tcp进程名称开头的所有进程
killall tcp*
修改文件或目录权限
chmod [参数选项] [mode, 八进制或符号表示] files...
u
符号代表当前用户。g
符号代表和当前用户在同一个组的用户,以下简称组用户。o
符号代表其他用户。a
符号代表所有用户。r
符号代表读权限以及八进制数4。w
符号代表写权限以及八进制数2。x
符号代表执行权限以及八进制数1。X
符号代表如果目标文件是可执行文件或目录,可给其设置可执行权限。s
符号代表设置权限suid和sgid,使用权限组合u+s设定文件的用户的ID位,g+s设置组用户ID位。t
符号代表只有目录或文件的所有者才可以删除目录下的文件。+
符号代表添加目标用户相应的权限。-
符号代表删除目标用户相应的权限。=
符号代表添加目标用户相应的权限,删除未提到的权限。
权限 | 二进制值 | 八进制值 | 描述 |
---|---|---|---|
--- | 000 | 0 | 没有任何权限 |
--x | 001 | 1 | 只有执行权限 |
-w- | 010 | 2 | 只有写入权限 |
-wx | 011 | 3 | 有写入和执行权限 |
r-- | 100 | 4 | 只有读取权限 |
r-x | 101 | 5 | 有读取和执行权限 |
rw- | 110 | 6 | 有读取和写入权限 |
rwx | 111 | 7 | 有全部权限 |
# README.md 文件设为所有用户可读取
chmod a+r README.md
# -R 递归目录下所有文件
chmod a+r src/
# 也可以用八进制符号表示
# 3个数字分别为 x,y,z 表示User、Group、及Other的权限。
# r=4, w=2, x=1
chmod 777 README.md # 等价于 chmod a=rwx README.md
列出当前系统打开文件的工具
## 打印所有打开文件的的列表
lsof
# 查看指定端口被占用情况
lsof -i:8080
# -p 列出指定进程号所打开的文件
lsof -p 6112
查看网络系统状态信息
参数说明:
参数 | 描述 |
---|---|
a或--all | 显示所有连线中的Socket |
A<网络类型>或--<网络类型> | 列出该网络类型连线中的相关地址 |
c或--continuous | 持续列出网络状态 |
C或--cache | 显示路由器配置的快取信息 |
e或--extend | 显示网络其他相关信息 |
F或--fib | 显示FIB |
g或--groups | 显示多重广播功能群组组员名单 |
h或--help | 在线帮助 |
i或--interfaces | 显示网络界面信息表单 |
l或--listening | 显示监控中的服务器的Socket |
M或--masquerade | 显示伪装的网络连线 |
n或--numeric | 直接使用IP地址,而不通过域名服务器 |
N或--netlink或--symbolic | 显示网络硬件外围设备的符号连接名称 |
o或--timers | 显示计时器 |
p或--programs | 显示正在使用Socket的程序识别码和程序名称 |
r或--route | 显示Routing Table |
s或--statistics | 显示网络工作信息统计表 |
t或--tcp | 显示TCP传输协议的连线状况 |
u或--udp | 显示UDP传输协议的连线状况 |
v或--verbose | 显示指令执行过程 |
V或--version | 显示版本信息 |
w或--raw | 显示RAW传输协议的连线状况 |
x或--unix | 此参数的效果和指定"-A unix"参数相同 |
-ip或--inet | 此参数的效果和指定"-A inet"参数相同 |
# 列出所有占用端口
netstat -ntlp
# 显示所有网络状况
netstat -a
# 显示所有tcp网络状况
netstat -at
# 显示所有udp网络状况
netstat -au
# 配合grep命令查看某个端口被占用情况
netstat -ap | grep 8080
用来变更文件或目录的拥有者或所属群组
# 将 README.md 文件拥有者设为 byroot
chown byroot README.md
# 使用-R递归处理文件
chown -R byroot src/
# 改变所属群组, 拥有者设为 byroot 群组设为 byrootgroup
chown byroot:byrootgroup README.md
系统服务管理器指令, 通常用来设置某个服务器默认开机启动或关闭。
命令:systemctl [command] [unit]
# 立即启动服务
systemctl start nginx.service
# 立即停止服务
systemctl stop nginx.service
# 重启服务,stop 后 start
systemctl restart nginx.service
# 重新载入服务, 一般情况下重新载入新的配置
systemctl reload nginx.service
# 下次开机时默认启动服务
systemctl enable nginx.service
# 下次开机时不会启动服务
systemctl disable nginx.service
# 查看某个服务状态信息
systemctl status nginx.service
# 当前服务是否正在运行中
systemctl is-active nginx.service
# 查看服务开机有没有默认启动
systemctl is-enable nginx.service
管理操作系统服务的命令, 是Redhat Linux兼容的发行版中用来控制系统服务的实用工具,它以启动、停止、重新启动和关闭系统服务,还可以显示所有系统服务的当前状态。
# 启动 docker 服务
service docker start
# 查看 docker 状态
service docker status
# 停止 docker 服务
service docker stop
# 重新启动 docker 服务
service docker restart
# 查看所有服务状态
service --status-all
显示内存使用情况
选项
- b 字节单位显示
- k KB单位显示
- m MB单位显示
- g GB单位显示
- s<秒> 每S秒监控内存使用情况
解释:
- total 内存总数
- used 已使用内存
- free 空闲内存
- shared 当前已废弃内存
- buff/cache 缓存内存数
- 1204660 可用内存数
free
# 输出以下, 默认以字节为单位
total used free shared buff/cache available
Mem: 1882192 485312 448424 704 948456 1204660
Swap: 0 0 0
# MB单位显示
free - m
# 10秒执行一次查询
free -s 10
显示当前运行在后台模式中的所有用户的进程(作业)
# 先来启一个后台进程, 比如启一个sleep命令进程, & 符号表示后台运行
sleep 3 &
# 查看后台进程
jobs # 输出:[1]+ Running sleep 3 &
type
命令有2个作用:
- 用来查找命令的位置,类似 which 命令
- 检测某个命令是内建命令还是外部命令
普及:内建命令和外部命令的区别:内建命令不会衍生出子进程,而外部命令会衍生出一个子进程然后执行命令, 所以内建命令执行效率要高。
# cd is a shell builtin 表示这是shell内建命令
type cd
# ps is hashed (/usr/bin/ps) 表示这是一个外部命令
type ps
列出全局环境变量, 有个 env
命令很像,但 printenv
可以打印变量的值。
普及:所有系统环境变量都是大写字母,用于区分普通用户的环境变量。
# 列出所有全局环境变量
printenv
# 也可以显示指定全局环境变量的值, 等价于 echo $HOME
printenv HOME # /root
列出所有全局变量、局部变量和普通用户定义的变量,按照字母顺序对结果进行排序。
注意:所有系统全局变量都是大写,用户定义的环境变量全部采用小写,这是标准规范。
set
# OPTIND=1
# OSTYPE=linux-gnu
# PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
# PIPESTATUS=([0]="0")
# ...
导出环境变量, 可以把一个局部变量导出成全局环境变量
注意:export 只有在当前Shell有效,退出后将失效
# 先声明一个局部环境变量
my_var='Hello'
# 然后将其导出全局环境变量
export my_var
删除环境变量
注意:unset 只在当前shell删除环境变量,假如环境变量设置在 ~/.bash_profile
等文件中用户重新启动依然生效。如果是在子进程删除全局环境变量只在子进程有效,不会影响父进程。
# 删除 HOME 环境变量,前面不需要带 $ 符号
unset HOME
设置命令别名,用于简化较长的命令
# 列出所有已设置的别名
alias
# 删除所有别名
unalias -a
# 设置别名
alias ll='ls -l'
测试某条命令执行所需花费时间
# time 后面跟着要测试的命令
# 输出: 0.02s user 0.01s system 0% cpu 6.233 total
time curl https://github.com/xjh22222228/linux-manual
用于清除当前终端所有信息,本质上只是向后翻了一页,往上滚动还能看到之前的操作信息
注:笔者用得比较多的是 command + K
可以完全清除终端所有操作信息。
clear
给系统添加新用户
注:
- 在创建新用户时如果不指定具体的值,就会使用系统那些默认值。
- 在创建新用户时如果未指定密码,需要使用
passwd
命令进行更改。
参数 | 描述 |
---|---|
-c comment | 给新用户添加备注 |
-d home_dir | 为主目录指定一个名字(如果不想用登录名作为主目录名的话) |
-e expire_date | 用YYYY-MM-DD格式指定一个账户过期的日期 |
-f inactive_days | 指定这个账户密码过期后多少天这个账户被禁用;0表示密码已过期就立即禁用,1表示禁用这个功能 |
-g initial_group | 指定用户登录组的GID或组名 |
-G group | 指定用户除登录组之外所属的一个或多个附加组 |
-k | 必须和-m一起使用,将/etc/skel目录的内容复制到用户的HOME目录 |
-m | 创建用户的HOME目录 |
-M | 不创建用户的HOME目录(当默认设置里要求创建时才使用这个选项) |
-n | 创建一个与用户登录名同名的新租 |
-r | 创建系统账户 |
-p passwd | 为用户账户指定默认密码 (需要使用openssl把明文进行加密后设置,否则无效) |
-s shell | 指定默认的登录shell |
-u uid | 为账户指定唯一的UID |
参数 | 描述 |
---|---|
-b default_home | 更改默认的创建用户HOME目录的位置 |
-e expiration_date | 更改默认的心账户的过期日期 |
-f inactive | 更改默认的心用户从密码过期到账户被禁用的天数 |
-g group | 更改默认的组名称或GID |
-s shell | 更改默认的登录shell |
# -D, 查看默认值
useradd -D
# 输出:
GROUP=100 # 新用户会被添加到GID为100的公共组
HOME=/home # 新用户的HOME目录将位于 /home/loginname
INACTIVE=-1 # 新用户账户密码在过期后不会被禁用
EXPIRE= # 新用户账户未被设置过期日期
SHELL=/bin/bash # 新用户账户将bash shell作为默认shell
SKEL=/etc/skel # 系统会将/etc/skel目录下的内容复制到用户的HOME目录下
CREATE_MAIL_SPOOL=yes # 系统为该用户账户在mail目录下创建一个用于接收邮件的文件
# 创建一个 test 用户, -m 创建 /home/test 目录
useradd -m test
# 创建一个用户并设置密码
useradd -m test # 不指定-p,因为需要加密那样很麻烦
passwd test # 通过passwd修改指定用户密码
添加新用户后可以执行 cat /etc/passwd
查看用户列表。
删除用户
# 删除用户,默认会从 /etc/passwd 文件中删除用户信息,而不会删除系统中属于该账户的任何文件
userdel 用户名
# -r 用来删除用户目录, 之前创建的 /home/用户名 就不存在了, 使用-r参数需要小心,要检查是否有重要文件。
userdel -r 用户名
修改用户密码, 只有 root
用户才有权限修改别人的密码。
使用 passwd
一般用于修改单个用户密码,如果想批量修改那么需要 chpasswd
命令。
# 如果不指定用户名,修改的是自己当前用户密码, 回车后输入新密码
passwd
# 修改指定用户密码,比如test用户
passwd test
类似 passwd
命令也是用于修改用户密码,但它支持批量修改用户。
chpasswd
命令从标准输入自动读取登录名和密码对(由冒号分割)列表,给密码加密。
# 利用输入重定向从文本中读取
chpasswd < users.txt
# 从标准输入读取
echo 'test:fff33300..a' | chpasswd
user.txt 内容:
test:helloworld0123..
test1:fff33300..
admin:youyouyou00..11
修改默认用户登录 shell
# 必须使用完整路径,不能使用shell名
chsh -s /bin/sh
显示当前登录系统的所有用户的用户列表
users
# xiejiahe
# root
# admin
显示当前所有用户登录信息
# 显示当前登录系统的用户
who
xiejiahe console Jun 15 21:38
xiejiahe ttys001 Jun 15 21:44
xiejiahe ttys002 Jun 15 21:44
xiejiahe ttys003 Jun 15 21:44
xiejiahe ttys004 Jun 15 21:44
xiejiahe ttys005 Jun 15 21:44
# 显示登录账号名和总人数
who -q
# 显示上次系统启动时间
who -b # reboot ~ Jun 15 21:38
查看当前登入系统的用户信息, 有哪些用户正在登陆, 以及他们正在执行的程序。
此命令与 who
相似,默认情况下比 who
命令输出内容更详细。
w
# 输出
22:44:33 up 748 days, 14:16, 1 user, load average: 0.04, 0.03, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 183.11.111.11 22:40 1.00s 0.03s 0.00s w
显示用户最近登录信息
last # root pts/0 183.58.247.64 Sun Jan 5 13:57 - 14:28 (00:30)
# 指定显示条目数
last -n 1
切换到其他用户。
# 切换到 admin 身份
su admin
# -c 执行完指令后切换回原身份
su -c ls admin
# 可以通过以下查找当前系统用户列表
cat /etc/passwd
显示自身的用户名称, 此命令等价于 id -un
% whoami # xiejiahe
归档数据,将目录或文件归档为 .zip
格式, zip 不是Linux中的标准归档工具。
# 归档文件
zip README.zip README.md
# 归档目录需要 -r 递归处理
zip -r temp.zip temp
# -S 包含系统隐藏文件
zip -r -S temp.zip temp
# 指定归档效率 1-9
zip -r -9 temp.zip temp
提取 zip
归档的文件或目录
# 将 demo.zip 提取到当前目录下
unzip demo.zip
# 列表 demo.zip 文件内容,但不提取
unzip -v demo.zip
# -d 指定将文件提取到 src 目录下
unzip demo.zip -d src
GNU 压缩/解压工具,用 Lempel-Ziv编码,格式为 .gz
, 压缩后原文件将被删除
注意:gzip 不能用于压缩整个目录, 只能用于压缩文件, 如果需要压缩整个目录可以考虑使用 zip 命令。
# 压缩 README.md 文件, 压缩完成后 README.md 文件会被删除
gzip README.md # README.md.gz
# 递归压缩目录下的所有文件
gzip -r ./logs
# 加 -v 显示压缩执行过程
gzip -rv ./logs
# 压缩 .tar 后缀文件
gzip -r src.tar # 压缩后为 src.tar.gz
# -d 解压之前gzip压缩后的文件
gzip -d README.md
gzip -dr ./logs # 或者递归解压目录下的所有文件
采用 Burrows-Wheeler块排序文本压缩算法和霍夫曼编码,将文件压缩成 .bz2
格式,也可用于解压 .bz2
# 压缩 README.md 文件
bzip2 README.md # 不保留源文件 README.md.bz2
bzip2 -k README.md # -k 保留源文件
# 解压
bzip2 -d README.md.bz2 # 源文件将被删除
bzip2 -dk README.md.bz2 # -k 保留源文件
bzip -dt README.md.bz2 # -t --test 测试解压, 实际不解压,模拟整个解压过程
归档数据,是Linux中标准归档工具。
参数:
- -A - 将一个已有tar归档文件追加到另一个已有tar归档文件
- -c 创建一个新的tar归档文件
- -d 检查归档文件和文件系统的不同之处
- -r 追加文件到已有tar归档文件结尾
- -t 列出已有tar归档文件的内容
- -u 将比tar归档文件中已有的同名文件新的文件追加到该tar归档文件中
- -x 从已有的tar归档文件中提取文件
- -f 输出结果到文件或设备file
# -c 创建一个归档文件
tar -cvf demo.tar src/
# -x 提取归档文件内容
tar -xvf demo.tar
计算和校验文件报文摘要
# 计算文件md5
mmd5sum README.md # d41d8cd98f00b204e9800998ecf8427e README.md
# 校验文件, 查看文件是否被篡改过
md5sum README.md > README.md5 # 计算文件md5并保存在 README.md5 , 保存的文件名和后缀可以随意命名
md5sum -c README.md5 # -c 从指定的文件读取md5并校验, 会从当前目录寻找 README.md
base64 编码/解码文件或标准输入输出
# 编码字符串
printf "hello world"|base64 # aGVsbG8gd29ybGQ=
# 解码字符串
printf aGVsbG8gd29ybGQ=|base64 -d # hello world
# 编码文件, 将结果保存在 decode.txt
base64 README.md > decode.txt
# 从标准输入中读取已经进行base64编码的内容进行解码
base64 -d decode.txt
远程连接服务器工具
命令:ssh [-p port] [user@]hostname [command]
# 最简单的连接方式
ssh [email protected]
# 指定端口号连接
ssh -p 23 [email protected]
# 执行远程服务器命令, 比如创建目录
ssh [email protected] "mkdir -p /home/test"
# 在远程服务器执行本地脚本
ssh [email protected] < shell.sh
用于从网络下载文件到本地
# 下载某个文件
wget https://www.xiejiahe.com/robots.txt
# 指定下载后文件名
wget -O ro.txt https://www.xiejiahe.com/robots.txt
# 断开续传,一般用于大文件,防止重新下载
wget -c https://www.xiejiahe.com/robots.txt
# 使用后台下载, 对于大文件非常有用
wget -b https://www.xiejiahe.com/robots.txt
tail -f wget-log # 查看后台下载进度
curl
是一个非常强大的网络传输工具, 利用URL规则在命令行下工作的文件传输工具。
# 查看HTTP响应
curl https://github.com/xjh22222228/linux-manual
# -s 不输出错误和进度信息, 只显示正常结果
curl -s https://github.com/xjh22222228/linux-manual
# -o 指定文件名下载到本地,等价于 wget
curl https://github.com/xjh22222228/linux-manual -o 1.txt # 1.txt
# -O 下载文件到本地, 并将URL最后部分当做文件名
curl https://github.com/xjh22222228/linux-manual -O # linux-manual
curl https://github.com/xjh22222228/linux-manual -O --progress # 显示下载进度条
# -L HTTP请求跟随服务器重定向
curl -L https://github.com/xjh22222228/linux-manual
# -I 或 -head 显示HTTP响应报文
curl https://github.com/xjh22222228/linux-manual -I
# -H 设置请求头
curl -H 'Content-Type: application/json' -H 'Content-Type: application/json' https://github.com/xjh22222228/linux-manual
# 通过POST请求发送JSON数据, -X 指明HTTP请求方法, -d 实体内容
curl -H "Content-type: application/json" -X POST -d '{"age":"18"}' https://github.com/xjh22222228/linux-manual
# 发送时携带 cookie
curl https://github.com/xjh22222228/linux-manual --cookie "age=18;name=xjh"
# -v 查看整个传输过程
curl https://github.com/xjh22222228/linux-manual -v
# -F(--form) 利用POST上传文件, file 是字段名, =@ 必须存在
curl https://example.com/upload -F "file=@/home/demo.png"
# -u 指定提供用户名密码进行授权,通常Ftp等服务
curl -u admin:123123 ftp://demo/README.md
# 下载并执行脚本
curl -fsSL https://deno.land/x/install/install.sh | sh
加密的方式在本地主机和远程主机之间复制文件
注:需要有读写权限,否则会无法操作。
# 从远程主机下载文件到本地
scp [email protected]:/root/file.zip /home/file.zip
# 从远程主机下载目录到本地,需要 -r 递归
scp -r [email protected]:/root/dir /home/dir
# 从本地主机上传文件到远程主机
scp /home/file.zip [email protected]:/root/file.zip
# # 从本地主机上传目录到远程主机,需要 -r 递归
scp -r /home/dir [email protected]:/root/dir
查看已挂载的磁盘使用情况。
名称 | 描述 |
---|---|
Filesystem | 设备的设备位置文件 |
Size | 能容纳多少个1024字节大小的块 |
Used | 已用了多少个1024字节大小的块 |
Avail | 还有多少个1024字节大小的块可用 |
Use% | 已用空间所占的比例 |
Mounted on | 设备挂载到了哪个挂载点上 |
# 显示每个有数据的已挂载文件系统
# Filesystem 1K-blocks Used Available Use% Mounted on
# /dev/vda1 41151808 1853208 37185168 5% /
df
# 格式化大小,以kb以上进行显示
df -h
# 查看全部文件系统信息
df -a
显示文件或目录所占用的磁盘空间
# 默认显示当前目录的所有文件、目录、和子目录的磁盘使用情况
du
# 查看指定文件所占用磁盘空间
du README.md
# 查看指定目录所占用磁盘空间, 输出的最后一行是累计总大小
du src
# -h 以K,M,G为单位,提高信息的可读性。
du -h src # 20K src
# -s 只显示总大小,列出最后累计的值
du -s src
# 显示当前所有已列出文件总大小
du -c
基于RPM的软件包管理器, 特点安装快捷,命令简洁好记。
# 安装nginx
yum install nginx
# 指定 -y 安装时自动全部 yes
yum -y install nginx
# 查找包
yum search nginx
# 显示所有已安装的包
yum list
# 升级包
yum -y update nginx
# 移除包
yum -y remove nginx
# 清除缓存
yum clean all
# 显示安装包信息
yum info nginx
# 检查可更新的包程序
yum check-update
apt-get命令 是Debian Linux发行版中的APT软件包管理工具。所有基于Debian的发行都使用这个包管理系统。
# 安装一个docker软件
apt-get install docker
# 卸载软件,保留配置文件
apt-get remove docker
# 卸载软件并删除配置文件
apt-get –purge remove docker
# 更新所有已安装的软件包
apt-get upgrade
# 删除软件备份,主要用来释放空间
apt-get clean
目录名 | 描述 |
---|---|
/ | 虚拟目录的根目录,通常不会在这里存储文件 |
/bin | 二进制目录,存放许多用户级的GNU工具 |
/boot | 启动目录,存放启动文件 |
/dev | 设备目录,Linux在这里创建设备节点 |
/etc | 系统配置文件目录 |
/home | 主目录,Linux在这里创建用户目录 |
/lib | 库目录,存放系统和应用程序的库文件 |
/media | 媒体目录,可移动媒体设备的常用挂载点 |
/mnt | 挂载目录,另一个可移动媒体设备的常用挂载点 |
/opt | 可选目录,常用于存放第三方软件包和数据文件 |
/proc | 进程目录,存放现有硬件及当期进程的相关信息 |
/root | ROOT用户的主目录 |
/sbin | 系统二进制目录,存放许多GNU管理员级工具 |
/run | 运行目录,存放系统运作时的运行时数据 |
/srv | 服务目录,存放本地服务的相关文件 |
/sys | 系统目录,存放系统硬件信息的相关文件 |
/tmp | 临时目录,可以在该目录中创建和删除临时工作文件 |
/usr | 用户二进制目录,大量用户级的GNU工具和数据文件都存储在这里 |
/var | 可变目录,用以存放经常变化的文件,比如日志文件 |
将命令输出的内容发送到一个文件中叫做 输出重定向
。 使用 >
大于号。
下面展示了几个例子
# 1、
echo "Hello World" > log.txt
# 2、
ps -ef > ps.txt
# 3、
history > a.txt
有时不想覆盖文件而是追加内容,比如日志,可以使用 >>
2个大于号。
echo "H" >> log.txt
和输出重定向正好相反,将文件的内容定向到命令。
# 统计input.txt文本行数
wc -l < input.txt # 等价于 wc -l input.txt
还有一种叫内联重定向,比较少见,但也挺有用。 使用2个 <<
小于号。然后跟着一个开头标记和结尾标记。
# 统计行数,输出2
wc -l << EOF
第一行
第二行
EOF
开头标记必须和结尾标记一致,标记名称可以是任何字符串。
下面这个也是可以的。
# 输出2
wc -l << Hello
第一行
第二行
Hello
将一个命令的输出作为另一个命令的输入称为管道。 管道用 |
符号表示。
# 将 ls 输出内容作为 wc 输入
ls | wc
# 执行一个脚本,这没有什么意义,只是一个例子
echo "./bash.sh" | bash
输出字符串或者变量
注: 一般情况下字符串不必加双引号, 如果包含转义字符就必须要加
# 在终端输出 Hello World
echo "Hello World"
echo Hello World # 也可以不加双引号
echo "Hello\nWorld" # 必须加双引号, 否则无法转义
# 打印系统环境变量,如果变量不存在输出为空
echo $PATH
# > 输出重定向,将内容输出到文件中
echo Hello World > 1.txt
# -n 不换行, 默认情况下echo 是占一整行
echo -n Hello; echo World
显示或设置系统时间日期
格式化符号 | 描述 |
---|---|
%% | 百分号 |
%a | 当地缩写的工作日名称(例如,Sun) |
%A | 当地完整的工作日名称(例如,Sunday) |
%b | 当地缩写的月份名称(例如,Jan) |
%B | 当地完整的月份名称(例如,January) |
%c | 当地的日期和时间(例如,Thu Mar 3 23:05:25 2005) |
%C | 世纪,和 %Y 类似,但是省略后两位(例如,20) |
%d | 一月中的一天(例如,01) |
%D | 日期,等价于 %m/%d/%y |
%e | 一月中的一天,格式使用空格填充,等价于 %_d |
%F | 完整的日期;等价于 %+4Y-%m-%d |
%g | ISO标准计数周的年份的最后两位数字 |
%G | ISO标准计数周的年份,通常只对 %V 有用 |
%h | 等价于 %b |
%H | 小时,范围(00..23)24小时制 |
%I | 小时,范围(00..12)12小时制 |
%j | 一年中的一天,范围(001..366) |
%k | 小时,使用空格填充,范围(0..23),等价于 %_H |
%l | 小时,使用空格填充,范围(1..12),等价于 %_I |
%m | 月,范围(01..12) |
%M | 分钟,范围(00..59) |
%n | 换行符 |
%N | 纳秒,范围(000000000..000000000) |
%p | 用于表示当地的AM或PM,如果未知则为空白 |
%P | 类似于 %p ,但用小写表示 |
%q | 季度,范围(1..4) |
%r | 当地以12小时表示的时钟时间(例如,11:11:04 PM) |
%R | 24小时每分钟;等价于 %H:%M |
%s | 自协调世界时1970年01月01日00时00分以来的秒数 |
%S | 秒数,范围(00..60) |
%t | 水平制表符 |
%T | 时间;等价于 %H:%M:%S |
%u | 一周中的一天(1..7),1代表星期一 |
%U | 一年中的第几周,周日作为一周的起始(00..53) |
%V | ISO标准计数周,该方法将周一作为一周的起始(01..53) |
%w | 一周中的一天(0..6),0代表星期天 |
%W | 一年中的第几周,周一作为一周的起始(00..53) |
%x | 当地的日期表示(例如,12/31/99) |
%X | 当地的时间表示(例如,23:13:48) |
%y | 年份后两位数字,范围(00..99) |
%Y | 年份 |
%z | +hhmm格式的数值化时区格式(例如,-0400) |
%:z | +hh:mm格式的数值化时区格式(例如,-04:00) |
%::z | +hh:mm:ss格式的数值化时区格式(例如,-04:00:00) |
%:::z | 数值化时区格式,相比上一个格式增加':'以显示必要的精度(例如,-04,+05:30) |
%Z | 时区缩写(如EDT) |
- | (连字符) 不要填充相应的字段。 |
_ | (下划线) 使用空格填充相应的字段。 |
0 | (数字0) 使用数字0填充相应的字段。 |
+ | 用数字0填充,未来年份大于4位数字则在前面加上'+'号。 |
^ | 允许的情况下使用大写。 |
# | 允许的情况下将默认的大写转换为小写,默认的小写转换为大写。 |
# 显示当前时间
date
# 格式化当前时间
date +"%Y-%m-%d %H:%M.%S" # 2020-07-01 00:00.00
# 设置系统时间
date -s # 设置当前时间, 须root
date -s "2020-07-01 00:00:00" # 设置全部时间
查看指令帮助手册
man 信息说明
名称 | 描述 |
---|---|
NAME | 显示命令名和一段简短的描述 |
SYNOPSIS | 命令的语法 |
CONFI GURATION | 命令配置信息 |
DESCRIPTION | 命令的一般性描述 |
OPTIONS | 命令选项描述 |
EXIT STATUS | 命令的退出状态指示 |
RETURN VALUE | 命令的返回值 |
ERRORS | 命令的错误消息 |
ENVIRONMENT | 描述所使用的环境变量 |
FILES | 命令用到的文件 |
VERSIONS | 命令的版本信息 |
CONFORMING TO | 命令所遵从的标准 |
NOTES | 其他有帮助的资料 |
BUGS | 提供提交BUG的途径 |
EXAMPLE | 展示命令的用法 |
AUTHORS | 命令开发人员的信息 |
COPYRIGHT | 命令源代码的版权状况 |
SEE ALSO | 与该命令类型的其他命令 |
# 查看 ls 指令帮助手册
man ls
# 可以通过数字来阅读某一部分内容, 比如阅读第一部分
man 1 ls
# -a 在所有手册中查找
man -a ls
# -k, 搜索关键字, 如果忘记了完整的命令可以通过关键字搜索出来,比如 nginx
man -k ngi
将目前动作延迟一段时间, 通常用于脚本当中
时间参数, 这是可选的,默认s:
- s 秒
- m 分钟
- h 小时
- d 天
# 5秒后输出 Hello
sleep 5s; echo Hello
下面是一段 Shell 脚本, 延迟10秒后再去请求
#!/bin/bash
sleep 10s
curl https://www.xiejiahe.com/
列出当前系统使用过的命令,默认保存1000条, 通常保存在 ~/.bash_history
文件中,注意的是只有在Shell退出时才写入到文件。
# 列出当前使用过的命令
history
# 指定要显示的条数
history 50
# 清空历史命令
history -c
# -a 强制写入到 ~/.bash_history 文件中而不用等shell退出才写入
history -a
给命令传递参数的一个过滤器,也是组合多个命令的一个工具, 将左侧的标准输出放进右侧标准输入
。
此命令可以将多次操作简便为一次操作。
# 统计代码
find -name "*.js" | xargs wc -l # 等价于 wc -l a.js b.js c.js ...
# 批量下载文件
cat download.txt | xargs wget
显示当前日历
cal
# 输出
June 2020
Su Mo Tu We Th Fr Sa
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 29 30
# 显示临近3个月, -3 是固定不能更改数字
cal -3
# 打印今天是今年的第几天
cal -j
# 输出:今天日期会高亮显示
October 2020
Su Mo Tu We Th Fr Sa
275 276 277
278 279 280 281 282 283 284
285 286 287 288 289 290 291
292 293 294 295 296 297 298
299 300 301 302 303 304 305
执行数学运算,expr 命令比较鸡助,通常在 shell 脚本当中看到。但在shell脚本也不建议用。
expr 后面每个表达式都要有一个空格,否则是不合法。
注:expr 只支持整数运算,这是一个限制。
# 3
expr 1 + 2
expr 1+2 # 这样是不行的
# 在浮点数计算时会丢失小数, 这里等于 2
expr 5 / 2
bash计算器,用来执行数学运算, 与 expr
不同,因为 expr
命令不支持浮点数运算,所以可以用 bc
命令替代。
bash计算器实际上是一种编程语言,它允许在命令行中输入浮点表达式,然后解释并计算该表达式。最后返回结果。
bc
大多数情况下是在 shell 脚本中使用。
# 敲 bc 然后回车进入交互式, 输入 quit 退出
bc
scale=2 # 保留几位小数,默认是0
5 / 2
# 输出 2.50
在指定时长范围内执行命令,并在规定时间结束后停止进程。
意思是在规定时间内必须完成,否则停止进程。
# 模拟超过3秒, 因为sleep阻塞5秒所以在3秒内无法完成,则停止进程
time 3 sleep 5
# 比如打包, 1分钟内要打包完成,否则停止进程
time 60 npm run build
退出当前登录Shell, 可以使用快捷键退出 Ctrl + D
。
等价命令 logout
exit
vi 编辑器是Unix系统最初的编辑器,在GNU项目将vi编辑器移植到开源世界时,他们决定对其做一些改进,开发人员也就将它重命名为 vi improved
。
vim
(vi improved) 是 vi
的升级版,所以只需要知道 vim
即可, 是一个非强大的文本编辑器,学习成本不低,需要长期使用才能记牢每一个指令操作。
这是一份速查表,使用的时候注意区分大小写。
vim 的快捷键指令非常多,只列出一些实用性便于记忆。
打开文件
# 最简单的打开文件方式, 如果文件不存在会开辟一段新的缓冲区域来编辑。
vim README.md
# 打开文件并定位到最后一行
vim + README.md
# 打开文件并定位到某一行, +号后面指定行数
vim +100 README.md
# 打开多个文件
# :bn 切换下一个文件
# :bp 切换上一个文件
vim 1.txt 2.txt
光标定位插入
快捷键 | 描述 |
---|---|
i | 在当前光标位置插入 |
I | 在当前光标行第一个字符插入 |
a | 在当前光标后一个字符插入 |
A | 光标到当前行最后一个字符插入 |
H | 光标到第一行第一个字符 (是以终端大小来计算,不是原文本的第一行) |
M | 光标到中间第一行 (是以终端大小来计算) |
L | 光标到最后行第一个字符 (是以终端大小来计算) |
E | 将光标定位到右边的空格 |
o | 在当前光标下一行插入 |
O | 在当前光标上一行插入 |
撤销
快捷键 | 描述 |
---|---|
u | 撤销上一次编辑内容 |
U | 撤销当前光标整行内容 |
Ctrl + r | 还原初始文件状态 |
删除
快捷键 | 描述 |
---|---|
dd | 删除当前行 |
dj | 删除上一行 |
dk | 删除下一行 |
:1,$d | 删除所有行 |
拷贝/粘贴
快捷键 | 描述 |
---|---|
yy | 拷贝当前行 |
p | 在当前光标粘贴上一次拷贝的内容 |
搜索
快捷键 | 描述 |
---|---|
:/text | 从上往下查找 text,按 n 向下搜索, 按 N 想前搜索 |
:?text | 从下往上查找 text,按 n 向下搜索, 按 N 想前搜索 |
替换
快捷键 | 描述 |
---|---|
:s/old/new | 找到old第一次出现的地方并用new来替换 |
:s/old/new/g | 找到所有old出现的地方并用new来替换(当前屏幕) |
:%s/old/new/g | 替换整个文件中的所有old |
:%s/old/new/gc | 替换整个文件中的所有old,但在每次出现时提示 |
:n,ms/old/new/g | 替换行号n和m之间的所有old |
退出
先按 ESC
键然后再操作后面的快捷键。
快捷键 | 描述 |
---|---|
:w | 写入但不退出 |
:q! | 退出但不保存 |
:wq | 保存写入内容并退出 |
设置
快捷键 | 描述 |
---|---|
:set ignorecase | 忽略大小写查找 |
:set noignorecase | 不忽略大小写查找 |
:set hlsearch | 高亮搜索结果 |
:set nohlsearch | 关闭高亮搜索显示 |
:set hlsearch | 高亮搜索结果 |
:set number | 显示行号 |
:set nonumber | 不显示行号 |
打印目录或者文件的基本名称。
# 输出:index.html
basename /www/index.html
# 输出 www
basename /www/
read
命令从标准输入(键盘)或另一个文件描述符中接收输入。 通常用在Shell脚本, 在收到输入后,read命令会将数据存放进一个变量。
# 最简单用法, data 是自定义变量名,用户输入内容并回车后结束
read data # echo $data 会打印用户输入的内容
# -p 指定提示符
read -p 确认要删除吗? data
# -t 指定超时(秒)
read -t 5 -p 确认要删除吗? data
# —s 隐藏用户输入,比如密码,实际上是将文本颜色设置成背景颜色一样
read -s -p "请输入您的密码:" data
tee命令相当于管道的一个T型接头,它将从STDIN标准输入
过来的数据同时发往两处,一处是STDOUT
,另一处是tee命令指定的文件名。
tee 命令通常用于 shell 脚本当中。
# date内容打印到屏幕上并且重定向输出到 date.txt 文件中
date | tee date.txt
# -a 以追加方式,默认情况下会覆盖输出文件内容
date | tee -a date.txt
tee
命令只是一个语法糖,如果不用 tee
可以这样做:
# 1、将date结果保存到 var 变量中
var=$(date)
# 2、将结果打印到屏幕上 STDOUT
echo $var
# 3、将结果重定向到文件
echo $var > date.txt
感谢 《Linux命令行与Shell脚本编程大全》 一书,以上部分命令从这本书进行整理出来, 如有错误,欢迎指正,谢谢!