# 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: 文件大小分割模式(切割时尽量维持每行的完整性),指定每行最大字节数;

注意: 分割后的文件数量不能大于序号能表示的最大值,否则会报错。

  1. 按照行数分割

  2. 按照字节数分割

文件合并

分割后的文件可以使用 cat 进行合并,例如 a.01、a.02 可以使用 cat a.* > a.final

# lsof

先了解 /proc/proc/fd 文件描述符概念

lsof,即 list open files,是一个列出当前系统打开文件的工具,用于查看指定进程打开的文件,是十分方便的系统监视工具。

lsof

各列含义:

  • 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或UDP
    • lsof -i :22,可以查看 22 端口被哪些进程占用。
  • lsof [path 可省] | grep deleted 查找已经被删除,但是未释放进程锁的文件

lsof deleted

在 Linux 中,如果一个文件被某个进程占用,就算 rm 该文件,df 之后会发现磁盘空间未被释放,因为该文件只有在被引用都解除后才会真正被删除。

可以看到上面的文件已经被删除了,但是还被某个进程占用,这时候想要真正释放改文件,需要找到真正引用的进程和位置。

lsof deleted

找到被引用的进程下的对应句柄 fd ll /proc/2195527/fd,找到被删除文件的引用(fd 为 16、17),因为这个fd实际上就是个软链,它直接指向该文件,所以可以直接通过 echo '' > /proc/2195527/16 的方式释放该磁盘占用。剩下的空文件不用管,该进程停止后会自动被清理,这里操作目的是先释放磁盘空间。

引申一下,在正式环境中,可能某个要清理的大文件被某个进程占用,但是这个进程还不能动,这时候尽量采用 echo '' > xxxx 的方式重写内容,不要直接 rm,减少风险。

二次补充,大文件可以使用 truncate -s 0 [filename] 的方式清空文件,效率更高。

建议日志文件配置 logrotate 进行自动清理。

# expect

apt install expectyum -y install expect

expect 主要用于自动化交互操作场景。expect 是基于 TCL 的,使用前需要确保已经安装了 TCL

使用流程(spawn 启动指定进程 -> expect 获取指定关键字 -> send 想指定进程发送指定指令 -> 执行完成, 退出

  1. spawn 追踪指令,表示开启一个新的进程追踪。
  2. expect 捕捉,判断上次输出是否包含指定字符串,如果有则立即返回,否则就等待超时时间后返回,只能捕捉 spawn 追踪的进程输出。
  3. send 发送,接收一个字符串参数,并将该参数发送到进程(类似模拟人工输入密码),该命令不能自动回车确认输入,一般在输入后添加 \r \n 来实现。
  4. expect eof 交互结束,与 spawn 对应。
  5. 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"}
1
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 URLCommandLine 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 选项,指定请求方式,包括 GETPUTPOSTDELETE 四种方式。

    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,读权限 4
  • w,写权限 2
  • x,可执行权限 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

# 讨论区

由于评论过多会影响页面最下方的导航,故将评论区做默认折叠处理。

点击查看评论区内容,渴望您的宝贵建议~
Last Updated: 12/30/2024, 4:39:26 PM