# Linux 命令行常用
# 参考文档
# 三剑客
grep
擅长查找文本,sed
擅长编辑取到的文本,例如取行和替换,awk
擅长格式化文本,对文本进行复杂格式运算处理,例如取列。
# grep
grep
全称是 Global Regular Expression Print,表示全局正则表达式版本。
# sed
sed
命令,即 Stream Editor,是一个文本流编辑器,一次处理一行内容。
sed会依次遍历输入文本流中的每一行,针对每一行,会将当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。然后再处理下一行,这样不断重复,直到文件末尾。原始文本流的内容不会改变。
# awk
# split
在 Linux 中,有时某个文件过大,想要操作的时候可能内存不足或者其他问题,这时可以通过文件分割,将文件分割成多个小文件分别处理,处理完再整合成一个总的文件。
split
是一个用于分割大文件的命令工具,支持按照行数和字节数分割文件,文件分割后为 文件前缀+序号(默认字母)
,不指定前缀则只有序号。
split [-args] [filename] [分割后文件名前缀]
参数:
-a
: 输出文件名的后缀长度(默认为2个:aa,ab...);-d
: 指定输出文件名的后缀用数字代替(从0开始),默认是aa、ab;-l
: 行数分割模式,lines,(指定每多少行切成一个小文件,默认行数是1000行);-b
: 字节数分割,Bytes,支持单位:K、M、G,例如-b 1M
;-C
: 文件大小分割模式(切割时尽量维持每行的完整性),指定每行最大字节数;
注意: 分割后的文件数量不能大于序号能表示的最大值,否则会报错。
按照行数分割
按照字节数分割
文件合并
分割后的文件可以使用 cat
进行合并,例如 a.01、a.02 可以使用 cat a.* > a.final
。
# lsof
lsof
,即 list open files,是一个列出当前系统打开文件的工具,用于查看指定进程打开的文件,是十分方便的系统监视工具。
各列含义:
COMMAND
:正在运行该文件的进程名称;PID
:进程 ID;TID
: 线程 ID;USER
:打开文件的进程所有者;FD
:文件描述符,表示文件在进程中的位置;TYPE
:文件类型,如REG(常规文件)、DIR(目录)、CHR(字符设备)、FIFO(管道)、SOCK(套接字)等;DEVICE
: 打开文件所在的设备的编号;SIZE/OFF
:文件大小或文件偏移量;NODE
:打开文件的节点号码,索引节点号,用于唯一标识文件;NAME
:打开的文件名。
FD
- cwd:表示current work dirctory,即:应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改
- txt:该类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的 /sbin/init 程序
- lnn:库引用 (AIX);
- er:FD信息错误 (see NAME column);
- jld:jail directory (FreeBSD);
- ltx:shared library text (code and data);
- mxx :hex memory-mapped type number xx.
- m86:DOS Merge mapped file;
- mem:内存映射文件;
- mmap:内存映射设备;
- pd:parent directory;
- rtd:root directory;
- tr:kernel trace file (OpenBSD);
- v86 VP/ix mapped file;
- 0:表示标准输出
- 1:表示标准输入
- 2:表示标准错误
常用参数
lsof
: 列出当前系统所有打开的文件。lsof filename
:显示所有打开指定文件的进程。lsof -p PID
:按照 PID 检索。lsof +d /DIR/
:显示指定目录下被进程打开的文件。lsof +D /DIR/
:同样显示目录下被打开的文件,但会遍历目录下的所有子目录,耗时较长。lsof -c string
:显示 COMMAND 列包含特定字符的进程打开的文件。lsof -u username
:显示特定用户所属进程的文件。lsof -d FD
:显示指定文件描述符的进程。lsof -n
:不将IP转换为hostname,默认情况下不使用此参数。lsof -i
:列出所有网络连接,通过以下参数※:[46]
:IPv4或IPv6,lsof -i 4
[protocol]
:TCP或UDPlsof -i :22
,可以查看 22 端口被哪些进程占用。
lsof [path 可省] | grep deleted
查找已经被删除,但是未释放进程锁的文件
在 Linux 中,如果一个文件被某个进程占用,就算 rm
该文件,df
之后会发现磁盘空间未被释放,因为该文件只有在被引用都解除后才会真正被删除。
可以看到上面的文件已经被删除了,但是还被某个进程占用,这时候想要真正释放改文件,需要找到真正引用的进程和位置。
找到被引用的进程下的对应句柄 fd ll /proc/2195527/fd
,找到被删除文件的引用(fd 为 16、17),因为这个fd实际上就是个软链,它直接指向该文件,所以可以直接通过 echo '' > /proc/2195527/16
的方式释放该磁盘占用。剩下的空文件不用管,该进程停止后会自动被清理,这里操作目的是先释放磁盘空间。
引申一下,在正式环境中,可能某个要清理的大文件被某个进程占用,但是这个进程还不能动,这时候尽量采用
echo '' > xxxx
的方式重写内容,不要直接rm
,减少风险。二次补充,大文件可以使用
truncate -s 0 [filename]
的方式清空文件,效率更高。建议日志文件配置 logrotate 进行自动清理。
# expect
apt install expect
或yum -y install expect
expect
主要用于自动化交互操作场景。expect
是基于 TCL
的,使用前需要确保已经安装了 TCL
。
使用流程(spawn 启动指定进程 -> expect 获取指定关键字 -> send 想指定进程发送指定指令 -> 执行完成, 退出
)
spawn
追踪指令,表示开启一个新的进程追踪。expect
捕捉,判断上次输出是否包含指定字符串,如果有则立即返回,否则就等待超时时间后返回,只能捕捉spawn
追踪的进程输出。send
发送,接收一个字符串参数,并将该参数发送到进程(类似模拟人工输入密码),该命令不能自动回车确认输入,一般在输入后添加\r \n
来实现。expect eof
交互结束,与spawn
对应。interact
保留在交互状态。
# 示例
# 这里可以把 expect 当成 if 去理解
# 方式一
# send 跟 expect 放在同一行,需要将 send 用 {} 引起来
expect "密码" {send "123123\r"}
# 方式二
# send 跟 expect 分两行写
expect "密码"
send "123123\r"
# 方式三
# 只要匹配了其中一个情况,执行相应的 send 语句后退出该 expect 语句
expect
"密码1" {send "111111\r"}
"密码2" {send "222222\r"}
"密码3" {send "333333\r"}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# find
find / -name mysql
从 /
目录下,搜索名字为 mysql 的名字或者目录。
-name
文件名-iname
忽略文件名大小写
# netstat
例如: Local Address 中的
0.0.0.0:22
和 Foreign Address 的0.0.0.0:22
区别在于,本地地址是对本机的 IP 限制,外部地址是对外部地址的限制。
0.0.0.0
叫任意地址[Local Address] 如果一个主机存在多块物理网卡,
0.0.0.0:22
表示只要本地开放了 22 端口,无论从本机哪个网卡发起连接请求都是允许的。 若想限制某服务只允许外部从本机指定网卡入口发起访问,则配置成具体网卡的 IP 地址,如192.168.0.3:22
的网卡入口发起。[Foreign Address] 这里的
0.0.0.0
表示允许互联网所有 IP 访问。
结果中状态:
LISTENING
,端口以开放,监听中待连接。ESTABLISHED
,已经建立的连接,这里本地地址和外部地址都不会再出现0.0.0.0
,因为连接方已确认。TIME_WAIT
,等待超时。- ...
常用参数:
-a
(all)显示所有选项,默认不显示 LISTEN 相关-n
拒绝显示别名,能显示数字的全部转化成数字。-o
显示与每个连接相关的所属进程ID-p
显示建立相关链接的程序名 & PID-t
(tcp)仅显示 tcp 相关选项-u
(udp)仅显示 udp 相关选项-l
仅列出有在 Listen (监听) 的服務状态-r
显示路由信息,路由表-e
显示扩展信息,例如 uid 等-s
按各个协议进行统计-c
每隔一个固定时间,执行该 netstat 命令。
提示:LISTEN 和 LISTENING 的状态只有用 -a
或者 -l
才能看到。
常用命令:sudo netstat -anp | grep 8001
# ps
即 process status,查看系统当前的进程状态。
-a
显示所有进程-u
向用户格式化-e
显示所有进程,环境变量,真正所有的进程-C
按程序名称查找-p
按 process ID 查找-w
增加显示宽度-f
全格式-au
显示较详细的资讯-aux
显示所有包含其他使用者的进程--sort
按照某一列排序
常用:
- 按照占用内存大小排序:
ps aux --sort -%MEM
# systemctl
系统服务控制,systemd control,它提供了一组子命令来管理单个的 unit,其命令格式为:
systemctl [command] [unit]
command 主要有:
start
:立刻启动后面接的 unit。stop
:立刻关闭后面接的 unit。restart
:立刻关闭后启动后面接的 unit,亦即执行 stop 再 start 的意思。reload
:不关闭 unit 的情况下,重新载入配置文件,让设置生效。enable
:设置下次开机时,后面接的 unit 会被启动。disable
:设置下次开机时,后面接的 unit 不会被启动。status
:目前后面接的这个 unit 的状态,会列出有没有正在执行、开机时是否启动等信息。is-active
:目前有没有正在运行中。is-enable
:开机时有没有默认要启用这个 unit。kill
:不要被 kill 这个名字吓着了,它其实是向运行 unit 的进程发送信号。show
:列出 unit 的配置。mask
:注销 unit,注销后你就无法启动这个 unit 了。unmask
:取消对 unit 的注销。
# curl
CommandLine URL
或 CommandLine Uniform Resource Locator
,顾名思义,curl
命令是在命令行方式下工作,利用 URL
的语法进行数据的传输或者文件的传输。
- 不带参数,默认发送 GET 请求。
curl http://www.baidu.com
# 常用参数
-d
,用于发送 POST 请求的数据体。- 使用
-d
参数以后,HTTP 请求会自动加上标头Content-Type : application/x-www-form-urlencoded
。并且会自动将请求转为 POST 方法,因此可以省略-X POST
。
- 使用
-H
,添加 HTTP 请求的标头。示例:
curl -d '{"login": "emma", "pass": "123"}' -H 'Content-Type: application/json' https://google.com/login
添加 HTTP 请求的标头是
Content-Type: application/json
,然后用-d参数发送 JSON 数据。
-X
选项,指定请求方式,包括GET
、PUT
、POST
、DELETE
四种方式。curl -X GET www.baidu.com curl -X POST www.baidu.com curl -X DELETE www.baidu.com curl -X PUT www.baidu.com
1
2
3
4
# 不常用参数
像 -A
这种参数可以直接用 -H
代替。
-A
,即User-Agent
,指定客户端的用户代理标头。-b
,用来向服务器发送 Cookie。curl -b 'foo=bar' https://google.com
- 上面的会生成一个标头
Cookie: foo=bar
-c
,将服务器设置的 Cookie 写入一个文件。- ...
# chmod
修改权限,参数有两个,指定哪个用户,指定什么权限。
示例: chmod u+x
chmod +x <filename>
等同于 chmod a+x <filename>
不指定用户默认操作的是 all
# 执行用户
- u,user
- g,group
- o,other
- a,all
# 权限
r
,读权限 4w
,写权限 2x
,可执行权限 1
# 操作
+
,添加-
,移除=
,赋值
# ncdu
ncdu 是一个基于 ncurses
的交互式图形化的磁盘使用情况分析工具,也就是图形化的 du
命令,默认按照占用量从大到小排列。
ncdu [目录]
,例如 ncdu /
将检索根目录下每个目录大小。
操作方式:左键返回上一层,右键进入,D
键删除。
用来替代常用的 du -sh [path]
等命令。
# top
查看系统的资源占用情况,类似于 Windows 的任务管理器。
# free
查看内存的占用情况。
# 子命令
使用 `` 和 $()
作用一致。
# 执行多个命令
执行多个命令时:
- 使用
&&
连接,代表前一个命令必须成功,后一个才执行。 - 使用
||
连接,代表前一个命令必须失败,后一个才执行。 - 使用
;
符号连接多个命令,不管前面是否成功,后面的命令都会执行。
# -- 和 - 的区别
命令后边跟的中划线有一个有两个,区别是:
-
后边跟的是一个字母(也就是缩写),可以跟多个字母代表多个参数。--
后面跟的是一个单词,只是一个参数。
# echo 彩色字
echo -e xxx
中 -e
参数是开启转义,就是后面的内容中如果有转义字符,支持转义。
xxx色彩格式为 \033[显示方式;前景色;背景色m
。
\033
是 ESC 健的八进制。\033[
即告诉终端后面是设置颜色的参数,显示方式、前景色、背景色均是数字,m
结束。- 三个参数(显示方式、前景色、背景色)可以只使用部分。
显示方式 对照表
code | 含义 |
---|---|
0 | 终端默认设置 |
1 | 高亮显示 |
4 | 使用下划线 |
5 | 闪烁 |
7 | 反白显示 |
8 | 不可见 |
字体背景色 对照表
前景色 3x | 背景色4x | 颜色 |
---|---|---|
30 | 40 | 黑色 |
31 | 41 | 红色 |
32 | 42 | 绿色 |
33 | 43 | 黃色 |
34 | 44 | 蓝色 |
35 | 45 | 紫红色 |
36 | 46 | 青蓝色 |
# 示例
echo -e \033[32m hello
输出绿色你好。
注意: 输出带颜色的字符后没有恢复终端默认设置,后续的命令输出仍旧会采用之前的颜色,如果是在脚本中设置了颜色而未恢复,则整个脚本的输出都会采用之前的颜色,因此如果不希望影响后面文字的输出,最好是在输出带颜色的文字之后恢复终端默认设置,如下:
echo -e \033[32m hello \033[0m
输出绿色你好,然后回复终端的默认设置 \033[0m
。
# 讨论区
由于评论过多会影响页面最下方的导航,故将评论区做默认折叠处理。