linux教程¶
- Linux学习教程,Linux入门教程(超详细)
- Linux教程|菜鸟教程- RUNOOB.COM
- Linux面试题100道,看看会多少?
- 所有文章汇总-截止2021年11月3日
- Debian 参考手册
- Debian 管理员手册
- Linux系列文章
- Linux最强总结!
- 10个提高生产力的 Linux 命令与技巧,用完直接起飞!
- Linux基础总结,这一篇就够了
- Linux命令大全(手册)
- Linux 操作必备 150 个命令,速度收藏~
- 干货:Linux 文件和目录操作命令
- Linux命令大全|https://wangchujiang.com/linux-command/hot.html
- 6个已弃用的Linux命令和您应该使用的替代工具
- 技术硬核 | Linux基础操作命令记不住?把这个甩过去!
正则表达式¶
- 正则表达式 – 元字符 | 菜鸟教程 (runoob.com)
- 正则表达式在线测试 | 菜鸟工具 (runoob.com)
- 关于正则表达式中的.,.?,.+?的理解
- 正则表达式和扩展正则表达式
- C语言中的正则表达式使用
- Linux0基础入门,教你如何在Shell中使用正则表达式
终端 Terminal¶
mobxterm¶
xshell¶
作业控制¶
在 Linux 终端中使用作业控制时:
- 使用
ctrl-z可以将当前正在前台运行的进程暂停(挂起)。 - 使用
fg %1(或fg 1)命令可以将编号为1的作业恢复到前台继续执行。 - 使用
jobs命令可以列出当前在后台运行的所有作业及其作业号和状态。
script¶
- 强大的Linux终端行为记录和回放工具:script命令详解
- linux情况屏幕一条命令是,Linux中通过script命令那个记录屏幕的输出
- linux下使用script命令生成^ [和^ M个字符的原因和方法
- 【Linux学习 】Linux使用Script命令来记录并回放终端会话
- 终于知道保存SCP日志了
终端复用tmux¶
- Linux笔记:终端复用与管理工具screen和tmux
- Tmux 使用教程
- Tmux如何让滚屏起飞
- 在tmux缓冲区中搜索
- tmux常用命令及快捷键
- tmux 解决屏幕比例不协调问题
- 【Tmux】窗口周围出现大量点点导致窗口面积减小
Tmux(Terminal Multiplexer)是一款终端复用软件,可以让你在一个终端窗口中运行多个终端会话。以下是一些常用的 tmux 组合键命令:
会话管理¶
- 启动 tmux 会话:
tmux - 新建会话:
tmux new -s <session-name> - 列出会话:
tmux ls - 连接到会话:
tmux attach -t <session-name> - 分离会话:
Ctrl-b d - 选择会话分离: `Ctrl-b Shift-,可以解决【Tmux】窗口周围出现大量点点导致窗口面积减小的问题
- 杀掉会话:
tmux kill-session -t <session-name>
窗口管理¶
- 新建窗口:
Ctrl-b c - 切换窗口:
Ctrl-b n(下一个窗口),Ctrl-b p(上一个窗口),Ctrl-b 0(切换到窗口0),Ctrl-b 1(切换到窗口1) - 选择窗口:
Ctrl-b <window-number> - 重命名窗口:
Ctrl-b , - 关闭窗口:
Ctrl-b & - 列出所有窗口:
Ctrl-b w,使用箭头键选择目标窗口,按回车键切换到选定的窗口。
面板管理¶
- 水平分割面板:
Ctrl-b " - 垂直分割面板:
Ctrl-b % - 切换面板:
Ctrl-b o - 选择面板:
Ctrl-b q然后按面板编号 - 面板之间进行切换:
Ctrl-b <方向键> - 交换面板位置:
Ctrl-b {(向左),Ctrl-b }(向右) - 杀掉面板:
Ctrl-b x - 拆分面板成独立窗口:
Ctrl+b ! - 全屏化当前面板:
Ctrl-b z - 恢复面板原始大小: 再次按
Ctrl-b z - 调整面板大小:
Ctrl-b后加上Alt键和方向键可以调整面板的大小。 - 自动平衡面板:
Ctrl-b后加上Space键自动平衡所有面板大小。
滚动与复制模式¶
- 进入复制模式:
Ctrl-b [ - 退出复制模式:
q - 开始选择文本:
Space - 复制选中文本:
Enter - 粘贴文本:
Ctrl-b ]
在tmux缓冲区中搜索¶
复制模式搜索¶
要在tmux历史记录缓冲区中搜索当前窗口,请按Ctrl- b [进入copy mode。
如果您正在使用emacs键绑定(默认设置),请按Ctrl- s然后输入要搜索的字符串,然后按Enter。按n再次搜索相同的字符串。按Shift- n进行反向搜索。按Escape两次退出copy mode。您可以使用Ctrl- r反向搜索。
请注意,由于tmux可以控制键盘copy mode,所以Ctrl- s不管stty ixon设置如何(我希望stty -ixon在Bash中启用向前搜索)都可以使用-。
如果您使用的是vi键绑定(Ctrl- b:set-window-option -g mode-keys vi),请按,/然后键入要搜索的字符串,然后按Enter。按n再次搜索相同的字符串。与emacs模式一样,按Shift- n进行反向搜索。按q两次退出copy mode。您可以使用?反向搜索。
查找窗口¶
如果要基于其中显示的内容(也包括窗口名称和标题但不包括历史记录)切换到窗口,(从打开多个窗口开始)请按Ctrl- b f然后键入要搜索的字符串,然后按Enter。如果找到该文本,您将切换到包含该文本的窗口。如果有多个窗口匹配,您将看到一个列表可供选择。
选择会话进行分离¶
此功能特别适用于当你在多个会话中工作,并且希望快速分离某个特定会话,而不必使用 Ctrl-b d 分离当前会话或手动输入会话名称。
tmux 嵌套使用¶
当你在本地使用 tmux 登录远程服务器时,如果服务器上也运行了 tmux,常见的问题是:tmux 的指令会被外层会话窗口(本地的 tmux)捕获,导致无法控制服务器上运行的 tmux。比如,当你想通过 Ctrl+b, d 退出服务器上的会话时,结果却退出了本地的 tmux 连接,非常令人沮丧。
解决这个问题的方法其实很简单:按住 Ctrl 键,然后快速按两次 b 键,这样发出的 tmux 指令就会发送到内层会话,也就是服务器上的 tmux,从而实现你想要的操作。
举例:
- 你在本地机器上运行了一个
tmux会话,并通过 SSH 登录到远程服务器。 - 在远程服务器上,你启动了另一个
tmux会话。 - 想要从远程
tmux会话中退出时,不要直接使用Ctrl+b, d,而是按住Ctrl,快速按两次b键,然后按d键。 - 这个操作将使你从远程会话中退出,而本地的
tmux会话不会受到影响。
其他常用命令¶
- 重新加载 tmux 配置:
Ctrl-b :source-file ~/.tmux.conf - 显示时间:
Ctrl-b t - 刷新屏幕:
Ctrl-b r
这些是 tmux 中一些常见的组合键命令,使用这些命令可以大大提高终端操作的效率。你可以通过编辑 ~/.tmux.conf 文件来自定义这些快捷键。
自动退出¶
- 删除 tmux 中的 TMOUT 变量
检查 tmux 的全局环境中是否存在 TMOUT:
使用以下命令删除该环境变量:
解决 tmux 中复制出来的文本尾部带很多空格¶
-
set -g set-clipboard on -
作用:让 tmux 直接把复制的内容同步到系统剪贴板(需要 tmux ≥ 3.2 且终端支持 OSC 52 协议)。
-
好处:
- 复制内容时,tmux 不会按默认的矩形块方式补空格,而是按实际文本长度发到系统剪贴板。
- 相当于跳过了“选区对齐补空格”这一步。
-
set -g mouse on -
作用:允许在 tmux 面板内用鼠标直接选择文本。
-
好处:
- 当启用了
set-clipboard on后,用鼠标框选文本时,直接把选中的真实字符(不补空格)发到系统剪贴板。 - 不需要进入 tmux 的“复制模式”,因此也不会遇到块选区的补空格问题。
- 当启用了
1️⃣ 临时生效(只影响当前 tmux 会话)¶
在 tmux 会话中直接执行:
- 按
Ctrl + b :进入 tmux 命令行模式 - 依次输入:
回车即可立即生效,退出 tmux 后会失效。
2️⃣ 永久生效(每次启动 tmux 都有效)¶
- 编辑配置文件:
- 加入:
- 保存后让配置立即生效:
xterm¶
在 Linux 系统上安装 xterm 终端仿真器,并使用 resize 命令调整 tmux 会话窗口的大小,可以按照以下步骤进行操作:
安装 xterm¶
- 打开终端并输入以下命令以使用
dnf包管理器安装xterm:
- 使用
resize命令调整窗口大小:
history¶
shell¶
- #!/bin/bash 和 #!/usr/bin/env bash 的区别
- 「Linux」shell命令以及运行原理和Linux权限详解
- Linux基础-shell脚本编程
- 一篇教会你写90%的shell脚本 - 知乎 (zhihu.com)
- shell教程(二) 四种工作模式
- linux之登录式shell和非登录式shell
- linux之登录式shell和非登录式shell
父子shell¶
- linux中父shell与子shell(脚本执行的几种方式)_peacewind-CSDN博客
- Linux shell类型,shell父子关系,子shell用法
- Linux多命令顺序执行连接符(; || && |)_Don't lost way-CSDN博客
- Linux中单引号和双引号的区别
set¶
环境变量¶
在 Ubuntu 等使用 PAM(Pluggable Authentication Modules)的系统中,/etc/environment 是在 PAM 模块中读取的,而 /etc/profile 是由 Bourne Shell(例如 Bash)在启动时读取的。
具体来说,在用户登录时,PAM 模块首先读取 /etc/environment 中的环境变量,然后 Bash 或其他 Bourne Shell 在启动时读取 /etc/profile。
所以,/etc/environment 的环境变量会影响整个系统的默认环境,而 /etc/profile 主要影响用户登录 Shell 时的环境。
- Linux设置PATH环境变量的几个地方和设置方法
- Ubuntu环境变量——添加与删除_Beanocean-CSDN博客_ubuntu删除环境变量
- Linux添加路径到PATH环境变量
- Ubuntu下设置环境变量_莫一剑_新浪博客 (sina.com.cn)
- Linux export、set、env和source作用详解
忽略大小写¶
数组¶
test¶
- linux应用之test命令详细解析
- shell 中$()
,\({},\)[] $(()),[ ] (( )) [[ ]]作用与区别 - Shell [[]]详解:检测某个条件是否成立
- 使用shell 判断文件夹或文件是否存在
- Shell test命令(Shell [])详解,附带所有选项及说明
- linux shell中的case语句用法
重定向、后台运行¶
- Shell nohup 命令详解_shadow_zed的博客-CSDN博客
- 你知道2>&1 >/dev/null是什么意思么?
- linux 2>&1和&的意思
- Linux 任务后台运行(总结)
- Linux 编辑启动、停止与重启 jar 包脚本
- stdbuf让nohup实时输出日志
- 命令行实现单个进度条,或者刷新一行的内容
- Linux 标准输入输出、重定向、管道、文件权限、后台启动进程命令
- 深入理解Linux中2>&1的含义
Bash 常用快捷键总结¶
控制相关命令¶
Ctrl+L:清屏。Ctrl+C:终止前台程序。Ctrl+\:终止前台程序(与Ctrl+C类似)。Ctrl+Z:将当前进程挂起并切换到后台。
编辑相关命令¶
Tab:命令补齐。Ctrl+A:光标移到行首。Ctrl+E:光标移到行尾。Ctrl+F:光标前进。Ctrl+B:光标后退。Ctrl+XX:光标在当前位置和行首之间切换。Ctrl+U:删除光标之前的所有内容。Ctrl+K:删除光标之后的所有内容。Ctrl+H:删除光标处前一个字符。Ctrl+D:删除当前光标所在字符。Ctrl+W:删除光标前的单词。Ctrl+Y:粘贴Ctrl+K或Ctrl+W删除的内容。Alt+.或Esc+.:粘贴上一条命令的最后一个参数。
!相关命令¶
!!:快速执行上一条命令。!+字符串:执行最近使用过的以指定字符串开头的命令(如!p执行ping命令)。
历史命令¶
Ctrl+P:历史中上一条命令(与方向键↑作用一样)。Ctrl+N:历史中下一条命令(与方向键↓作用一样)。Ctrl+R:查找历史命令中的关键词。
python¶
ubuntu16.04中将python3设置为默认
直接执行这两个命令即可:
sudo update-alternatives --install /usr/bin/python python /usr/bin/python2 100
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 150
切换到Python2,执行:
时间¶
时间协议¶
登录¶
sudo vs su¶
以下是 sudo、su 及相关命令的行为对比表格,包含 Shell 类型、环境变量处理、$HOME 变化 等关键信息:
sudo 与 su 命令对比总结¶
| 命令 | Shell 类型 | 加载的配置文件 | $HOME 行为 |
环境变量继承 | 是否需要密码 | 典型用途 |
|---|---|---|---|---|---|---|
sudo -s |
非登录 Shell | ~/.bashrc |
强制改为 /root |
部分重置(受 env_reset 影响) |
当前用户密码 | 临时以 root 身份执行命令(不切换完整环境) |
sudo -i |
登录 Shell | /etc/profile, ~/.bash_profile, ~/.profile |
改为 /root |
完全重置(全新 root 环境) | 当前用户密码 | 完全模拟 root 登录(完整环境) |
sudo su - |
登录 Shell | /etc/profile, ~/.bash_profile, ~/.profile |
改为 /root |
完全重置(全新 root 环境) | 当前用户密码 | 同 sudo -i(兼容性写法) |
su |
非登录 Shell | ~/.bashrc |
保持原用户的 $HOME |
继承当前环境(可能混用) | 目标用户密码 | 不推荐(环境变量可能冲突) |
su - |
登录 Shell | /etc/profile, ~/.bash_profile, ~/.profile |
改为目标用户的家目录 | 完全重置(目标用户环境) | 目标用户密码 | 安全切换到目标用户(完整环境) |
sudo -Es |
非登录 Shell | ~/.bashrc |
保持原用户的 $HOME |
保留大部分环境变量(-E 选项) |
当前用户密码 | 需要保留原环境变量的临时 root 操作 |
关键行为说明¶
$HOME变化:sudo -s和sudo -i都会将$HOME改为/root,但前者是 非登录 Shell(仅通过sudo机制强制修改),后者是 登录 Shell(自然行为)。-
su保持原$HOME,而su -会切换。 -
环境变量重置:
sudo默认启用env_reset,会清理危险变量(如PATH),但保留HOME、USER等关键变量。-
su -和sudo -i会加载目标用户的完整环境,而su可能混用环境变量(易出错)。 -
密码差异:
sudo需输入 当前用户密码(依赖/etc/sudoers配置)。su需输入 目标用户密码(直接切换身份)。
使用场景建议¶
| 需求 | 推荐命令 | 理由 |
|---|---|---|
| 临时执行单条 root 命令 | sudo <command> |
无需启动 Shell,安全且最小权限。 |
| 需要完整 root 环境 | sudo -i 或 sudo su - |
完全隔离的环境,避免变量污染。 |
| 保留当前环境变量 | sudo -Es |
调试或需要继承当前配置时使用。 |
| 切换到其他用户(非 root) | su - <username> |
安全加载目标用户环境(如 su - oracle)。 |
附:配置文件加载顺序¶
- 登录 Shell:
/etc/profile→~/.bash_profile→~/.profile - 非登录 Shell:
~/.bashrc(可能通过/etc/bashrc间接加载)
通过此表格可以快速对比不同命令的差异,根据需求选择最合适的权限提升方式!
日志¶
- rsyslog服务及Linux系统日志简介
- Enable Rsyslog Logging on Debian 12
- Linux系统中的日志管理——journal、rsyslog、timedatectl、时间同步
- Linux 下使用 Logrotate 旋转和压缩日志文件
随机数¶
硬件信息¶
lshw¶
查看硬件信息的 class 分类:
查看特定类型的数据:
把硬件信息输出到 html:
dmidecode¶
lstopo¶
图形化展示硬件拓扑结构:
文字信息输出硬件拓扑结构:
进程¶
lsof¶
使用-c查看指定的命令正在使用的文件和网络连接:
lsof -c syslog-ng
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
syslog-ng 7547 root cwd DIR 3,3 4096 2 /
syslog-ng 7547 root rtd DIR 3,3 4096 2 /
syslog-ng 7547 root txt REG 3,3 113524 1064970 /usr/sbin/syslog-ng
-- snipped --
使用-p查看指定进程ID已打开的内容:
lsof -p 10075
-- snipped --
sshd 10068 root mem REG 3,3 34808 850407 /lib/libnss_files-2.4.so
sshd 10068 root mem REG 3,3 34924 850409 /lib/libnss_nis-2.4.so
sshd 10068 root mem REG 3,3 26596 850405 /lib/libnss_compat-2.4.so
sshd 10068 root mem REG 3,3 200152 509940 /usr/lib/libssl.so.0.9.7
sshd 10068 root mem REG 3,3 46216 510014 /usr/lib/liblber-2.3
sshd 10068 root mem REG 3,3 59868 850413 /lib/libresolv-2.4.so
sshd 10068 root mem REG 3,3 1197180 850396 /lib/libc-2.4.so
sshd 10068 root mem REG 3,3 22168 850398 /lib/libcrypt-2.4.so
sshd 10068 root mem REG 3,3 72784 850404 /lib/libnsl-2.4.so
sshd 10068 root mem REG 3,3 70632 850417 /lib/libz.so.1.2.3
sshd 10068 root mem REG 3,3 9992 850416 /lib/libutil-2.4.so
-- snipped --
-t选项只返回PID:
同时使用-t和-c选项以给进程发送 HUP 信号:
查找进程¶
进程与信号¶
杀死进程¶
lsof¶
使用-u显示指定用户打开了什么:
lsof -u daniel
-- snipped --
Dock 155 daniel txt REG 14,2 2798436 823208 /usr/lib/libicucore.A.dylib
Dock 155 daniel txt REG 14,2 1580212 823126 /usr/lib/libobjc.A.dylib
Dock 155 daniel txt REG 14,2 2934184 823498 /usr/lib/libstdc++.6.0.4.dylib
Dock 155 daniel txt REG 14,2 132008 823505 /usr/lib/libgcc_s.1.dylib
Dock 155 daniel txt REG 14,2 212160 823214 /usr/lib/libauto.dylib
-- snipped --
使用-u user来显示除指定用户以外的其它所有用户所做的事情:
lsof -u ^daniel
-- snipped --
Dock 155 jim txt REG 14,2 2798436 823208 /usr/lib/libicucore.A.dylib
Dock 155 jim txt REG 14,2 1580212 823126 /usr/lib/libobjc.A.dylib
Dock 155 jim txt REG 14,2 2934184 823498 /usr/lib/libstdc++.6.0.4.dylib
Dock 155 jim txt REG 14,2 132008 823505 /usr/lib/libgcc_s.1.dylib
Dock 155 jim txt REG 14,2 212160 823214 /usr/lib/libauto.dylib
-- snipped --
杀死指定用户所做的一切事情:
查看进程启动位置¶
列出某一CPU上跑的所有进程¶
列出CPU 43 上的所有进程/线程:
pstree¶
pstree 以树状结构显示进程间的父子关系,比 ps 更直观。常用于追踪进程的启动链、判断某个进程是如何被启动的。
基本用法¶
查看特定 PID 的进程树:
查看进程链(包含父进程、子进程):
常用选项¶
| 选项 | 说明 |
|---|---|
-a |
显示完整命令行参数 |
-p |
显示每个进程的 PID |
-s |
显示指定进程的父进程链 |
-u |
当进程用户与父进程用户不同时,显示用户名 |
-h |
高亮当前进程及其祖先 |
-n |
按 PID 排序(默认按名称排序) |
-c |
不压缩相同子树(禁用 compact 模式) |
-l |
使用长行格式,不截断 |
查看进程的用户¶
pstree 默认不显示用户信息,可通过以下方式确认进程用户:
1. 直接查看进程的用户:
或
2. 让 pstree 显示用户名:
使用 -u 选项可以在进程名旁显示用户切换(只有与父进程用户不同时才显示):
要强制显示每个进程的用户,可以结合 grep 过滤(虽然 -u 的逻辑是显示切换点):
括号里的用户名表示该进程由该用户运行。
3. 从 tmux 会话推导:
如果进程在 tmux 会话中启动,可通过查看该 tmux server 的拥有者来推断:
实战案例:追踪进程启动链¶
假设我们有一个进程 PID 为 2427849,想知道它是谁启动的,以及属于哪个用户。
-
查看启动链:
输出如下(看不到用户信息): -
显示用户信息:
输出如下:括号里的systemd,1 splash └─tmux: server,2009815 new-session -d -s project-x(wujing) └─bash,2038825 └─bash,2427848 └─python3,2427849 -m fastapi run app.py(wujing)表示从tmux开始,进程的用户切换到了wujing。
总结:
- 当前进程 (2427849) 的用户:wujing
- 启动链:systemd(1) (root) → tmux(2009815, wujing) → bash(2038825, wujing) → bash(2427848, wujing) → python3(2427849, wujing)
系统状态¶
- 第10章统计和查看Linux的系统状态
- 61秒,摸透Linux的健康状态!
- linux找出占用内存,占用CPU资源最多的前10个进程_huangbaokang的博客-CSDN博客_linux查看内存占用前十
- 界面酷炫,功能强大!这款Linux性能实时监控工具超好用!
- Linux 中的负载高低和 CPU 开销并不完全对应
- 怎么在Linux系统中查看CPU信息
- 在Linux系统上如何将进程绑定在指定的CPU上运行?
top¶
top主要快捷键¶
- 全局命令:
Z:切换颜色模式。B:切换粗体文本。-
E/e:切换内存缩放。 -
摘要切换:
l:显示负载平均值。t:显示任务/CPU 统计。-
m:显示内存信息。 -
视图切换:
0:显示零值。1, 2, 3:切换 CPU/NUMA 节点视图。-
I:切换 Irix 模式。 -
字段管理与排序:
M:按内存使用量排序。P:按 CPU 使用量排序。T:按时间/累积时间排序。
新增 PSR 字段查看每个进程当前运行的 CPU 核心:
- 按 f 键:进入字段管理模式。
- 使用上下箭头键查找 PSR 字段(表示处理器)。
- 选中 PSR 字段后,按 空格键 或 d 将其标记为显示。
- 按 q 或 Esc 退出字段管理界面,返回主界面。
将 PSR 移动到PID字段前面:
- 按下 f 键进入字段管理界面。
- 使用 上下箭头键 ↑ 和 ↓ 找到 PSR 字段(Processor),然后按 空格键 或 d 键将其启用。
- 接着按 右箭头键 → 将 PSR 选中,这会准备将 PSR 字段移动位置。
- 使用 向上箭头键 ↑ 将 PSR 字段移到列表的最上方位置(或其他你想要的位置)。
- 移动完毕后,按 左箭头键 ← 或 Enter 键确认位置。
- 最后,按 q 或 Esc 键返回 top 主界面。
按 PSR 排序:
- 进入 top 后,按下f 键进入字段管理。
- 使用方向键 ↓ 或 ↑ 移动选择 PSR 字段。
- 按下 s 键将 PSR 字段设为排序字段。此时,进程会默认按 PSR 升序排序。
- 若发现是降序排列,按下 R(Shift + r)键可以反转排序顺序,使之变为升序。
- 确认后按 q 或 Esc 退出设置界面返回 top 界面,即可看到进程按 PSR 升序排列。
- 定位与排序:
L/&:查找/再次查找。</>:移动排序列(左/右)(如按下P后按cpu使用率排序,按下>后可以移动到内存使用率排序)。H:切换线程显示。J:数字字段对齐。-
C:显示坐标。 -
过滤与操作:
o:添加过滤条件(如COMMAND=[可用来过滤内核线程)。- 再次按
o:添加更多过滤条件(如COMMAND=/可用来进一步过滤pre cpu内核线程)。 u:按用户过滤。=:清除所有过滤条件。k:结束任务。-
r:调整任务优先级(renice)。 -
显示选项:
c:显示命令名称/行。i:显示空闲任务。S:显示时间。j:字符串字段对齐。x:排序字段高亮。y:运行任务高亮。z:切换颜色/单色显示。-
b:切换粗体/反转文本。 -
视图模式:
V:切换森林视图,显示树状进程父子关系、线程父子关系,类似pstree。先按H显示线程,再按V切换到森林视图。-
v:隐藏/显示森林视图子项。 -
配置与输出:
d或s:设置更新间隔(秒)。W:保存配置。-
Y:检查其他输出。 -
退出:
q:退出top。
这些操作帮助你高效地使用 top 进行系统监控、排序和进程管理。
根据你提供的 top 命令输出信息,这里是每个部分的解释:
top 命令输出解析¶
- 任务统计:
Tasks: 767 total:系统中总共有 767 个任务。1 running:当前有 1 个任务正在运行。766 sleeping:当前有 766 个任务在休眠状态。0 stopped:没有任务被停止。-
0 zombie:没有僵尸进程。 -
CPU 使用情况:
-
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st:0.0 us:用户空间 CPU 使用百分比。0.0 sy:系统空间 CPU 使用百分比。0.0 ni:用户空间内的优先级 CPU 使用百分比。100.0 id:空闲 CPU 百分比。0.0 wa:等待 I/O 操作的 CPU 百分比。0.0 hi:硬件中断 CPU 使用百分比。0.0 si:软件中断 CPU 使用百分比。0.0 st:虚拟机偷取的 CPU 百分比。
-
内存使用情况:
MiB Mem : 32147.1 total:总内存 32147.1 MiB。26527.6 free:可用内存 26527.6 MiB。648.0 used:已使用内存 648.0 MiB。-
4971.5 buff/cache:缓冲区和缓存占用的内存 4971.5 MiB。 -
交换区使用情况:
MiB Swap: 16144.0 total:总交换区 16144.0 MiB。16144.0 free:可用交换区 16144.0 MiB。0.0 used:已使用交换区 0.0 MiB。-
30980.1 avail Mem:可用内存 30980.1 MiB。 -
进程列表:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND:进程的详细信息,包括 PID、用户、优先级、虚拟内存、常驻内存、共享内存、状态、CPU 使用百分比、内存使用百分比、运行时间和命令。
示例进程:
- 275 root rt 0 0 0 0 S 0.0 0.0 0:01.31 migration/53:
- PID:275
- USER:root
- PR:实时优先级(rt)
- NI:优先级(0)
- VIRT:虚拟内存(0 KB)
- RES:常驻内存(0 KB)
- SHR:共享内存(0 KB)
- S:进程状态(S,休眠)
- %CPU:CPU 使用百分比(0.0%)
- %MEM:内存使用百分比(0.0%)
- TIME+:运行时间(0:01.31)
- COMMAND:进程命令(migration/53)
276 root 20 0 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/53:- PID:276
- USER:root
- PR:普通优先级(20)
- NI:优先级(0)
- VIRT:虚拟内存(0 KB)
- RES:常驻内存(0 KB)
- SHR:共享内存(0 KB)
- S:进程状态(S,休眠)
- %CPU:CPU 使用百分比(0.0%)
- %MEM:内存使用百分比(0.0%)
- TIME+:运行时间(0:00.00)
- COMMAND:进程命令(ksoftirqd/53)
这些信息可以帮助你了解系统的资源使用情况和各个进程的状态。
top 查看某个进程的详细资源使用情况¶
ps aux | grep -i ksmd
root 503 0.0 0.0 0 0 ? SN Jul30 0:00 [ksmd]
wujing 71573 0.0 0.0 213264 892 pts/2 S+ 13:53 0:00 grep --color=auto -i ksmd
-H:显示线程视图,每个线程占用一行。-c:显示完整的命令行。-p 503:只显示进程 ID 为503的信息,包括该进程的所有线程。
此命令用于查看进程 ID 为 503 的进程及其所有线程的详细资源使用情况。

top 查看qemu-kvm进程的详细资源使用情况¶

以下是 top 命令输出中每个字段的详细解释:
- P (PSR): Processor,表示线程当前在运行的物理 CPU 核心编号。
- NU: NUMA 节点编号,指示线程所关联的 NUMA 节点。
- PID: 进程 ID,标识进程的唯一编号。
- USER: 进程的所属用户,即运行该进程的用户。
- PR: 优先级(Priority),数值越小优先级越高。实时优先级范围通常为 0-99,普通优先级范围为 100-139。
- NI: nice 值,用于调整进程的优先级,范围为 -20(最高优先级)到 19(最低优先级)。
- VIRT: 虚拟内存大小(Virtual Memory Size),即进程使用的虚拟地址空间总量,包括交换分区和物理内存。
- RES: 常驻内存(Resident Memory),即进程实际占用的物理内存大小,不包含交换内存。
- SHR: 共享内存(Shared Memory),即进程与其他进程共享的内存大小。
- S: 进程状态(State),通常包括:
R: 运行中(Running)S: 睡眠(Sleeping)D: 不可中断的睡眠(Uninterruptible Sleep)Z: 僵尸进程(Zombie)T: 停止或追踪(Stopped or Traced)
- %CPU: 进程使用的 CPU 百分比,表示进程在最近一段时间内占用的 CPU 资源比例。
- %MEM: 进程使用的物理内存百分比,相对于系统总内存的占用情况。
- TIME+: 进程累计的 CPU 时间,格式为
分钟:秒.百分秒,表示进程启动以来的总 CPU 占用时间。 - COMMAND: 执行的命令行或进程名称。
关于 跨 NUMA 的情况:
在图中,NU 列显示了多个 QEMU 线程分布在不同的 NUMA 节点上(例如,节点 0 和节点 1),这表明 QEMU-KVM 进程的线程确实存在跨 NUMA 的情况。这种分布可能会导致内存访问延迟的增加,因为不同的 NUMA 节点访问内存时会有不同的延迟。如果性能要求较高,建议对线程的 NUMA 亲和性进行优化,以减少跨 NUMA 访问的影响。
htop¶
network¶
端口¶
nc¶
nc是网络工具中的瑞士军刀。
补充说明 nc命令 全称netcat,用于TCP、UDP或unix域套接字(uds)的数据流操作,它可以打开TCP连接,发送UDP数据包,监听任意TCP 和UDP端口,同时也可用作做端口扫描,支持IPv4和IPv6,与Telnet的不同在于nc可以编写脚本。
语法
nc [-hlnruz][-g<网关...>][-G<指向器数目>][-i<延迟秒数>][-o<输出文件>][-p<通信端口>]
[-s<来源位址>][-v...][-w<超时秒数>][主机名称][通信端口...]
选项
-4 只使用IPV4
-6 只使用IPV6
-c 使用tls连接或者监听
-D 启用socket调试开关
-g <网关> # 设置路由器跃程通信网关,最多可设置8个。
-G<指向器数目> # 设置来源路由指向器,其数值为4的倍数。
-h 在线帮助。
-i<延迟秒数> 设置时间间隔,以便传送信息及扫描通信端口。
-l 使用监听模式,管控传入的资料。
-n 直接使用IP地址,而不通过域名服务器。
-o<输出文件> # 指定文件名称,把往来传输的数据以16进制字码倾倒成该文件保存。
-p<通信端口> # 设置本地主机使用的通信端口。
-r 乱数指定本地与远端主机的通信端口。
-s<来源位址> # 设置本地主机送出数据包的IP地址。
-u 使用UDP传输协议。
-v 显示指令执行过程。
-w<超时秒数> # 设置等待连线的时间。
-z 使用0输入/输出模式,只在扫描通信端口时使用。
TCP端口扫描:
nc -v -z -w2 192.168.0.3 1-100
192.168.0.3: inverse host lookup failed: Unknown host
(UNKNOWN) [192.168.0.3] 80 (http) open
(UNKNOWN) [192.168.0.3] 23 (telnet) open
(UNKNOWN) [192.168.0.3] 22 (ssh) open
扫描192.168.0.3 的端口 范围是 1-100 扫描UDP端口:
扫描指定端口,如 80:
端口占用¶
netstat¶
netstat 查看22端口是否被占用:
netstat -s 通常会显示网络协议(如 TCP、UDP、IP)的统计信息,包括:
- 数据包发送和接收的数量
- 错误数(如丢包或校验错误)
- 重传和连接状态
30 Tcp:
31 450966 active connection openings
32 2047 passive connection openings
33 17088 failed connection attempts
34 2423 connection resets received
35 16 connections established
36 8134759 segments received
37 10437736 segments sent out
38 3591 segments retransmitted
39 0 bad segments received
40 15896 resets sent
41 Udp:
42 306430 packets received
43 4 packets to unknown port received
44 0 packet receive errors
45 12051 packets sent
46 0 receive buffer errors
47 0 send buffer errors
48 IgnoredMulti: 5829
lsof¶
使用-i:port来显示与指定端口相关的网络信息:
lsof -i :22
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
sshd 7703 root 3u IPv6 6499 TCP *:ssh (LISTEN)
sshd 7892 root 3u IPv6 6757 TCP 10.10.1.5:ssh->192.168.1.5:49901 (ESTABLISHED)
ss¶
使用 ss 命令查看22端口是否被占用:
这条命令 ss -tulnp | head -n1 输出的是 ss 命令结果的第一行,它显示了 ss 输出的列标题。这些列分别表示:
- Netid: 网络协议类型(如 TCP、UDP 等)。
- State: 套接字状态(如 LISTEN、ESTABLISHED 等)。
- Recv-Q: 接收队列的字节数。
- Send-Q: 发送队列的字节数。
- Local Address:Port: 本地地址和端口。
- Peer Address:Port: 对等地址和端口(在监听状态下为空)。
- Process: 正在使用该套接字的进程及其 PID。
ss -tulnp | grep ':22'
LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=1234,fd=3))
LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=1234,fd=3))
ss 是一个用于查看网络连接、套接字统计和进程信息的工具。常用参数包括:
-t: 显示 TCP 套接字。-u: 显示 UDP 套接字。-l: 仅显示监听状态的套接字。-n: 以数字形式显示地址和端口。-p: 显示使用套接字的进程信息。
例如,sudo ss -tulnp 可以显示当前系统中监听的所有网络端口及其对应的进程。
bond¶
ip¶
- 通过 12 个样例掌握 Linux IP 命令
- 如何将Linux的NIC 名称更改为 eth0 而不是 enps33 或 enp0s25,只要几秒钟
- linux服务器查看公网IP信息的方法 - 小帅豹 - 博客园 (cnblogs.com)
- IP、域名和端口号之间的联系
- Linux中20个高级命令
- A、B、C、D、E类IP地址划分依据
- IP地址划分、子网掩码的作用、实际中IP地址规划
- 刚插上网线,电脑怎么知道自己的IP是什么?
- ip扫描命令 linux,如何使用Linux扫描网络上的IP地址
ipcalc¶
[root@nm08-az2-compute-cm8ne-10e8e94e106 secure]# ipcalc 10.244.208.0/26
Network: 10.244.208.0/26 # 网络地址和前缀长度(CIDR表示法)
Netmask: 255.255.255.192 = 26 # 点分十进制子网掩码及其等效前缀长度
Broadcast: 10.244.208.63 # 广播地址(该子网最后一个IP)
Address space: Private Use # 地址空间类型(RFC1918私有地址)
HostMin: 10.244.208.1 # 可分配的最小主机IP
HostMax: 10.244.208.62 # 可分配的最大主机IP
Hosts/Net: 62 # 可用主机数量(2^6 - 2 = 62)
啥是网络地址、广播地址?¶
在IP网络中,网络地址和广播地址是子网中两个特殊的保留地址,它们有明确的定义和作用:
1. 网络地址(Network Address) • 定义:子网中的第一个IP地址,用于标识整个子网本身。
• 作用:
• 表示“这个子网”,类似于“XX小区”的门牌号。
• 不能被分配给任何设备(如主机、路由器)。
• 示例:
在子网 10.244.208.0/26 中:
• 网络地址是 10.244.208.0。
• 二进制最后6位全为 0(000000)。
2. 广播地址(Broadcast Address) • 定义:子网中的最后一个IP地址,用于向子网内所有设备发送广播消息。
• 作用:
• 发送到广播地址的数据包会被子网内所有主机接收。
• 不能被分配给任何设备。
• 示例:
在子网 10.244.208.0/26 中:
• 广播地址是 10.244.208.63。
• 二进制最后6位全为 1(111111)。
3. 为什么需要保留这两个地址?
| 地址类型 | 保留原因 | 类比解释 |
|---|---|---|
| 网络地址 | 标识子网范围,帮助路由器和设备区分不同子网。 | 类似“XX市XX区”的地域标识。 |
| 广播地址 | 支持ARP、DHCP等协议,允许一次性向子网内所有设备发送通知(如“找网关”)。 | 类似小区广播喇叭,全员通知。 |
4. 如何计算这两个地址?
以 10.244.208.0/26 为例:
- 确定主机位:
/26表示前26位是网络位,后6位是主机位(32 - 26 = 6)。 -
网络地址:
• 主机位全置0:10.244.208.00000000→10.244.208.0。 -
广播地址:
• 主机位全置1:10.244.208.00111111→10.244.208.63。
5. 实际影响 • 可用IP范围:
在 10.244.208.0/26 中,实际可用的主机IP是 10.244.208.1 ~ 10.244.208.62(共62个)。
• 配置错误示例:
• ❌ 将 10.244.208.0 分配给服务器 → 网络不通。
• ❌ 将 10.244.208.63 设为网关 → 广播风暴风险。
6. 常见协议依赖广播地址
• ARP:通过广播地址 FF:FF:FF:FF:FF:FF 解析IP对应的MAC地址。
• DHCP:客户端通过广播地址 255.255.255.255 动态获取IP。
• NTP:时间同步协议可能使用广播。
总结
• 网络地址 = 子网的“身份证”,主机位全 0。
• 广播地址 = 子网的“大喇叭”,主机位全 1。
• 它们不可用作设备IP,但支撑了网络通信的基础功能。
/etc/hosts¶
net-tools iproute2¶
- Iproute2命令集提供完整的底层网络配置能力。有个从旧的net-tools命令集到新的iproute2命令集的转换表。
- ifconfig命令–显示或设置网络设备参数信息
- ip命令是Linux加强版的的网络配置工具,用于代替ifconfig命令。
- ip命令图文详解- Linux系统和网络管理员必备工具
- ifconfig/docker删除虚拟网卡
brctl¶
iptables¶
- 程序员必掌握的iptables五表五链
- iptables 备忘清单
- Linux下 iptables 超详细教程和使用示例
- Iptables 介绍与使用
- 防火墙和iptables
- 深入理解 netfilter 和 iptables
dns¶
- 学习笔记:ubuntu永久修改DNS的两种方法-阿里云开发者社区 (aliyun.com)
- 修改ubuntu 的dns-阿里云开发者社区 (aliyun.com)
- Ubuntu 突然无法联网,ifconfig 查看仅回环IP时,ping 其他IP显示connect: Network is unreachable的解决方法
- Ubuntu 查看IP、网关及DNS
nslookup¶
traceroute¶
traceroute 是一个用于追踪网络数据包从源到目标主机的路径的工具。它显示数据包经过的每一跳(即每一个路由器或网关)以及每一跳的延迟时间。这对于网络故障排查、分析网络路径和了解网络拓扑非常有用。
基本用法¶
例如:
解释输出¶
traceroute 的输出会列出数据包从源到目标主机所经过的每一跳。每一行代表一跳,并显示以下信息:
- 跳数: 每一跳的编号,从 1 开始。
- 路由器 IP 地址: 数据包在这一跳所经过的路由器的 IP 地址。
- 主机名: 该路由器的主机名(如果能解析)。
- 延迟时间: 数据包从源到这一跳的往返时间(通常显示三次)。
常用选项¶
-n: 只显示 IP 地址,而不尝试解析主机名。-I: 使用 ICMP 回显请求(类似于 ping)而不是默认的 UDP 数据包。-T: 使用 TCP SYN 数据包进行追踪。-m <max_hops>: 设置最大跳数,默认为 30。-q <number_of_queries>: 每跳发送的探测包数量,默认为 3。
示例¶
- 基本使用:
输出会显示数据包从你的位置到 Google 服务器经过的路径。
- 使用 ICMP 包进行追踪:
这种方式更接近 ping 的工作方式,可能对某些防火墙更友好。
- 只显示 IP 地址:
这样可以加快追踪速度,尤其在 DNS 解析慢的情况下。
traceroute 工具在网络诊断、排查网络延迟和确定网络路径时非常有帮助。
traceroute原理¶
traceroute 的工作原理基于 IP 数据包的 TTL(Time To Live) 字段,以及 ICMP(Internet Control Message Protocol)消息。它利用 TTL 的特性逐跳追踪数据包的路径,最终显示数据包从源到目标主机的路由信息。
- TTL 字段:
- 每个 IP 数据包都有一个 TTL 字段,表示数据包可以经过的最大路由器数量。
- 当数据包经过一个路由器时,TTL 值会减 1。
-
如果 TTL 值变为 0,路由器会丢弃该数据包,并返回一个 ICMP "Time Exceeded" 消息给发送者。
-
逐跳增加 TTL:
traceroute工具首先发送一个 TTL 为 1 的数据包。- 第一个路由器接收到该数据包后,将 TTL 减 1,TTL 变为 0,于是路由器丢弃该数据包,并返回一个 ICMP "Time Exceeded" 消息。
traceroute记录下这个 ICMP 消息中的路由器信息(如 IP 地址和延迟时间),并将其作为第一个跳的结果输出。- 接着,
traceroute发送一个 TTL 为 2 的数据包,这个数据包能到达第二个路由器,再次触发 "Time Exceeded" 消息。 -
这个过程一直重复,直到数据包到达目标主机,或者达到设置的最大跳数(通常为 30)。
-
识别目标主机:
- 当目标主机收到数据包后,会返回一个 "ICMP Port Unreachable" 消息(如果使用默认的 UDP 数据包)或者一个 TCP/ICMP 响应(如果使用
-I或-T选项)。 -
当
traceroute接收到此消息时,停止追踪,并显示完整路径。 -
延迟时间的计算:
traceroute在每一跳发送三个探测包,并计算从发送数据包到收到 ICMP 响应的时间延迟。这些延迟反映了从源到该跳的往返时间。
其他重要概念¶
-
ICMP:默认情况下,
traceroute使用 UDP 数据包来进行探测,但它依赖于 ICMP "Time Exceeded" 和 "Port Unreachable" 消息来工作。使用-I选项时,traceroute会直接使用 ICMP 回显请求(类似于ping)。 -
端口号:默认情况下,
traceroute使用 UDP 数据包,目标端口号从一个高的值(通常是33434)开始,并逐跳递增。目标主机通常会返回 "ICMP Port Unreachable" 消息,因为这些高端口号大多数没有实际服务监听。
典型问题¶
- 防火墙和路由器过滤:某些防火墙和路由器会阻止 ICMP 或高端口的 UDP 数据包,导致
traceroute无法获取某些跳的路由信息。 - 多路径路由:在有些情况下,路径中的不同跳可能会变化,这导致
traceroute显示不同的路径,特别是在负载均衡环境中。
traceroute 的原理非常适合用来诊断网络问题,了解数据包在网络中的传输路径,并发现可能的瓶颈或故障点。
代理¶
正向代理 反向代理¶
wsl2使用w11代理¶
在WSL 2中,Windows主机的IP通常可以通过以下命令获取:
在WSL中设置代理:
export https_proxy=http://172.27.16.1:7897 http_proxy=http://172.27.16.1:7897 all_proxy=socks5://172.27.16.1:7897
文件系统¶
rm¶
trash-cli¶
Linux 权限¶
- Linux 中的权限(0755或0644或-rwxr-xr-x)
- Linux 特殊权限 SUID,SGID,SBIT
- Linux chmod命令
- chmod 命令——chmod 755与chmod 4755区别(转)
- setuid和setgid权限说明
- Linux 文件系统扩展属性 xattr
- Linux chattr命令详解:修改文件系统的权限属性
- Linux lsattr命令:查看文件系统属性
- Linux常用的设置文件安全上下文命令使用方法
mount¶
/etc/fstab¶
cat /etc/fstab
# /dev/nvme0n1p3
UUID=b8785205-a668-4d32-8cd8-e506b9850f01 / ext4 rw,relatime 0 1
# /dev/nvme0n1p2
UUID=89d974e1-1e99-49ac-a814-b340cc37b17a /boot ext4 rw,relatime 0 2
# /dev/nvme0n1p1
UUID=1762-ADDC /boot/efi vfat rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 2
# /dev/nvme0n1p5
UUID=c614a533-2615-48e9-812d-dccc8871fcea /data ext4 rw,relatime 0 2
# /dev/nvme0n1p6
UUID=5a93ac13-1983-4a13-9e03-97494cf04f79 /recovery ext4 rw,relatime 0 2
# /dev/nvme0n1p7
UUID=3ac2cbc4-96f5-44ae-b7fc-449e3e963508 none swap defaults,pri=-2 0 0
/data/home /home none defaults,bind 0 0
/data/opt /opt none defaults,bind 0 0
/data/root /root none defaults,bind 0 0
/data/var /var none defaults,bind 0 0
# /dev/sda1
UUID=cc5da720-dbfb-4bc2-8f35-f566d1603508 /media/wujing/data ext4 rw,relatime 0 2
/media/wujing/data/Downloads /home/wujing/Downloads none defaults,bind 0 0
/media/wujing/data/Documents /home/wujing/Documents none defaults,bind 0 0
/media/wujing/data/code /home/wujing/code none defaults,bind 0 0
软链接和硬链接¶
- linux里创建快捷方式和查看快捷方式的指向
- 【Linux】:Linux下创建软链接(快捷方式) - Geeksongs - 博客园 (cnblogs.com)
- 「来道题」Linux的软链接
- 5分钟让你明白“软链接”和“硬链接”的区别
- 一文搞懂 Linux 的 inode!
- linux文件-link函数(文件硬链接和软连接)
- Linux中软链接、硬链接以及mount bind的区别
dd¶
lsof¶
显示当前打开的 /var/log/messages 文件及相关进程信息:
lsof /var/log/messages
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
syslog-ng 7547 root 4w REG 3,3 217309 834024 /var/log/messages
lsof /var/log/messages 的输出可能会包含以下几列:
- COMMAND: 打开文件的进程名。
- PID: 进程 ID。
- USER: 进程所属用户。
- FD: 文件描述符(例如
cwd,txt,mem,1,2等)。 - TYPE: 文件类型(例如
REG表示常规文件)。 - DEVICE: 设备号。
- SIZE/OFF: 文件大小或偏移量。
- NODE: 节点号。
- NAME: 文件名或路径。
stat¶
find¶
- Linux下which、whereis、locate、find命令的区别
- find 命令的 7 种用法
- linux shell find命令 查找多种文件后缀
- Linux copy时排除某文件/目录 - 简书 (jianshu.com)
- linux find grep组合使用
- find命令详解
- Linux 中如何获取文件的绝对路径
xargs¶
grep sed awk¶
grep¶
- 三剑客基础详解(grep、sed、awk)
- Linux中grep详解
- grep -s 去掉 no such file or directory
- grep 只从指定文件中查找,并且排除某些文件夹
- grep 命令(在指定文件的文件类型中查找)
- Linux: grep多个关键字“与”和“或”
- grep中的正则表达式
grep 使用 基础正则(BRE)、扩展正则(ERE)、Perl 兼容正则(PCRE) 的核心区别¶
以下是 grep 使用 基础正则(BRE)、扩展正则(ERE)、Perl 兼容正则(PCRE) 的核心区别总结,通过对比表格和示例说明:
1. 核心特性对比¶
| 特性 | 基础正则(BRE) | 扩展正则(ERE) | Perl 兼容正则(PCRE) |
|---|---|---|---|
| 启用选项 | grep(默认) |
grep -E 或 egrep |
grep -P(需支持) |
| 元字符转义 | 大部分元字符需转义(如 \+) |
元字符无需转义(如 +) |
元字符无需转义(如 \d) |
| 高级语法 | 不支持 \|、?、+ 等 |
支持 \|、?、+、{} |
支持零宽断言、非贪婪匹配等 |
| 常见用途 | 简单匹配 | 中等复杂度匹配 | 复杂模式(如日志分析) |
2. 元字符差异示例¶
匹配 "error" 或 "warning"¶
- BRE(需转义):
- ERE(直接使用):
- PCRE(语法同 ERE,但功能更多):
匹配 1~3 位数字¶
- BRE(转义
{}):
- ERE/PCRE(无需转义):
3. 高级功能对比¶
Perl 独有特性¶
\d(数字)、\s(空白符)、\w(单词字符):
- 零宽断言(匹配位置):
- 非贪婪匹配:
4. 使用建议¶
- 简单文本:用默认 BRE(如
grep "pattern")。 - 逻辑或/重复:用 ERE(
grep -E)。 - 复杂模式(如提取数据):用 PCRE(
grep -P)。 - 兼容性:
- macOS 默认
grep不支持-P,需安装 GNU grep(brew install grep)。 - 脚本中优先用
-E保证可移植性。
经典示例¶
提取引号内内容¶
- PCRE(简洁精准):
- ERE(需迂回实现):
总结¶
- BRE:适合基础搜索,但需频繁转义。
- ERE:平衡功能与可读性,推荐日常使用。
- PCRE:处理复杂场景的终极武器,但依赖环境。
根据需求选择正则类型,可以大幅提升文本处理效率!
grep 特殊字符串¶
使用单引号并不能避免 * 等字符被解释为正则表达式的一部分。为了完全匹配包含这些特殊字符的字符串,以下是两种推荐的方式:
- 使用转义字符:
需要对特殊字符进行转义,例如
*和(等,确保它们不会被解释为正则表达式符号。
grep -rn "\(struct wait_queue_entry \*wq_entry, unsigned mode, int flags, void \*key\)" /path/to/source/code
- 使用
-F选项: 如果想避免手动转义所有特殊字符,可以使用grep -F或fgrep,将搜索字符串视为纯文本进行匹配。
grep -rnF "(struct wait_queue_entry *wq_entry, unsigned mode, int flags, void *key)" /path/to/source/code
这两种方式可以帮助你在代码中准确查找包含特殊字符的字符串。
sed¶
复制第 1119 行到 1224 行的内容:
- 在Bash脚本中完成变量替换和指定文件内容替换的方法
- sed 模式分隔符
- sed 字符串替换 - Amei1314 - 博客园 (cnblogs.com)
- sed 功能强大的流式文本编辑器
- linux sed查找文件中某个值,linux查找文件中间某几行之sed用法小结
- linux使用sed命令批量替换某个目录下文件的内容
- sed 脚本分隔符引起的问题unknown option to `s'
- SED命令
awk¶
tail¶
cat EOF¶
tee¶
解压缩¶
- Linux命令之解压缩:tar、zip、rar 命令_阿飞的博客-CSDN博客_linux解压rar包命令
- Linux zip命令 | 菜鸟教程 (runoob.com)
- linux下tar.gz、tar、bz2、zip等解压缩、压缩命令小结_LINUX_操作系统_脚本之家 (jb51.net)
- Linux下tar命令解压到指定的目录
- 想学Linux中的打包和压缩?看这一篇就够了
常用压缩/解压命令(简洁版)¶
.tar.xz 文件(高压缩率,较慢)¶
- 压缩:
- 解压:
.tar.gz 文件(压缩率与速度平衡)¶
- 压缩:
- 解压:
.zip 文件(跨平台兼容)¶
- 压缩:
- 解压:
总结对照表¶
| 格式 | 压缩命令 | 解压命令 |
|---|---|---|
.tar.xz |
tar -cJvf file.tar.xz file/ |
tar -xJvf file.tar.xz |
.tar.gz |
tar -czvf file.tar.gz file/ |
tar -xzvf file.tar.gz |
.zip |
zip -r file.zip file/ |
unzip file.zip |
✅
-v(verbose)参数可选,用于显示详细进度信息。 ✅ 解压.tar.xz/.tar.gz时,-J/-z可省略,tar通常会自动检测格式。
如需进一步精简去掉 -v,可以用如下形式:
.tar.xz:tar -cJf/tar -xJf.tar.gz:tar -czf/tar -xzf.zip:zip -r/unzip
查看压缩包内容¶
下面是关于不解压查看 .tar.xz、.tar.gz、.zip 文件内容的方法总结,适用于 Linux 命令行环境:
✅ 一、.tar.gz 文件查看¶
-t:列出归档内容(list)-z:通过 gzip 解压-f:指定归档文件
示例¶
✅ 二、.tar.xz 文件查看¶
-t:列出内容-v:详细输出(可选)-f:指定文件- 自动识别
.xz压缩,无需手动加-J
示例¶
✅ 三、.zip 文件查看¶
-l:列出 zip 包内文件
或使用更详细格式:
📌 总结对比表¶
| 格式 | 命令 | 说明 |
|---|---|---|
.tar.gz |
tar -tzf file.tar.gz |
查看 gzip 压缩的 tar 包 |
.tar.xz |
tar -tvf file.tar.xz |
查看 xz 压缩的 tar 包 |
.zip |
unzip -l file.zip 或 zipinfo file.zip |
查看 zip 文件内容 |
如需进一步筛选(比如只看 .log 文件或某个目录),可以配合 grep:
分卷压缩¶
以下是三种格式的分卷压缩和解压命令(简洁版),适合大文件分割打包:
.tar.gz / .tar.xz 分卷压缩¶
tar 本身不支持分卷,但可结合 split 命令实现:
压缩并分卷¶
或:
-b 100M指每卷大小,file.tar.gz.part_aa、file.tar.gz.part_ab... 是输出文件名。
合并并解压¶
或:
.zip 分卷压缩(zip 本身支持)¶
压缩并分卷¶
生成
file.z01、file.z02… 和主文件file.zip
解压¶
总结对照表¶
| 格式 | 分卷压缩命令 | 解压命令 |
|---|---|---|
.tar.gz |
tar -czf - dir/ \| split -b 100M - file.tar.gz.part_ |
cat file.tar.gz.part_* \| tar -xzf - |
.tar.xz |
tar -cJf - dir/ \| split -b 100M - file.tar.xz.part_ |
cat file.tar.xz.part_* \| tar -xJf - |
.zip |
zip -r -s 100m file.zip dir/ |
unzip file.zip |
✅ 分卷文件一定不能重命名。 ✅
.zip分卷压缩无需cat合并,直接unzip主.zip文件即可。
远程命令¶
上传下载文件¶
sftp¶
使用 sftp 连接远程服务器时,可以通过 -oPort 选项指定端口。以下是使用 sftp 指定端口的命令示例:
示例¶
假设你要通过端口 2222 连接到名为 example.com 的服务器,并且用户名是 user,可以使用以下命令:
参数说明¶
-oPort=端口号:指定连接到服务器的端口号。用户名@主机名:指定用户名和主机名(或 IP 地址)以进行连接。
这种方式可以让你在连接到非默认端口的 SFTP 服务器时进行指定。
scp¶
使用 scp 命令时,如果需要指定端口,可以使用 -P 选项:
rsync¶
rsync 使用 -e 选项来指定通过 SSH 使用特定的端口:
参数说明:
-a:归档模式,表示递归传输并保持文件属性。-v:详细模式,显示传输过程中的详细信息。-z:压缩传输文件,以减少传输的数据量。-P:显示传输进度,并在传输中断后能够继续传输。-e 'ssh -p 10000':使用指定的 SSH 命令和端口(这里是 10000)。linux-y.tar.gz:要传输的本地文件。root@10.63.8.158:/inf/yql/code:远程服务器的目标路径。
ssh¶
- ssh“权限太开放”错误
- vscode remote ssh多重跳接配置内网穿透
- ubuntu设置 SSH 通过密钥登录
- ubuntu设置 SSH 通过密钥登录 - 盘思动 - 博客园 (cnblogs.com)
- ssh-copy-id命令 – 复制公钥到远程主机
- Linux配置SSH免用户免密码登陆
- SSH的config配置之多账号简单管理
- Win10怎么配置ssh密钥免密连接Linux服务器_windows10_Windows系列_操作系统_脚本之家 (jb51.net)
- Win10配置ssh密钥免密连接Linux服务器 - 大白的攻城狮 - 博客园 (cnblogs.com)
- Mac使用ssh密钥登录Linux - 简书 (jianshu.com)
- Mac通过ssh连接ubuntu_Lynn_mg的博客-CSDN博客
现有三台机器A、B、C,期望从机器A上通过跳板机B免密远程登录机器C。
在机器A上执行如下命令:
ssh-keygen
ssh-copy-id uos@10.20.53.160
# 将机器A的公钥复制到机器B
rsync -avzP ~/.ssh/id_rsa.pub uos@10.20.53.160:~
在机器B上执行如下命令:
ssh-keygen
ssh-copy-id uos@192.168.122.76
# 将机器A的公钥复制到机器C
rsync -avzP ~/id_rsa.pub uos@192.168.122.76:~
在机器C上执行如下命令:
在机器A上的~/.ssh/config添加机器A、B、C配置(机器A是本机,可以忽略):
Host 192.168.122.76-uos20-1060-arm #机器C
HostName 192.168.122.76
User uos
ProxyJump 10.20.53.160-uos20-1060-arm
Host 10.20.53.160-uos20-1060-arm # 机器B
HostName 10.20.53.160
User uos
Host 10.20.53.48-deepin20.9-amd # 机器A
HostName 10.20.53.48
User uos
Windows 11 使用 WSL2 Ubuntu 中的 SSH 配置¶
在 PowerShell(管理员权限)中执行:
# 删除现有配置文件
Remove-Item C:\Users\17895\.ssh\config
# 创建符号链接指向 WSL 中的配置
New-Item -ItemType SymbolicLink -Path "C:\Users\17895\.ssh\config" -Target "\\wsl.localhost\Ubuntu-26.04\home\wujing\code\config\ssh\config"
测试连接:
说明¶
- 通过符号链接实现配置共享
- Windows 直接使用 WSL 中的 SSH 配置文件
- 保持配置统一,便于管理
验证效果¶
命令执行成功后,Windows 11 即可使用 WSL2 Ubuntu 中的 SSH 配置进行连接。
termux¶
crontab计划任务¶
- linux中crontab计划任务怎么删除?_LINUX_操作系统_脚本之家 (jb51.net)
- Linux中的cron计划任务配置详解_Linux教程_Linux公社-Linux系统门户网站 (linuxidc.com)
- 在线crontab表达式执行时间计算工具_蛙蛙在线工具 (iamwawa.cn)
- crontab执行时间计算 - 在线工具 (tool.lu)
Patch¶
BuildStream¶
输入法¶
debian12¶
debian12上安装ibus中文输入法:
其它¶
-
安装OhMyZsh插件后提示错误:“zsh compinit: insecure directories”- bobjoy的个人空间- OSCHINA -中文开源技术交流社区
- vscode cpptools cpu 100%