shell常实用命令
文章目录
- 查看系统信息
- 内核
- 压力测试
- 设备
- 环境变量设置
- 编译
- stow
- 脚本类
- 网络设置
- 端口
- 服务/进程管理
- 软件包管理
- 文件类
- tree 显示文件结构
- rename 批量修改文件名
- ls 按指定顺序排布文件
- nautilus终端下指定路径打开文件管理器GUI
- xargs
- 取消patch
- 带单位显示文件大小
- 删除除指定文件(file1)以外文件
- unzip 解压中文乱码的问题:
- 挂载与卸载mount与umount:
- 添加开机自启动脚本
- du&df查看文件夹大小
- find
- grep
- ag查找文件及文字
- 修改文件权限及拥有者
- 修改可执行文件的执行权限
- cp
- dd
- mkdir
- 目录之间的切换cd\pushd\popd
- stat查看文件信息
- lsof
- fuser
- wc统计输出行数
- head & tail
- readelf查看二进制文件信息
- patchelf 更改二进制文件
- 查看二进制依赖库文件信息
- 分卷压缩及解压
- tr 字符转换和删除工具
- sed 指定文本内容替换
- awk
- md5sum校验文件
- 用户操作
- 后台命令
- Vim
- 调试类
- svn
- 内存空间分布图
- 串口
- 其他
| 执行方式 | 工作机制 | 环境变量影响 |
|---|---|---|
source env.sh 或 . env.sh | 在当前Shell进程中直接执行脚本命令 | 会修改当前终端的环境变量 |
./env.sh 或 bash env.sh | 启动一个新的子Shell进程来执行脚本 | 不会影响父Shell(当前终端)的环境变量 |
查看系统信息
查看cpu信息
cat /proc/cpuinfo
64位系统开辟的虚拟存储一般在256TB(2^48)。
address sizes : 39 bits physical, 48 bits virtual
查看系统信息
uname
| 参数 | 说明 | 示例输出 |
|---|---|---|
-s | 显示内核名称(默认行为) | Linux |
-n | 显示网络节点主机名 | myhost |
-r | 最常用:显示内核发行版本(含修订号) | 5.15.0-72-generic |
-v | 显示内核构建版本(通常为编译时间) | #1 SMP Fri Oct 24 06:42:44 UTC |
-m | 显示机器硬件架构(如 x86_64、armv7l) | x86_64 |
-p | 显示处理器类型(部分系统可能返回 unknown) | x86_64 |
-i | 显示硬件平台(同 -m 或更具体信息) | i386 |
-o | 显示操作系统名称 | GNU/Linux |
-a | 最常用:显示所有信息(含上述全部内容) | 完整系统信息(见下方示例) |
查看已安装的内核列表
已安装的内核列表用 dpkg --list | grep linux-image
查看显卡硬件型号:
lspci | grep -E 'VGA|3D'
查看系统log信息
journalctl
journalctl 是 systemd 日志系统的查询工具,用于查看和管理系统日志。以下是常用用法:
常用选项说明
-e:跳转到日志末尾-r:反向输出(从新到旧)-x:显示问题解释和帮助文档--no-pager:不使用分页器--no-hostname:不显示主机名-a:显示全部字段(包括长行)
## **基本查看**
# 查看全部日志
journalctl
# 查看内核日志
journalctl -k
# 查看本次启动后的日志
journalctl -b
# 查看上次启动的日志
journalctl -b -1
## **时间筛选**
# 查看指定时间的日志
journalctl --since "2023-10-01 09:00:00"
journalctl --since "1 hour ago"
journalctl --since yesterday
journalctl --since "2023-10-01" --until "2023-10-02"
# 查看最近日志
journalctl -n 20 # 最后20行
journalctl -f # 实时跟踪(类似 tail -f)
## **服务/单元筛选**
# 查看指定服务的日志
journalctl -u nginx.service
journalctl -u docker
# 查看多个服务
journalctl -u nginx -u mysql
# 按进程ID查看
journalctl _PID=1234
# 按执行路径查看
journalctl /usr/sbin/sshd
## **优先级过滤**
# 按日志级别查看
journalctl -p err # 错误
journalctl -p warning # 警告
journalctl -p info # 信息
journalctl -p debug # 调试
# 查看紧急和错误日志
journalctl -p 0..3 # emerg(0), alert(1), crit(2), err(3)
## **输出格式**
# 不同输出格式
journalctl -o json # JSON格式
journalctl -o json-pretty # 易读JSON
journalctl -o short # 默认短格式
journalctl -o verbose # 完整详细信息
journalctl -o cat # 仅消息内容
## **实用组合**
# 查看指定时间范围的错误日志
journalctl -p err --since "2 hours ago"
# 实时查看服务日志
journalctl -fu nginx
# 查看引导过程日志
journalctl -b | grep -i "error\|fail"
# 查看磁盘占用
journalctl --disk-usage
# 清理日志(保留指定大小)
journalctl --vacuum-size=500M
journalctl --vacuum-time=1months
## **高级用法**
# 从持久存储查看所有日志(包括已归档)
journalctl --merge
# 指定日志文件位置
journalctl --file=/var/log/journal/hostname/system.journal
# 显示日志字段
journalctl -o verbose | grep -E "(MESSAGE|_UID|_PID)"
# 输出到文件
journalctl --since today > /tmp/today.log
## **实际示例**
# 查看系统启动问题
journalctl -b | grep -i "fail\|error\|timeout"
# 监控登录尝试
journalctl -f _COMM=sshd
# 查看内存使用最多的日志
journalctl --no-pager --output=short --no-hostname | awk '{print length, $0}' | sort -nr | head -20
# 导出今天的错误日志
journalctl -p err --since today --until now > errors.log
查看最近的日志信息:journalctl -xe
查看指定进程的日志信息:journalctl _SYSTEMD_UNIT=unit_name
查看以前引导的所有日志:journalctl --list-boots
查看上一次系统引导的日志:journalctl -b -1
内核
开机内核信息查看
dmesg 只能打印当前开机之后的log
dmesg -T 按日期显示信息
dmesg H人性化显示
dmesg -w 实时监控
串口信息查看
dmesg|grep ttyS*
查看内核版本
uname -r
内核模块存放地址: /lib/modules/
depmod命令会扫描系统中的内核模块,并写入modules.dep文件
depmod [opts]
-a:扫描所有模块;
-A:扫描新模块,只有有新模块时,才会更新modules.dep文件;
-n:把扫描结果不写入modules.dep文件,而是输出到屏幕上;
查看系统安装的内核模块
lsmod
查看模块信息
modinfo [modname]
内核模块的添加与删除
modprobe [opts] [modname]
-I:列出所有模块的文件名,依赖 modules.dep 文件;
-f:强制加载模块;
-r:删除模块;
加载模块
insmod只能加载编译好的.ko文件;modprobe可以自动解析模块依赖加载
insmod [-fkmpsvxX][-o <模块名称>][模块文件][符号名称 = 符号值]
-f 不检查目前kernel版本与模块编译时的kernel版本是否一致,强制将模块载入。
-k 将模块设置为自动卸除。
-m 输出模块的载入信息。
-o<模块名称> 指定模块的名称,可使用模块文件的文件名。
-p 测试模块是否能正确地载入kernel。
-s 将所有信息记录在系统记录文件中。
-v 执行时显示详细的信息。
-x 不要汇出模块的外部符号。
-X 汇出模块所有的外部符号,此为预设置。
压力测试
测试cpu及内存。stress & stress-ng
sudo apt install stress-ng
可通过lscpu及 ls /sys/devices/system/cpu来查看cpu个数
对8个cpu进行压力测试,时间60s
stress-ng --cpu 8 -t 60
内存测试,启动虚拟内存负载,分配并保持2GB的内存,并运行60秒。
sudo stress-ng --vm 1 --vm-bytes 2G --vm-keep -t 60s
设备
ubuntu 显卡镜像源
1.打开终端添加镜像源
sudo add-apt-repository ppa:graphics-drivers/ppa
2.更新库
sudo apt-get update
3.更新安装包
sudo apt upgrade
4.查看drives
ubuntu-drivers devices
重新加载usb设备
sudo udevadm control --reload-rules && udevadm trigger
查看u设备信息
# 查看所有 ttyUSB 设备的详细信息
udevadm info -a -n /dev/ttyUSB0 | less
# 或者查看特定属性
udevadm info -a -n /dev/ttyUSB0 | grep -E "(idVendor|idProduct|serial)"
#使用`dmesg`过滤设备接入时的内核日志:
dmesg | grep -i "usb\|tty" # 显示USB设备挂载信息
#使用`udevadm`获取设备属性(需替换实际设备路径):
udevadm info -a -p $(udevadm info -q path -n /dev/ttyUSB0)
如果存在串口在/dev下不显示的问题,
使用:dmesg | grep -i usb查看 内核log,是不是跟 brltty有关,是的话,需要卸载
sudo apt-get purge brltty。仅使用sudo systemctl stop brltty 没有解决。
linux 固定usb设备挂在节点名
linux下多个usb设备固定名称方法
在/etc/udev/rules.d/创建xxx.rules文件
对应填入:以下内容,将KERNELS参数替换成设备号,SYMLINK参数设置为你想定义的节点名称。
ACTION=="add",KERNELS=="1-2:1.0",SUBSYSTEMS=="usb",MODE:="0777",SYMLINK+="name"
设备编号:通过lls /sys/class/tty/ttyUSB* -l来查看。以下红色部分为设备编号。
lrwxrwxrwx root root 2017-08-01 13:40 ttyUSB0 -> …/…/devices/ff540000.usb/usb3/3-1/3-1.1/3-1.1:1.0/ttyUSB0/tty/ttyUSB0
而后重启
service udev reload
service udev restar
环境变量设置
添加可执行文件路径到环境变量
export PATH=$PATH:/要添加的路径
man查看命令及函数用法
1 用于查系统命令:eg. man 1 ls,
2 查系统调用:eg. man 2 open,
3 标准函数:eg. man 3 sleep,
默认1:不输入数字默认执行man 1:eg. man sleep
编译环境变量设置
清除环境变量
unset ROS_PACKAGE_PATH
gcc找到头文件的路径
export C_INCLUDE_PATH=$C_INCLUDE_PATH:/MyLib
g++找到头文件的路径
export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/MyLib
添加共享库路径到环境变量
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/your_lib_path
也可以在 /etc/ld.so.conf 或者 /etc/ld.so.conf.d/文件中添加库的搜索路径,然后执行ldconfig
注意:LD_LIBRARY_PATH 是 程序运行时 动态链接器(ld.so)用于查找共享库(.so)的环境变量,它只影响已经编译好的程序在运行时如何找到依赖库。
ldconfig <ld_lib_path>可以加载该ld_lib_path路径到库链接路径,即执行该命令后,ld_lib_path路径下得库文件可以被找到并链接。
# 添加新库路径并更新动态库缓存
sudo sh -c "echo /usr/lib/x86_64-linux-gnu > /etc/ld.so.conf.d/kdl.conf"
sudo ldconfig
ldconfig 扫描默认库路径(/lib、/usr/lib)和配置文件 /etc/ld.so.conf 中列出的目录,生成动态链接库的缓存文件 /etc/ld.so.cache。该缓存供运行时链接器(ld.so)快速定位共享库,避免每次加载程序时全盘搜索库文件。
找到静态库的路径
export LIBRARY_PATH=$LIBRARY_PATH:/MyLib
g++
编译优化
在G++中,-O2 是优化级别选项,表示启用第二级别的编译器优化。这是一个非常重要的编译选项,下面详细解释它的含义和作用:
G++提供了多个优化级别,从 -O0 到 -O3,数字越大优化程度越高:
| 优化级别 | 描述 | 适用场景 |
|---|---|---|
| -O0 | 无优化(默认) | 调试阶段,编译速度快 |
| -O1 | 基本优化 | 平衡优化和编译时间 |
| -O2 | 全面优化 | 发布版本的推荐选择 |
| -O3 | 激进优化 | 性能极致追求,可能增加代码大小 |
| -Os | 优化代码大小 | 嵌入式等存储受限环境 |
-O2 开启了大多数安全的优化,包括但不限于:
- 内联函数优化
- 循环优化
- 死代码消除
- 常量传播和折叠
指定链接库
在 C/C++ 编译链接过程中,是否需要用 -l 显式指定库文件,主要由编译器的默认行为和运行时库的依赖机制决定。
根据编译器的处理逻辑,库可分为以下两类:
| 库类型 | 是否需要 -l | 典型示例 | 原因 |
|---|---|---|---|
| 编译器隐式链接的库 | 不需要 | libc (C标准库) libstdc++ (C++标准库) | 编译器自动识别语言特性并链接,无需手动指定(如用 g++ 编译时自动链接 libstdc++.so) |
| 需显式指定的库 | 需要 | pthread z (zlib) 自定义库 | 非语言核心功能库,需用户显式声明依赖关系 |
-
编译器自动链接运行时库
- 语言核心库自动处理
g++编译 C++ 代码时,自动添加-lstdc++;gcc编译 C 代码时,自动添加-lc(C标准库)。- 原理:编译器(如
g++)本质是“包装器”,调用底层链接器时自动传递语言标准库参数。
- 例外情况:若使用
gcc编译 C++ 代码,需手动添加-lstdc++(因gcc默认按 C 语言处理)。
- 语言核心库自动处理
-
非核心库需显式指定
- 系统功能库(如
pthread)
虽为系统库,但不属于语言核心,需显式指定-lpthread(因为线程支持是可选的扩展功能)。 - 第三方/自定义库
所有非编译器默认处理的库(如数学库-lm、压缩库-lz或项目自定义库),均需通过-l指定。
- 系统功能库(如
-
路径搜索规则的差异
- 默认路径:编译器自动在
/lib、/usr/lib等目录搜索隐式库,无需-L指定。 - 自定义路径:若库文件不在默认路径,必须通过
-L指定目录 +-l指定库名。gcc main.c -o app -L./mylib -lmylib # 链接 ./mylib/libmylib.so
- 默认路径:编译器自动在
- 检查已链接库:
ldd ./your_program # 查看动态库依赖 readelf -d ./your_program | grep NEEDED # 查看所有依赖库 - 确认隐式库:
若输出包含libc.so.6或libstdc++.so.6,说明标准库已自动链接。
注意事项:动态库需确保运行时路径正确(通过
-Wl,-rpath或LD_LIBRARY_PATH设置)。
-Wl,-rpath是编译时嵌入到二进制文件中的路径信息,优先级极高(仅次于LD_PRELOAD),属于"硬编码"方式,适合固定部署路径的场景。
LD_LIBRARY_PATH是运行时环境变量,灵活性高但需要用户显式设置,优先级低于rpath但高于系统路径,适合临时调试或未固定安装路径的情况。
- 使用pkg-config,见pkg-config
- 直接使用-L指定位置
eg:Sophus使用:
指定目录:
g++ Sophus.cpp -L /home/xxx/Sophus/build/ -lSophus -o xxx
eg:多个库:
g++ zhijiefa.cpp -lSophus `pkg-config eigen3 --libs --cflags` `pkg-config --libs --cflags opencv`
g++ zhijiefa.cpp -L ~/Download/softpackages/Sophus/build -I ~/Download/softpackages/Sophus `pkg-config eigen3 --libs --cflags`- 使用
-Wl,-rpath=将库路径直接写入二进制文件(可执行文件/库)
gcc -o myapp main.c -L/path/to/libs -lmylib -Wl,-rpath=/path/to/libs
-L/path/to/libs:确保编译时链接器找到libmylib.so。-Wl,-rpath=/path/to/libs:确保运行时程序从该路径加载库。
优先级规则:运行时搜索顺序为:-rpath指定路径 → LD_LIBRARY_PATH环境变量 → 系统默认路径(如/usr/lib)。
| 选项 | 作用阶段 | 是否必须 | 典型用途 |
|---|---|---|---|
-L | 链接阶段 | ✅(库在非标准路径时必需) | 指引编译器找到 -lxxx 指定的库 |
-rpath | 运行阶段 | ✅(避免运行时加载失败) | 嵌入库路径到二进制文件,提升可移植性 |
LD_LIBRARY_PATH | 运行阶段 | ❌(临时替代方案) | 通过环境变量指定运行时路径,但依赖用户配置 |
ubuntu ctrl + Alt +F(1~6)会进入终端模式, ctrl + Alt +F7退出终端模式
锁定终端
ctrl+s 可以锁定终端,不能继续操作,ctrl+q解锁终端
编译
卸载通过make install 的安装
cat install_manifest.txt | sudo xargs rm -f
cmake
查看cmake可配置项:
cmake . -LA
cmakelist.txt中的变量,在命令行配置时,前加‘-D’
如:
CMAKE_BUILD_TYPE 设置模式是Debug还是Release模式
SET(CMAKE_BUILD_TYPE "Debug”)
or
SET(CMAKE_BUILD_TYPE "Release")
也可以在执行cmake命令式在外部执行:
cmake -DCMAKE_BUILD_TYPE=Release ..
make
# make -j 自动指定线程 根据cpu核数
make -j$(nproc)
# 卸载make install的安装
# 对于 install_manifest.txt(推荐)
cat install_manifest.txt | sudo xargs rm -f
# 对于 install.log(需手动筛选路径)
grep -o '/[^ ]*' install.log | sudo xargs rm -f
stow
stow 是一款轻量级的文件管理工具,主要通过创建符号链接(symbolic links)来管理软件包或目录,
stow <包名>:为指定包创建符号链接(部署),默认目标目录是当前目录的上级目录
stow -D <包名>:删除指定包的符号链接(卸载)
stow -R <包名>:更新指定包的链接(先卸载再重新部署)
stow -n <包名>:预览部署/卸载操作(不实际执行)
stow <包名> -t <目标目录>:指定目标目录部署(如 -t /usr/local)
sudo stow <包名> -t <系统目录>:以管理员权限部署到系统目录(如 /usr/local)
脚本类
执行命令时自动输入‘y’
echo y | cmd
ssh
利用ssh远程执行服务器命令
fuction expect_server()
{
expect <<EOF
set timeout 1000
spawn $@
expect {
"(yes/no)?" {send "yes\r"; exp_continue}
"*asswor*" {send "${SERVER_PASSWD}\r"; exp_continue}
eof
}
EOF
}
expect_server ssh server@xxx.xxx.xxx.xxx [cmd]
来判断$arg有没有被赋值,条件成立则没有被赋值。**
shell if[X$arg = X];then
打开ssh服务:
问题:ssh: connect to host xxx port 22: Connection refused解决
问题原因可能是:ssh-server未安装或者未启动。
ubuntu 11.10 默认安装openssh-client,但是木有安装server。
运行 ps -e | grep ssh,查看是否有sshd进程。
如果没有,说明server没启动,通过 service sshd start (或 /etc/init.d/ssh -start)启动server进程,如果提示ssh不存在 那么就是没安装server。
通过 sudo apt-get install openssh-server命令安装即可。
远程命令行需要运行图形类程序
以下命令会启用当前环境的图像软件。即需要当前的ssh所处的系统下图形桌面环境配置
ssh hostname@ip -X或ssh hostname@hostname -X
指定端口号登录及scp
ssh -p 2200 [user_name]@[user_ip]
从远程机拷贝文件
scp -P 2200 [user_name]@[user_ip]:file_path destination_path
rsync+ssh实现断点续传:https://www.cnblogs.com/liuyihua1992/p/9602313.html
rsync 是支持断点续传的工具,可通过 SSH 协议加密传输,适用于替代 scp 的大文件传输场景:
-
基本命令:
rsync --partial --progress -e ssh /本地/文件路径 用户@远程主机:/目标/路径--partial:保留未完全传输的文件,便于续传。--progress:显示实时传输进度。-e ssh:指定 SSH 作为传输协议(默认支持,可省略)。
-
常用增强参数:
-a:归档模式,保留文件属性(权限、时间戳等)。-z:启用压缩传输,减少带宽占用。--exclude=:排除指定文件或目录。
-
示例:
# 本地到远程传输 rsync -P -e ssh pic.tar.gz user@192.168.1.100:/home/ # 远程到本地下载 rsync -P -e ssh user@192.168.1.100:/home/pic.tar.gz ./
网络设置
命令行修改ip
ifconfig eth0 192.168.1.23
查看路由网关信息
netstat -rn或route -n
查看是否能够连接外网
ping 114.114.114.114
ping 1.2.4.8
命令行连接WiFi
- 方法一:使用
nmtui(文本用户界面 - 最推荐)
nmtui 是 NetworkManager 的文本界面工具,非常直观,适合新手和所有用户。
-
打开终端 (Ctrl+Alt+T)。
-
启动
nmtui:sudo nmtui -
选择操作:
- 使用键盘上下箭头选择
Activate a connection(激活连接),然后按回车。
- 使用键盘上下箭头选择
-
选择网络:
- 在列表中找到你要连接的 Wi-Fi 网络名称 (SSID),使用箭头键选中它。
- 如果网络是受保护的,底部会出现
Password输入框。 - 按 Tab 键切换到
<Activate>(激活)按钮,然后按回车。
-
输入密码:
- 如果需要密码,会弹出输入框。输入你的 Wi-Fi 密码。
- 按 Tab 键切换到
<OK>,然后按回车。
-
完成连接:
- 成功后,你会回到主菜单。按 Tab 键切换到
<Back>(返回),最后选择<Quit>(退出)。
- 成功后,你会回到主菜单。按 Tab 键切换到
验证连接:
ping -c 4 1.2.4.8
如果能看到数据包返回,说明连接成功。
- 方法二:使用
nmcli(命令行界面 - 功能最强大)
nmcli 是 NetworkManager 的命令行客户端,功能全面,适合脚本编写和高级用户。
## 步骤 1:列出可用的 Wi-Fi 设备和工作网络
nmcli device wifi list
# 或简写
nmcli d w l
# 这会显示所有可扫描到的 Wi-Fi 网络及其信号强度、加密方式等信息。记住你要连接的网络的 `SSID`。
## 步骤 2:连接到 Wi-Fi 网络
# 情况 A:连接开放网络(无密码)
sudo nmcli device wifi connect your_ssid
# 例如: sudo nmcli d w c "Free_WiFi"
# 情况 B:连接受保护网络(有密码 - 最常用)
sudo nmcli device wifi connect your_ssid password your_password
# 例如: sudo nmcli d w c "networkname" password "password"
# 情况 C:如果上述命令失败(特别是旧版Ubuntu),可以尝试先扫描再连接
sudo nmcli device wifi rescan # 先重新扫描
sudo nmcli device wifi connect your_ssid password your_password
## 步骤 3:检查连接状态
nmcli connection show
# 或者查看设备状态
nmcli device status
- 方法三:手动配置
wpa_supplicant(传统方法,适用于无 NetworkManager 的系统)
如果您的系统没有安装 NetworkManager(例如服务器最小化安装),可以使用此方法。
## 步骤 1:找到无线网卡设备名,查找名称中包含 `wlan` 或 `wl` 的设备。
# 通常是 `wlan0` 或 `wlp2s0` 等。
ip a
# 或
ls /sys/class/net
## 步骤 2:生成 Wi-Fi 配置
# 生成加密后的密码:
# 为了避免在配置文件中明文存储密码,我们可以使用 `wpa_passphrase` 工具。
wpa_passphrase your_ssid your_password | sudo tee -a /etc/wpa_supplicant.conf
# 这会将网络配置追加到 `/etc/wpa_supplicant.conf` 文件中。输出结果类似于:
network={
ssid="MyHomeNetwork"
#psk="mysecretpassword"
psk=ed6f3c0d5e0c6e383a0c6e19e2c0c6e383a0c6e19e2c0c6e383a0c6e19e2c0c
}
## 步骤 3:连接网络
# 1. 首先,确保接口已启动:
sudo ip link set wlan0 up
# 2. 使用 `wpa_supplicant` 连接:
# -i 指定接口名 (如 wlan0)
# -c 指定配置文件路径
# -B 在后台运行 (Daemon)
sudo wpa_supplicant -i wlan0 -c /etc/wpa_supplicant.conf -B
# 3. **通过 DHCP 获取 IP 地址**:
sudo dhclient wlan0
## 步骤 4:验证连接(同上)
ping -c 4 google.com
- 故障排除常用命令
# 重启网络服务** (如果使用 NetworkManager):
sudo systemctl restart NetworkManager
# 重新扫描网络:
nmcli device wifi rescan
# 忘记/删除一个已有连接:
nmcli connection delete "your_ssid"
# 查看详细的连接日志:
journalctl -f -u NetworkManager
路由查看及配置
查看路由表:路由表的目的是告诉网关,包到达目标地址的下一站。
以下命令都可打印路由表
1.netstat -rn
2.route -n
3.ip route
路由原理-https://www.jb51.net/network/59230.html
静态路由表:
192.168.1.0 255.255.255.0 192.168.2.0
默认路由表:
目的地址 网关 掩码
0.0.0.0 172.18.47.254 0.0.0.0
路由表主要有:目的地址、送出接口/下一跳地址、目标地址局域网掩码
目的地址:要连接的目标主机的ip地址
下一跳地址:目标地址的网关所用的ip,这个ip是该网关所连接它的路由器的lan口ip,不是自定义的xxx.1
0.0.0.0 表示对应所有目的地址,都通过访问172.18.47.254来解析地址并中转;此为默认路由,默认路由也是静态路由的一种。
https://blog.51cto.com/zhaoyuqiang/1177924
添加路由
ip router [目的ip] [目的掩码] [目的ip连接路由器ip]
关于集线器,交换机,路由器的区别
https://www.bilibili.com/video/BV1LC4y187Ew?t=398
集线器:广播消息到所有连接到集线器上的设备,使用场景小,耗流量,占带宽
交换机:工作用链路层,能够解析协议第二层mac地址,查找对应连接设备mac地址表,实现对点转发消息,效率高,常和路由器连用。只能转发连接到交换机的设备。
路由器:智能设备,工作在ip层,解析网络第三层ip地址及路由表,实现消息的智能转发。能够实现跨网转发包
端口
查看端口信息
ss: netstat短命令:
# 查看指定端口
ss -tlpn | grep [端口号]
#查看所有已建立连接(含源端口+目的端口)
ss -tuna
netstat -tunlp 查看端口号的占用信息,可以打印出占用程序及程序ID
以下来自https://blog.csdn.net/tjzhuorui/article/details/70641922
netstat [options]:
-a 显示所有项
-n 将能显示成数字的显示成数字,比如 Local Address,若不使用-n,有可能显示的是你的机器名;但使用-n,则显示的是127.0.0.1
-t 显示所有tcp的
-u 显示所有udp的
-p 显示程序名以及pid
ps -ejHf | grep 441 查看进程执行信息
lsof -i [端口号]
查看ssh端口开放状态
netstat -anp |grep 22
netstat -anp |grep ssh
lsof -i :22
端口传输数据查看
抓取报文
tcpdump可抓取tcp/udp包,也可查看端口的绑定(bind)情况。
eg: tcpdump -i any -nn 'port 9002' -vv -X
-i interface,网卡的名称,后面可以跟具体的网卡名称(ifconfig后者tcpdump -D)获取,any似乎是指所有的网卡
-nn 监听host或者port名,ip地址为127.0.0.1,端口为9002的服务器的数据包,那么命令可以写成-nn ‘src host 127.0.0.1 and port 9002’,有端口就可以。
-vv 详细信息
-X 以16进制的格式输出
tcpdump -nn any port 80 or port 443 你会看到类似:
192.168.1.100.54321 > 1.1.1.1.443
54321 就是发送数据的源端口。
查看端口带宽占用
# 在主机或从机上,抓取11311端口的包,持续10秒,统计总字节数
sudo tcpdump -i eth0 port 11311 -w - | dd of=/dev/null bs=1 count=1000000 # 实时显示流量
# 计算平均带宽:结合time命令统计 10 秒内的总流量,计算平均带宽:
# 示例:统计10秒内的总字节数
sudo tcpdump -i eth0 port 11311 -c 0 -w - | ( sleep 10; kill $! ) | wc -c
or:
sudo apt-get install iftop # Ubuntu/Debian
sudo iftop -i [实际网卡名称] -f "port 11311" # 替换[实际网卡名称] 为实际网卡(如eth0,wlan0、enp0s3)
# iftop过滤主机 IP + 端口:
sudo iftop -i [实际网卡名称] -f "port 11311 and host 192.168.x.xxx and host 192.168.x.xxx"
sudo iftop -i [实际网卡名称] -f "host 192.168.x.xxx and host 192.168.x.xxx"
直接查看整个网口流量速度
sudo iftop -i eth0 # 监控eth0网卡的实时流量
nload eth0 # 监控eth0网卡的总流量(包含11311端口)
检查目标端口连通性
telnet <主机名或IP地址> <端口号>
ping -c 4 192.168.1.103
服务/进程管理
kill/killall/pkill:记住核心原则:优先精准(kill),再批量(killall),灵活筛选用pkill;信号优先-15,强制终止用-9(最后手段)。
| 命令 | 作用对象 | 核心能力 | 默认信号 | 核心场景 |
|---|---|---|---|---|
kill | 单个/多个 PID(进程ID) | 精准发送任意信号(终止、暂停等) | SIGTERM(15) | 精准控制单个进程(如卡死的单个程序) |
killall | 所有 同名进程 | 按进程名批量发送信号 | SIGTERM(15) | 批量终止同名进程(如所有Python脚本) |
pkill | 进程名(支持模糊)/属性(用户、端口等) | 灵活匹配+批量发送信号 | SIGTERM(15) | 按条件筛选进程(如某用户的所有进程、模糊匹配进程) |
| 需求场景 | 推荐命令 | 信号选择 |
|---|---|---|
| 精准终止单个已知PID的进程 | kill PID | 默认-15 |
单个进程卡死,kill PID 无效 | kill -9 PID | 强制-9 |
| 批量终止所有同名进程(知道进程名) | killall 进程名 | 默认-15 |
| 同名进程卡死,需要批量强制终止 | killall -9 进程名 | 强制-9 |
| 模糊匹配进程名/按用户/端口筛选 | pkill -f 进程片段/pkill -u 用户名 | 默认-15 |
| 清理某用户的所有进程 | pkill -9 -u 用户名 | 强制-9(谨慎) |
-
终止前先确认:用
ps -ef | grep 进程名或pgrep 进程名查看匹配的进程,再执行终止命令; -
killall慎用通配符:比如killall python*会匹配所有以python开头的进程(如python、python3、python3.9),容易误杀; -
pkill -f更精准:按命令行参数匹配,比如pkill -f camera_dogzilla.py只终止该脚本,不会误杀其他Python程序。 -
kill:PID 精准控制,信号全能王
通过 进程ID(PID) 给单个/多个进程发送任意信号,是最基础、最精准的进程信号工具(不止能终止进程)。
- 精准控制单个进程(知道PID时);
- 需要给进程发送非终止信号(如暂停、恢复);
- 批量终止少量已知PID的进程。
# 1. 默认信号(SIGTERM 15):正常终止进程(推荐优先用)
kill [PID]
# 2. 指定信号(-信号编号 或 -信号名):强制终止(-9)、暂停(-19)等
kill -[信号编号] [PID1] [PID2] # 支持多个PID
kill -[信号名] [PID]
# 3. 查看所有支持的信号(用户提到的 kill -l)
kill -l
| 信号用法 | 含义 | 场景示例(树莓派/Linux) |
|---|---|---|
kill 1234 | 正常终止PID=1234的进程(-15) | 关闭正常运行的 camera_dogzilla.py(先 `ps -ef |
kill -9 1234 | 强制终止PID=1234的进程(-9) | 摄像头程序卡死,kill 1234 无效时使用(最后手段) |
kill -19 1234 | 暂停进程(SIGSTOP) | 临时暂停脚本运行,后续用 kill -18 1234 恢复 |
kill -15 1234 5678 | 批量正常终止多个PID | 同时关闭两个不同的进程(需分别查PID) |
-
killall:同名进程批量杀,简单直接
通过 进程名 匹配,批量给所有同名进程发送信号(无需查PID,适合“一锅端”同名进程)。
- 批量终止所有同名进程(如关闭所有终端、所有爬虫脚本);
- 不知道PID,但知道进程名,需要快速“一刀切”终止。
- 慎用!比如
killall bash会终止所有终端会话(包括当前登录),killall systemd会导致系统崩溃; - 优先用默认
-15,仅当进程卡死时用-9。
# 1. 默认信号(-15):批量正常终止同名进程 killall [进程名] # 2. 强制批量终止(-9):同名进程全部秒杀 killall -9 [进程名] # 3. 其他信号(如暂停) killall -STOP [进程名]
| 命令 | 场景说明 | 注意事项 |
|---|---|---|
killall python3 | 正常终止所有Python3脚本(包括 camera_dogzilla.py) | 避免误杀其他有用的Python程序(先 `ps -ef |
killall -9 nginx | 强制关闭所有Nginx进程(服务卡死时) | 会导致Nginx未清理连接,仅当正常关闭无效时用 |
killall -15 chrome | 正常关闭所有Chrome浏览器(允许保存标签页) | 优先用默认信号,给进程清理时间 |
-
pkill:灵活匹配+批量,条件筛选神器
结合了kill的信号能力和grep的匹配能力,支持 进程名模糊匹配、按属性筛选(用户、端口、命令行参数等),比killall更灵活。
- 进程名不确定(需要模糊匹配);
- 按属性筛选进程(如某用户、某终端、某命令行参数);
- 批量终止符合条件的进程(比
killall更灵活,比kill更高效)。
# 1. 按进程名匹配(精准/模糊):默认-15终止 pkill [进程名片段] # 支持模糊匹配(如 pgrep "python" 匹配所有含python的进程) # 2. 强制终止(-9):批量秒杀匹配进程 pkill -9 [进程名片段] # 3. 按属性筛选(用户、端口、命令行) pkill -u [用户名] # 终止某用户的所有进程 pkill -f [命令行片段] # 按脚本名/参数匹配(如匹配 "camera_dogzilla.py") pkill -t [终端名] # 终止某终端的所有进程
| 命令 | 场景说明 | 优势 |
|---|---|---|
pkill -f camera_dogzilla | 模糊匹配命令行含“camera_dogzilla”的进程并终止(-15) | 无需知道完整进程名,适合脚本进程 |
pkill -9 -u pi | 强制终止用户pi的所有进程(树莓派切换用户时清理) | 按用户批量清理,比 killall 更精准 |
pkill -15 chrome | 正常关闭所有Chrome进程(同 killall chrome) | 支持模糊匹配,如 pkill chrom 也生效 |
pkill -t tty1 | 终止tty1终端的所有进程(解决终端卡死) | 按终端筛选,避免影响其他终端 |
-
skill:既可以给进程发送信号(同kill),也可以调整进程优先级(nice值);
需要同时控制信号和优先级时
skill -TERM python3 # 正常终止所有python3进程(同 killall python3) skill -n 10 1234 # 调整PID=1234的进程优先级(nice值+10,优先级降低) -
-15(正常终止)与-9(强制终止)是最常用的信号
| 对比维度 | -15(SIGTERM,默认) | -9(SIGKILL,强制) |
|---|---|---|
| 信号含义 | “温柔通知”:请你正常退出 | “强制秒杀”:内核直接终止,不给机会 |
| 进程行为 | 可忽略、可处理(执行清理操作) | 不可忽略、不可处理(立即终止) |
| 资源清理 | 会保存数据、关闭文件句柄、释放资源 | 不清理任何资源(可能导致数据丢失、资源泄漏) |
| 适用场景 | 正常终止进程(优先使用) | 进程卡死、无响应,kill -15 无效时 |
| 风险程度 | 低(安全) | 高(可能引发后续问题,如摄像头占用) |
- 优先用
-15(默认信号):比如kill PID、killall 进程名、pkill 进程名,给进程收尾时间; - 仅当
-15无效时用-9:比如摄像头程序卡死,kill 1234后进程仍存在,再用kill -9 1234; - 避免直接用
-9终止服务类进程(如Nginx、数据库):可能导致配置丢失或数据损坏。
处理“ps看不到进程但提示运行”的情况
- 原因:进程异常退出后,
/var/run/xxx.pid残留(PID文件记录了进程的预期PID,实际进程已不存在); - 解决:删除残留的PID文件,示例:
sudo rm /var/run/camera_dogzilla.pid # 替换为实际的PID文件名
linux进程信息
/var/run下存放xxx.pid是关于进程的pid信息
/var/log下存放xxx.log是关于进程的log信息
service & systemctl
service命令其实是去/etc/init.d目录下,去执行相关程序
usage:
service --status-all 列出管理应用
service name option
option: [start\stop\restart]
systemd是Linux系统最新的初始化系统(init),作用是提高系统的启动速度,尽可能启动较少的进程,尽可能更多进程并发启动。
systemd对应的进程管理命令是systemctl
usage:
systemctl [options] name.service
option: [start\stop\restart\status]
列出服务:systemctl list-units
加载服务,当新写了service之后:使用systemctl daemon-reload加载。
“service” 和 “systemctl” 都是与 Linux 系统中的服务管理相关的命令,它们用于启动、停止、重启或查看服务的状态。service 命令被 systemctl 逐步替代,核心原因是操作系统的初始化系统从传统的 System V init 演进到了 systemd。systemctl 不仅能实现 service 的基本功能(启动、停止服务等),还扩展了更多能力。
-
service命令:
service命令用于启动、停止或重启系统中的服务。它是较旧的服务管理工具,适用于一些基于SysVinit的系统(例如 CentOS 6 或 Ubuntu 14.04 之前的版本)。它简化了服务的管理操作,使用起来比较直观。常用命令:
- 启动服务:
service <service_name> start - 停止服务:
service <service_name> stop - 重启服务:
service <service_name> restart - 查看服务状态:
service <service_name> status
- 启动服务:
-
systemctl命令:
systemctl是较新的服务管理工具,适用于systemd系统初始化和管理工具(如 CentOS 7+,Ubuntu 16.04+)。systemd替代了较旧的 SysVinit 和 Upstart 系统,并且提供了更强大的功能和更细粒度的控制。常用命令:
- 启动服务:
systemctl start <service_name> - 停止服务:
systemctl stop <service_name> - 重启服务:
systemctl restart <service_name> - 查看服务状态:
systemctl status <service_name> - 启动服务并开机自启:
systemctl enable <service_name> - 禁止服务开机自启:
systemctl disable <service_name> - 查看所有服务状态:
systemctl list-units --type=service
- 启动服务:
总结:
service适用于较老的系统,或者是兼容旧式 init 系统的服务管理工具。systemctl是现代 Linux 发行版中使用的工具,基于systemd,更加强大且功能丰富。
软件包管理
pip
阿里云 https://mirrors.aliyun.com/pypi/simple/
中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/
豆瓣(douban) http://pypi.douban.com/simple/
清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/
中国科学技术大学 http://pypi.mirrors.ustc.edu.cn/simple/
临时使用镜像源:
eg:pip install scrapy -i https://pypi.tuna.tsinghua.edu.cn/simple
永久修改:
linux:
修改 ~/.pip/pip.conf (没有就创建一个), 内容如下:
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
opencv
opencv版本号查看
pkg-config opencv --modversion
opencv常用cmake配置
cmake \
-DCMAKE_BUILD_TYPE=RELEASE \
-DCMAKE_INSTALL_PREFIX=/usr/local \
\
-DWITH_CUDA=OFF \
\
-DBUILD_DOCS=OFF \
-DBUILD_EXAMPLES=OFF \
-DBUILD_TESTS=OFF \
-DBUILD_PERF_TESTS=OFF \
..
dpkg
dpkg -i packagename 安装软件包
dpkg -r packagename 移除软件包
dpkg -S packagename 查看插件属于哪个软件包
dpkg -l packagename 查看软件包信息
如果是apt install的软件,可直接用命令
dpkg -S softwarename 显示包含此软件包的所有位置
dpkg -L softwarename 显示安装路径,包括库,头文件,cmake文件等,也可查看apt install的包的安装路径。
dpkg -L pack-name | grep Config.cmake: 显示对应的pkgConfig.name的具体路径。
apt
查看已安装得软件包版本,也可使用dpkg -l packagename
sudo apt-get install apt-show-versions
apt-show-versions 查看所有安装包版本
apt-show-versions –p <package> 查看指定安装包的版本
apt-show-versions –u 查看可更新包
apt-cache madison pacname查询仓库中软件的所有版本
apt-cache show pacname | grep -i version 查看版本信息
apt-cache show depends paname 查看包依赖。apt show pacname也可打印出包依赖关系
apt-get -y install pacname 免去回答yes安装pacname
apt-get -y install pacname=version 安装指定版本
apt-get install -s pacname 模拟安装软件
apt-cache search packagename 搜索软件包
apt install packagename 安装软件包
apt install --reinstall packagename 重新安装软件包
apt remove packagename 卸载软件包
apt list pacname 列出软件清单
apt show pacname 显示软件包信息
apt search pacname 搜索相关软件包
apt list|gerp pacname 查看pacname相关的安装情况
apt autoremove 卸载所有自动安装且不再使用的软件包
apt purge pacname 卸载并清除软件包的配置
apt search和apt list区别:
. apt search:关键词模糊匹配
- 作用:根据用户输入的关键词,在软件包名称和描述中进行全文搜索,返回包含关键词的所有候选包。
- 输出格式:显示包名 + 简短描述,例如:
nginx/focal 1.18.0-0ubuntu1 amd64 High performance web server - 适用场景:不确定具体包名时,通过关键词(如功能、用途)查找相关软件。
. apt list:精确列出软件包
- 作用:根据筛选条件(如已安装、可升级)列出包名,不进行内容匹配。
- 输出格式:仅显示完整包名,例如:
nginx/focal,now 1.18.0-0ubuntu1 amd64 [installed] - 适用场景:快速查看已安装包(
--installed)、可升级包(--upgradable)或所有可用包(--all-versions)。
查看安装包文件
whereis <pacname>
locate <pacname>
查看可执行文件位置
which <exe_name>
pkg-config 使用
Ubuntu 16.04 下pkg-config的安装与简介
pkg-config提供相应库的路径、版本号等信息的程序
pkg-config 查看gcc的CFLAGS参数
pkg-config --libs --cflags opencv
#查看版本
pkg-config opencv --version
#使用pkg-config添加编译参数
g++ `pkg-config --libs --cflags opencv` -ldl xx.cpp
g++ `pkg-config eigen3 --libs --cflags` xx.cpp
g++ $(pkg-config --libs --cflags opencv) xxx.cpp -o xxx
g++ `pkg-config opencv --cflags` xxx.cpp -o xxx `pkg-config opencv --libs
缺省情况下,pkg-config首 先在prefix/lib/pkgconfig/中查找相关包(譬如opencv)对应的相应的文件(opencv.pc)
在linux上上述路径名为 /usr/lib/pkconfig/
若是没有找到,它也会到PKG_CONFIG_PATH这个环境变量所指定的路径下去找。
查找软件版本号
pkg-config --modversion <pacname>
查看所有软件包安装情况
pkg-config --list-all
查看linux安装的镜像
dpkg --get-selections |grep linux-image
dpkg -l |grep linux-image
update-alternatives安装包版本切换
update-alternatives命令的几个主要选项为:display、install、remove、config、list。
以python为例:
安装多版本python
#查看python文件位置
whereis python
sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7 1
sudo update-alternatives --install /home/lxp3/anaconda36/bin/python python /home/lxp3/anaconda36/bin/python3.6 2
sudo update-alternatives --install /home/lxp3/anaconda3/bin/python python /home/lxp3/anaconda3/bin/python3.5 3
#查看当前python安装表:
update-alternatives --list python
#切换当前python:
sudo update-alternatives --config python
删除指定包:
sudo update-alternatives --remove python /usr/bin/python2.7 1
g++同理:
#安装多版本gcc/g++
sudo apt install gcc-7 g++-7 gcc-9 g++-9
#注册版本:以下命令将GCC 7(优先级70)和GCC 9(优先级90)注册为候选,--slave参数确保了切换GCC时G++会自动同步切换
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 70 --slave /usr/bin/g++ g++ /usr/bin/g++-7
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 90 --slave /usr/bin/g++ g++ /usr/bin/g++-9
#切换版本:执行以下命令后,会弹出一个交互式菜单,列出所有已注册的版本,输入对应编号即可完成切换
sudo update-alternatives --config gcc
#验证结果:切换后,使用以下命令检查当前生效的版本。
gcc --version
g++ --version
deb 查看操作
核心是看安装文件清单、控制信息、安装前后脚本、安装前后系统变化
-
- 列出 deb 内部组件
ar t 包名.deb
deb 本质是 ar 归档,包含三个核心文件:
debian-binary # 版本信息(2.0)
control.tar.gz # 元数据、依赖、脚本
data.tar.gz # 实际要安装的文件
-
- 查看将安装哪些文件(最常用)
# 方法1(推荐)
dpkg -c 包名.deb
# 或
dpkg-deb --contents 包名.deb
# 方法2(底层命令)
ar p 包名.deb data.tar.gz | tar ztvf -
会输出所有文件的路径、权限、大小、时间。
-
- 提取并查看 control 目录
# 提取控制文件到当前目录的 control 文件夹
dpkg-deb --control 包名.deb ./control
# 查看所有控制文件
ls -l ./control
cat ./control/*
-
- 关键控制文件说明
control:包名、版本、架构、依赖、冲突、描述preinst:安装前执行的脚本postinst:安装后执行的脚本prerm:卸载前执行的脚本postrm:卸载后执行的脚本conffiles:标记为配置文件的列表
直接查看提取出的脚本文件:
cat ./control/preinst
cat ./control/postinst
cat ./control/prerm
cat ./control/postrm
完整流程示例
# 1. 下载 deb(示例:tree)
wget http://archive.ubuntu.com/ubuntu/pool/universe/t/tree/tree_1.8.0-1_amd64.deb
# 2. 查看文件清单
dpkg -c tree_1.8.0-1_amd64.deb
# 3. 提取控制信息,看脚本
dpkg-deb --control tree_1.8.0-1_amd64.deb ./tree-control
ls ./tree-control
cat ./tree-control/*
# 4. 安装并对比变化
touch before
sudo dpkg -i tree_1.8.0-1_amd64.deb
sudo find / -newer before | grep -E "(bin|lib|share)"
关键安装问题解决
/var/lib/dpkg下的文件存放所有安装包信息,info下存放包的校验值等,status存放安装信息,请不要暴力删除,会出现整体安装的刷新及重新配置
Q1:files list file for package ‘xxx’ missing; assuming package has no files currently installed
R1:sudo apt install --reinstall pcname, 根据情况添加-f,–fix-missing。
Q2:以上重装不行,报trying to overwrite ‘xxx’, which is also in package xxx
R2:
sudo dpkg-i --force-overwrite /var/cache/apt/archives/sysvinit_2.88dsf-41+deb7u1_amd64.deb #手动在缓存里面安装 sysvinit_2.88dsf-41+deb7u1_amd64.deb
sudo apt full-upgrade
文件类
tree 显示文件结构
tree --dirsfirst [dir] 让文件夹优先显示。
tree 目录路径 -L 层级 [dir]查看指定目录的特定层级
tree -F [dir] 显示内容,并为文件夹添加"/"后缀
tree -d [dir] 只显示文件夹,不显示文件
tree [dir] >tree.txt 将结果保存到文本文件
rename 批量修改文件名
rename [ -v ] [ -n ] [ -f ] perlexpr [ files ]
-v (verbose)打印被成功重命名的文件
-n (no-act)只是显示将被重命名的文件,而不重命名(重命名之前可以用-n确认
需要重命名的文件)
-f (force)覆盖已经存在的文件
perlexprPerl语言格式的正则表达式
files需要被替换的文件(比如*.c、*.h, *所有文件),如果没给出文件名,将从标准输入读
eg:
rename -v 's/$/.txt/' * 将当前路径下的所有文件加上.txt后缀
将当前路径下的所有txt文件名中的str1替换成str2:
rename -n 's/str1/str2/' *.txt /确认需要重命名的文件/
rename -v 's/str1/str2/' *.txt /执行修改,并列出已重命名的文件/
rename 's/str1/str2/' *.txt /执行修改,不列出信息/
rename 'tr/abcd/edf/' asbycz.txt /指定替换字符规则/ a->e b->d c->f d->f
asbycdz.txt renamed as esdyddz.txt
find&rename联用
将所有含有str1的文件/目录,改名为含str2,即将str1替换为str2
find -type [f/d/*] | grep 'str1' | xargs rename 's/str1/str2/'
f: 文件
d: 目录
*:所有文件(文件及目录)
find -name *str* | xargs rename 's/str1/str2/'
examples:
文件改名
foo1, foo2, foo3 =>bar1, bar2, bar3
$ find -type f | grep 'foo' | xargs rename 's/foo/bar/'
文件夹改名
foo1, foo2, foo3 =>bar1, bar2, bar3
$ find -type d | grep 'foo' | xargs rename 's/foo/bar/'
递归重命名全部:
$ find -type * | grep ‘foo’ | xargs rename ‘s/foo/bar/’
如果文件夹有多层子目录的话,也需要手动执行多次。
来自:http://www.360doc.com/content/13/0307/17/8065943_270000799.shtml
ps:查看当前终端下的进程。 2.ps -ef:查看系统所有进程,展示完整格式,包含UID、PID、PPID、执行命令等信息;-e显示全部进程,-f输出完整详情。 3.ps aux:BSD风格查看所有进程,附带CPU、内存占用、进程状态等;a显示所有用户进程,u以用户维度展示详细资源占用,x列出无终端关联的进程。 4.ps aux | grep 进程名:筛选查询指定进程,例ps aux | grep nginx、ps aux | grep java。 5.ps -efL:查看系统所有进程及对应线程,L参数展示线程信息。 6.ps -T -p 进程ID:单独查看指定PID进程的线程,-T显示线程,-p指定进程ID。 7.ps -p 进程ID:仅查看单个指定进程基础信息。 8.ps -Lf -p 进程ID:查看指定进程完整信息+线程详情。 9.ps aux | grep 进程名 | grep -v grep | awk '{print $2}':过滤出目标进程的PID,常用于脚本批量结束进程;-v grep排除grep自身进程,awk截取第二列PID。 10.ps -efH:树形结构展示进程父子关系,H参数缩进呈现进程层级。 补充说明:ps为静态进程快照,需实时监控可使用top,界面更友好的实时工具为htop(需额外安装)。 STAT进程状态标识:R运行/就绪、S可唤醒休眠、D不可中断IO休眠、Z僵尸进程、T暂停停止。
ls 按指定顺序排布文件
ls -alt # 按修改时间排序
ls -alc # 按创建时间排序
ls -alu # 按访问时间排序
find . -name *.php|xargs ls -alt# 查找指定类型的文件,指定按时间排序
nautilus终端下指定路径打开文件管理器GUI
nautilus $PWD使用文件管理器打开当前目录
nautilus是GNOME桌面下的一个文件管理工具。 通过这个命令我们可以在终端下非常方便的打开指定目录的文件。
xargs
xargs命令的作用,是将标准输入转为命令行参数。
$ echo "hello world" | xargs echo
hello world
$ echo "one two three" | xargs mkdir
取消patch
patch -R 是反打patch,就是将打完patch的文件恢复到打patch之前。
eg:设剥离一层目录。
patch -Rp1 > xxx.patch
打patch
patch -p1 > xxx.patch
带单位显示文件大小
ls -lh 以K、M、G显示文件大小
删除除指定文件(file1)以外文件
rm -fr !(file1)
unzip 解压中文乱码的问题:
#指定GBK GB18030编码也是可以的
unzip -O GBK 资料.zip
挂载与卸载mount与umount:
mount -rw /dev/xxx path :将/dev/xxx 挂载到path下
umount path :卸载path对应的设备
举例:将U盘挂载到/mnt/tmp下
sudo fdisk -l: 查看分区情况,找到U盘对应的设备名(对应大小和文件系统FAT32),这里为/dev/sda1sudo mount -rw /dev/sda1 /mnt/tmp挂载- 可再/mnt/tmp下查看U盘内容
Linux系统挂载存储只读改成读写
- 用于查看哪个模块输入只读,一般显示为:
[root@ubuntu ~]# mount
/dev/cciss/c0d0p2 on / type ext3 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
tmpfs on /dev/shm type tmpfs (rw)
/dev/dm-0 on /home/book/upload/BookFile1 type ext3 (rw)
/dev/dm-1 on /home/book/upload/BookFile2 type ext3 (rw)
/dev/dm-2 on /backup type ext3 (rw)
/dev/dm-3 on /home/book/upload/BookFile3 type ext3 (ro)
- ro是只读,rw是可读写
- umount /dev/dm-3
如果发现有提示“device is busy”,找到是什么进程使得他busy
fuser -m /mnt/data 将会显示使用这个模块的pid
fuser -mk /mnt/data 将会直接kill那个pid
然后重新mount即可。 - 还有一种方法是直接remount,命令为mount -o rw,remount /mnt/data。
注意’,'号。
可读写文件系统修改为只读的,方法类似,只不过mount时候的rw改为ro就好了。
ps 命令
2. ps:查看当前终端下的进程。
3. ps -ef:查看系统所有进程,展示完整格式,包含UID、PID、PPID、执行命令等信息;-e显示全部进程,-f输出完整详情。
4. ps aux:BSD风格查看所有进程,附带CPU、内存占用、进程状态等;a显示所有用户进程,u以用户维度展示详细资源占用,x列出无终端关联的进程。
5. ps aux | grep 进程名:筛选查询指定进程,例ps aux | grep nginx、ps aux | grep java。
6. ps -efL:查看系统所有进程及对应线程,L参数展示线程信息。
7. ps -T -p 进程ID:单独查看指定PID进程的线程,-T显示线程,-p指定进程ID。
8. ps -p 进程ID:仅查看单个指定进程基础信息。
9. ps -Lf -p 进程ID:查看指定进程完整信息+线程详情。
10. ps aux | grep 进程名 | grep -v grep | awk '{print $2}':过滤出目标进程的PID,常用于脚本批量结束进程;-v grep排除grep自身进程,awk截取第二列PID。
11. ps -efH:树形结构展示进程父子关系,H参数缩进呈现进程层级。
补充说明:ps为静态进程快照,需实时监控可使用top,界面更友好的实时工具为htop(需额外安装)。
STAT进程状态标识:R运行/就绪、S可唤醒休眠、D不可中断IO休眠、Z僵尸进程、T暂停停止。
添加开机自启动脚本
sudo mv test.sh /etc/init.d/
#给文件增加权限
chmod +750 test.sh
#设置开机自动启动
sudo update-rc.d test.sh defaults
#开机自动化脚本就完成
du&df查看文件夹大小
df可以查看一级文件夹大小、使用比例、档案系统及其挂入点,但对文件却无能为力。
du可以查看文件及文件夹的大小。
du
max-depth参数表示指定深入目录的层数,很重要,不指定的话,会显示所有层次目录
du -h --max-depth=1 /usr
1.8G /usr/share
614M /usr/lib
8.0K /usr/etc
2.1M /usr/kerberos
24K /usr/X11R6
14G /usr/local
37M /usr/libexec
35M /usr/sbin
224M /usr/include
[root@localhost /]# du -h --max-depth=1 /usr
rsync
https://blog.csdn.net/jiangyu1013/article/details/79754060
rsync是可以实现增量备份的工具。配合任务计划,rsync能实现定时或间隔同步,配合inotify或sersync,可以实现触发式的实时同步。
Local: rsync [OPTION...] SRC... [DEST]
Access via remote shell:
Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
Push: rsync [OPTION...] SRC... [USER@]HOST:DEST
Access via rsync daemon:
Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST
由此语法可知,rsync有三种工作方式:
(1).本地文件系统上实现同步。命令行语法格式为上述"Local"段的格式。
(2).本地主机使用远程shell和远程主机通信。命令行语法格式为上述"Access via remote shell"段的格式。
(3).本地主机通过网络套接字连接远程主机上的rsync daemon。命令行语法格式为上述"Access via rsync daemon"段的格式。
前两者的本质是通过管道通信,即使是远程shell。而方式(3)则是让远程主机上运行rsync服务,使其监听在一个端口上,等待客户端的连接。
(1).将/etc/fstab拷贝到/tmp目录下。
[root@xuexi ~]# rsync /etc/fstab /tmp
(2).将/etc/cron.d目录拷贝到/tmp下。
[root@xuexi ~]# rsync -r /etc/cron.d /tmp
"–existing"选项使得只更新目标端已存在的文件。
"–remove-source-files"删除源端文件。
"–exclude"选项指定排除规则,排除那些不需要传输的文件。
“–delete"选项后,接收端的rsync会先删除目标目录下已经存在,但源端目录不存在的文件。也就是"多则删之,少则补之”。
find
find -name [filename],根据文件名查找文件
which [exec_tool],查看命令工具(python)使用的绝对路径
locate [filename],等同于find -name [filename],直接搜寻数据库,速度更快。
find忽略查找路径
find -path "./mnt" -prune -o -name "*eigin*"
""可以不加, -o不能省略
即 find -path pathname -prune 用来指定忽略查找路径。
如果要忽略两个以上的路径如何处理?
find /findpath /( -path “ignorepath1” -o -path “ignorepath2” /) -prune …加上寻找条件
find /findpath /( -path “ignorepath1” -o -path “ignorepath2” /) -prune -o -name filename
find /findpath /( -path “ignorepath1” -o -path “ignorepath2” /) -prune -o -type f -name “*.conf” -print
注意/( 和/) 前后都有空格。
查找文件并删除
find / -name "*.mp3" |xargs rm -rf
grep
Usage:grep opts 待搜索字符 文件名
eg: grep -n str main.cpp 查找main.cpp 中的str字符,列出对应行号
grep -rn str 在当前文件夹下以及子文件夹下的文件中递归查找str
grep -ln str * 在当前文件夹下查找str字符串,并输出对应文件及行号
-l 输出文件名
-n输出包含查找字符串的行号
-r表示递归查找当前文件夹及子文件夹下的所有文件
grep ‘^…$’ 是指, 匹配整个这个行中, 以什么开头, 以什么结尾. 指的是整行, 不是某个单词.
grep -w (word) 指的是匹配整个单词, 而不能是单词的一部分
grep -rn “xxx” --exclude-dir=dirname,在dirname之外的目录查找
grep -C 5 foo file 显示file文件中匹配foo字串那行以及上下5行
grep -B 5 foo file 显示foo及前5行
grep -A 5 foo file 显示foo及后5行
与sed 或者mv等命令结合使用
mv `grep -l Eigen *` eigen/移动包含Eigen字符的当前文件夹下的所有文件到eigen目录下
sed -i "s/zhangsan/lisi/g" `grep zhangsan -rl /dir`
替换dir下所有文件中的zhangsan为lisi,详见sed使用。
ag查找文件及文字
使用ag 命令来查找文件和字符:
sudo apt-get install silversearcher-ag
常用:
在file文件中查找text字符相关行:
ag 'text' file
查找文件:
ag -g <File Name> 类似于 find . -name <File Name>
忽略某些文件目录进行搜索:
ag --ignore-dir <Dir Name>
修改文件权限及拥有者
修改文件夹及子文件拥有者及用户组
chown -Rh owner:owner dir 修改拥有者及组
chown -Rh owner dir
chgrp -Rh group dir
-R 递进操作(recursive),使操作生效于子目录及文件。
-h 使操作生效于链接文件。
修改可执行文件的执行权限
chmod命令+s参数解释如下:
chmod +s 就是给某个程序或者脚本以suid权限
“为了方便普通用户执行一些特权命zd令,SUID/SGID程序回允许普通用户以root身份暂时执行该程序,并在执行结束后再恢复身份。”
s 在文件执行时把进程的属主或组ID置为该文件的文件属主。
原来只有某用户可以执行httpd这条命令, u+s后其他用户都可以使用httpd这个命令,都可享有指定+s的文件属主的权限。
chmod u+s file 就是给file程序的所有者以suid权限,可以像root用户一样操作。
cp
拷贝目录使用 -r
(星号* 配合 -r)
cp -r /tmp/src/* /tmp/dest 星号(*)对隐藏文件无效
需要隐藏文件时:(点号.配合-r)
cp -r /tmp/src/. /tmp/dest
cp的时候有重复的文件需要覆盖时会让不停的输入yes来确认,可以使用yes|
yes|cp -r /x y
想使用CP拷贝一个大目录(/home/study/test),但又不想拷贝其中的一个子目录(/home/study/test/test1),应该如何写命令行
cd /home/study/test
rsync -av --exclude test1/ --exlclude test2/ ../test/ /home/copydir
dd
dd:用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换。
Linux dd命令
dd可从标准输入或文件中读取数据,根据指定的格式来转换数据,再输出到文件、设备或标准输出。
警告:dd命令非常强大,但如果参数写错(尤其是of=目标盘符),可能会清空你的电脑硬盘!请务必万分小心!
-
找出磁盘标识符
- 插入源SD卡。
- 打开终端(Terminal),输入:
lsblk # 适用于 Linux # 或 sudo fdisk -l - 根据大小找出你的SD卡标识符。它通常看起来像
/dev/disk2(macOS) 或/dev/sdb(Linux)。而不是disk2s1或sdb1这样的分区号,要整个磁盘。
-
卸载SD卡(但不拔出)
umount /dev/sdbX卸载各个分区。 -
复制镜像
-
方案A:直接卡对卡复制(需要两个读卡器)
- 同时插入源卡和目标卡,分别确定它们的标识符(例如源卡是
disk2,目标卡是disk3)。 - 确保两者都已卸载。
- 输入命令:
# macOS 和 Linux 通用语法 sudo dd if=/dev/disk2 of=/dev/disk3 bs=1m status=progress # Linux 上通常用 bs=4M 或 bs=1M, status=progress 可以显示进度 # macOS 上 bs=1m, 并且没有 status 参数,想看进度可以按 Ctrl+T - 参数解释:
if=/dev/disk2: 输入文件(Input File),你的源SD卡。of=/dev/disk3: 输出文件(Output File),你的目标SD卡。bs=1m: 块大小(Block Size),设置大一些可以加快复制速度。status=progress: (仅Linux) 显示复制进度。
- 同时插入源卡和目标卡,分别确定它们的标识符(例如源卡是
-
方案B:先创建镜像文件,再写入目标卡(更安全,分两步)
- 第一步:从源卡创建镜像文件
sudo dd if=/dev/disk2 of=~/sd_card_backup.img bs=1m - 完成后,安全弹出源卡,插入目标卡,找到其标识符(如
disk3)并卸载。 - 第二步:将镜像文件写入目标卡
sudo dd if=~/sd_card_backup.img of=/dev/disk3 bs=1m
- 第一步:从源卡创建镜像文件
-
-
完成
- 复制完成后,输入:
sudo eject /dev/sdb - 安全拔出目标卡即可。
- 复制完成后,输入:
-
示例:
将本地的/dev/hdb整盘备份到/dev/hdd
dd if=/dev/hdb of=/dev/hddSD卡镜像备份
在linux系统下用读卡器读取sd卡
用df -h命令看分区的路径,一般都是/dev/sdb1或者/dev/sdc2之类的
备份命令为:
sudo dd if=/dev/sdb of=/home/Rpi_backup.img
也有:sudo dd if=SD卡路径 | gzip>镜像文件保存路径
这里根据自己的实际情况修改命令,sdb即为整个sd卡,后面不带数字SD卡镜像恢复
在Windows系统下用Win32DiskImager烧写sd卡
在Linux系统下用命令恢复:
sudo dd if=/home/Ppi_backup.img of=/dev/sdb
对应也有sudo dd if=SD卡路径 | gzip>镜像文件保存路径SD卡格式化
fdisk /dev/sxx
输入 d 进行删除分区,分区全部删除后,输入 w 保存并退出。 -
使用 Balena Etcher (最推荐) 拷贝磁盘/sd卡
Etcher 是一款非常流行且用户友好的工具,跨平台(Windows、macOS、Linux),而且能自动识别SD卡,不易误操作。步骤:
- 下载并安装 Balena Etcher。
- 将源SD卡(里面有你要拷贝的系统)插入电脑读卡器。
- 打开 Etcher。
- Flash from device(从设备烧录):
- 点击
Flash from device,然后选择你的源SD卡。
- 点击
- 选择目标卡:
- Etcher 通常会自动识别你插入的新SD卡(目标卡)。如果没识别,请手动选择正确的驱动器号(务必选对,否则会误删其他磁盘数据!)。
- 开始复制:
- 点击
Flash!按钮。软件会先读取源卡,然后将其内容写入目标卡。
- 点击
- 完成:
- 完成后,会提示成功。安全弹出两张SD卡即可。
mkdir
mkdir -p t/t1/t2
-p 会创建路径中的所有尚不存在的目录。若所有目录都存在,不报错,不创建。
目录之间的切换cd\pushd\popd
需要在两个或多个不同目录频繁切换:
cd -可以直接返回上一个目录
pushd 后加<path>:在目录栈中指定<path>目录,并切换到<path>下:
pushd \<path\>
pushd 单独使用,能够调换栈顶目录和下一目录:
pushd
pushd使用介绍:push +2 返回栈顶下两层的目录;用于3个目录相互跳转;当前目录永远是栈顶目录。
pushd [-n] [+N | -N | 目录]
popd 将当前目录推出目录栈:
popd
演示:

stat查看文件信息
stat [File] 查看File的编辑信息(创建事件等)
lsof
lsof查看文件占用情况
经常会遇到删除文件或者弹出U盘等设备时,提示设备占用,使用lsof可查看文件或设备(linux系统中设备即文件)占用情况(程序名,pid等信息)。
lsof [filename]
以下参考https://www.jianshu.com/p/a3aa6b01b2e1
lsof abc.txt 显示开启文件abc.txt的进程
lsof -c abc 显示abc进程现在打开的文件
lsof -c -p 1234 列出进程号为1234的进程所打开的文件
lsof -g gid 显示归属gid的进程情况
lsof +d /usr/local/ 显示目录下被进程开启的文件
lsof +D /usr/local/ 同上,但是会搜索目录下的目录,时间较长
lsof -d 4 显示使用fd为4的进程
lsof -i 用以显示符合条件的进程情况
lsof -i[46] [protocol][@hostname|hostaddr][:service|port]
--> IPv4 or IPv6
protocol --> TCP or UDP
hostname --> Internet host name
hostaddr --> IPv4地址
service --> /etc/service中的 service name (也可以是port id)
lsof -iTCP 显示TCP连接(同理可获得UDP连接)
lsof -i -sTCP:LISTEN找出监听端口
lsof -i@172.16.12.5:22 使用@host:port显示基于主机与端口的连接
fuser
用来显示所有正在使用着指定的file, file system 或者 sockets的进程信息。
c:current directory. 指示进程的工作目录。
e:executable being run. 指示该文件为进程的可执行文件(即进程由该文件拉起)。
f:open file. 指示该文件被进程打开,默认情况下f字符不显示。
F:open file for writing. 指示该文件被进程打开进行写入,默认情况下F字符不显示。
r:root directory. 指示该目录为进程的根目录。
m:mmap’ed file or shared library. 指示进程使用该文件进行内存映射,抑或该文件为共享库文件,被进程映射进内存。
fuser(opts)(pram)
opts
-a:显示命令行中指定的所有文件;
-k:杀死访问指定文件的所有进程;
-i:杀死进程前需要用户进行确认;
-l:列出所有已知信号名;
-m:指定一个被加载的文件系统或一个被加载的块设备;
-n:选择不同的名称空间;
-u:在每个进程后显示所属的用户名。
pram:文件名、文件系统或TCP、UDP端口号
eg: 列出占用/mnt/tmp的用户名及进程
fuser -mu /mnt/tmp/
wc统计输出行数
ls -l |wc
head & tail
head和tail是一组想对应的命令,默认分别显示文件的开头和末尾10行记录。
使用-n可指定显示几行。
head -25 file 显示file前25行。
tail -25 file 显示file后25行。tail +25 file 从25行开始显示到结尾。
通过组合head和tail组合显示文本对应的行。如:
head -408 xxx.cpp | tail -8 显示xxx.cpp的400到408行
tail +400 xxx.cpp |head -8 同样显示xxx.cpp的400到408行。
其中,$1表示第一列
readelf查看二进制文件信息
readelf可以查看二进制文件
readelf -h filename 查看二进制文件头,包括适用的系统版本及平台
readelf -d xxx.so 查看so共享库的依赖信息。

patchelf 更改二进制文件
更改依赖:
patchelf --replace-needed libm.so.6 libm.so libcholmod.so 将libcholmod.so对 libm.so.6的依赖变为lib.so
更改soname:
patchelf --set-soname libnewname.so path/to/libmylibrary.so
参考:修改so库中的依赖名
查看二进制依赖库文件信息
共享库so依赖
- 使用ldd查看二进制文件依赖的库文件信息
ldd libindemind_module.so - 使用readelf 查看
readelf -d xxx.so
静态库查看:
2. 查看文件:ar -t *.a
3. 查看函数、变量:nm *.a
符号表打印:
nm -D 7z.so
objdump -tT 7z.so
分卷压缩及解压
https://blog.csdn.net/baggio1006/article/details/17503113
分卷压缩:
tar cvzf - name | split -b 500m -d - name.tar.gz #分卷压缩name目录,并保持每个压缩包的大小不超过500m字节。命令执行后,会生成name.tar.gz00、name.tar.gz01等文件,注意此处name及name.tar.gz中的name要保持一致。
-表示默认处理。
关于split:
split -n 2 name.tar.gz name1.tar.gz可以将name.tar.gz拆分成两个name1.tar.gz00及name1.tar.gz01,但是此命令不能用于还为生成的文件(不能使用管道tar cvzf - name | split -n 2 -d - name.tar.gz不能执行)。
分卷解压:
cat name.tar.gz* | tar -zxvf - #将各个分卷压缩包解压到当前目录
cat name.tar.gz* > name.tar.gz #将各个分卷压缩包合成为一个name.tar.gz文件
tr 字符转换和删除工具
tr(translate 或 transliterate 的缩写)是 Linux/Unix 系统中一个强大的字符转换和删除工具,用于处理文本流中的字符替换、删除和压缩操作。
当对环境变量等进行操作:
#列出环境变量
echo $LD_LIBRARY_PATH | tr ':' '\n'
tr [选项] SET1 [SET2]
- 字符替换(一对一映射)
# 将小写字母转换为大写
echo "hello world" | tr 'a-z' 'A-Z'
# 输出:HELLO WORLD
# 替换特定字符
echo "abc" | tr 'abc' '123'
# 输出:123
- 字符删除
# 删除所有数字
echo "phone: 123-4567" | tr -d '0-9'
# 输出:phone: -
# 删除所有元音字母
echo "ubuntu" | tr -d 'aeiou'
# 输出:bnt
- 字符压缩(删除连续重复字符)
# 压缩连续空格
echo "too many spaces" | tr -s ' '
# 输出:too many spaces
# 压缩连续相同字符
echo "coooooool" | tr -s 'o'
# 输出:cool
- 字符补集操作
# 删除所有非数字字符
echo "ID: A123B456" | tr -cd '[:digit:]'
# 输出:123456
# 保留字母和空格
echo "Hello! How are you? 123" | tr -c '[:alpha:] \n' ' '
# 输出:Hello How are you
常用选项详解
| 选项 | 功能 | 示例 |
|---|---|---|
-d | 删除 SET1 中的字符 | tr -d 'aeiou' |
-s | 压缩 SET1 中的重复字符 | tr -s ' ' |
-c | 使用 SET1 的补集 | tr -cd '0-9' |
-t | 截断 SET1 使其长度与 SET2 匹配 | tr -t 'abc' '12' |
| 字符集 | 描述 | 等效表示 |
|---|---|---|
[:alnum:] | 字母和数字 | a-zA-Z0-9 |
[:alpha:] | 字母 | a-zA-Z |
[:digit:] | 数字 | 0-9 |
[:lower:] | 小写字母 | a-z |
[:upper:] | 大写字母 | A-Z |
[:space:] | 空白字符(空格、制表符、换行等) | |
[:punct:] | 标点符号 | |
\n | 换行符 | |
\t | 制表符 |
注意
-
区分大小写:
tr严格区分大小写 -
集合长度匹配:
# SET1 比 SET2 长时,多出字符映射到 SET2 最后一个字符 echo "abcdef" | tr 'abcde' '12' # 输出:122222(e映射到2) -
字符顺序:操作基于字符顺序而非单词
echo "banana" | tr 'na' 'xy' # 输出:bxyxyx(不是单词替换) -
不支持正则表达式:
tr只能处理单个字符,不能处理模式匹配(使用sed处理复杂模式)
使用建议:对于简单的字符级转换(特别是删除或压缩字符),tr 是最简洁高效的选择;对于更复杂的文本操作,建议使用 sed 或 awk。
sed 指定文本内容替换
sed -i 's/ori_str/new_str/' file 将file中每行第一个ori_str替换 为 new_str
sed -i 's/ori_str/new_str/g' file 将file中所有ori_str替换 为 new_str
sed -i 's/ori_str/new_str/2' file 将file中第二个ori_str替换 为 new_str
sed -i 's/ori_str/new_str/2g' file 将file中第二个到最后的ori_str替换 为 new_str
sed -i '1i 1111' file file中第一行插入1111
sed -i '$i 1111' file file中最后一行前插入1111
sed -i '$a 1111' file file中最后一行插入1111
sed -i '$a 1111';'$a 1111' file 连用
多文件替换
https://blog.51cto.com/tangming/6025745
sed -i "s/zhangsan/lisi/g" `grep zhangsan -rl /dir`
解释一下:
替换dir下所有文件中的zhangsan为lisi
-i 表示inplace edit,就地修改文件
-r 表示搜索子目录
-l 表示输出匹配的文件名
删除:
sed '2d' file-----删除file文件的第二行。
sed '2,$d' file-----删除file文件的第二行到末尾所有行。
sed '$d' file-----删除file文件的最后一行。
sed '/test/'d file-----删除file文件所有包含test的行。
sed 跳过指定文件
- 结合
find+grep排除指定文件
通过find遍历文件,再用grep -v过滤掉不需要的文件名或路径,最后通过xargs传递给sed:
# 跳过所有以 ".bak" 结尾的备份文件
find . -type f ! -name "*.bak" | xargs sed -i 's/old/new/g'
# 跳过目录 "logs/" 下的所有文件
find . -type f ! -path "./logs/*" | xargs sed -i 's/old/new/g'
- 结合
grep生成文件列表再处理
先通过grep生成目标文件列表,再传递给sed:
# 跳过扩展名为 .js 的文件
grep -rl --exclude="*.js" "old" . | xargs sed -i 's/old/new/g'
注:
grep -rl会递归搜索包含 “old” 的文件,--exclude指定排除模式。
若文件名含空格或特殊字符,需用 find -print0 和 xargs -0 避免解析错误:
find . -type f ! -name "skip.txt" -print0 | xargs -0 sed -i 's/old/new/g'
数据处理
awk
awk 是一个强大的文本处理工具,广泛用于 Unix 和 Linux 系统中。它能够根据模式匹配和条件处理文本文件。以下是一些常用的 awk 使用技巧:
awk 首索引是1 不是0
- 基本语法
awk '条件 {动作}' 文件
条件:指定处理的行。动作:对满足条件的行执行的操作。
- 选择特定列
通过$符号来选择特定列。
awk '{print $1, $3}' 文件 # 打印第一列和第三列
- 进行条件判断
可以使用if语句进行条件判断。
awk '{if ($1 > 10) print $0}' 文件 # 打印第一列大于10的整行
- 使用内置变量
awk提供了许多内置变量,例如:
NR:当前记录的行号。NF:当前行的字段数量。
awk '{print NR, NF}' 文件 # 打印每行的行号和字段数
- 字符串操作
awk可以轻松处理字符串。
awk '{print toupper($1)}' 文件 # 将第一列转换为大写
- 进行数学运算
可以进行算术运算。
awk '{sum += $1} END {print sum}' 文件 # 计算第一列的总和
- 使用分隔符
可以指定字段分隔符。
awk -F ',' '{print $1}' 文件 # 使用逗号作为分隔符
- 处理多个条件
可以使用逻辑运算符处理多个条件。
awk '$1 > 10 && $2 < 5' 文件 # 同时满足两个条件的行
- 输出格式化
使用printf进行格式化输出。
awk '{printf "Name: %s, Age: %d\n", $1, $2}' 文件 # 格式化输出
- 管道和重定向
awk可以与其他命令结合使用,处理管道数据。
cat 文件 | awk '{print $1}' # 通过管道读取数据
- 处理特定行
可以使用NR来处理特定的行。
awk 'NR==1 {print $0}' 文件 # 打印第一行
- 读取多个文件
awk可以同时处理多个文件。
awk '{print FILENAME, $0}' 文件1 文件2 # 输出文件名和行内容
示例
假设有一个文件 data.txt 内容如下:
Alice 25
Bob 30
Charlie 35
-
打印第二列:
awk '{print $2}' data.txt -
打印年龄大于30的行:
awk '$2 > 30' data.txt -
计算年龄的总和:
awk '{sum += $2} END {print sum}' data.txt -
将姓名转换为大写并打印:
awk '{print toupper($1)}' data.txt -
awk 计算均值
使用 awk:awk 是一种强大的文本处理工具,能够轻松计算第二列的均值。
计算data文件第一列的均值:
cat data|awk '{sum+=$1} END {print "Average = ", sum/NR}'
计算data.txt第二列均值
awk '{ sum += $2; count++ } END { if (count > 0) print sum / count }' data.txt
加入低通
awk '$2 <= 1.0 { sum += $2; count++ } END { if (count > 0) print sum / count }' data.txt
代码解释
sum += $2:累加第二列的值。
count++:计数每行。
END { if (count > 0) print sum / count }:在处理完成后,输出均值。
使用 paste 和 bc计算均值:先提取第二列再计算均值,使用 cut 和 bc:
cut -d ' ' -f 2 data.txt | paste -sd+ - | bc | awk '{print $1/NR}'
代码解释
cut -d ' ' -f 2 data.txt:提取第二列。
paste -sd+ -:将第二列的所有值用 + 连接成一个字符串。
bc:计算总和。
awk '{print $1/NR}':使用 NR(行数)计算均值。
md5sum校验文件
md5sum filename可读取filename生成哈希值。
校验两个文本是否一致,可以对比哈希值是否一致。
用户操作
查看组及组成员
groups 查看当前登录用户的组内成员
groups gliethttp 查看gliethttp用户所在的组,以及组内成员
whoami 查看当前登录用户名
/etc/group文件包含所有组
注销用户
pkill -kill 指定发送kill信号,-u指定uid
pkill -kill -u [username]
gnome-session-quit --logout --no-prompt
切换root用户
sudo su 和 sudo -s都是切换到root用户,不同的是:
sudo su 环境用的是目标用户(root)的环境
sudo -s 环境用的是当前用户本身的环境
查看用户登录情况
who可查看目前登录情况
last命令查看最近登录情况
lastlog命令查看各个用户登录情况
cat /var/log/auth.log文件,分析用户登录及行为。
cat /home/{username}/.bash_history查看用户的操作记录
创建新用户并添加root权限
sudo adduser username
注意区分adduser与useradd
添加用户root权限
- 修改配置文件
vim /etc/sudoers
修改文件如下:
# User privilege specification
root ALL=(ALL) ALL
username ALL=(ALL) ALL
- 将用户添加到sudo组
usermod -a -G sudo suveng //注意改成你自己的用户名
列出所有用户
cat /etc/passwd |cut -f 1 -d :
注意:useradd adduser 都能用,useradd没有在home下生成用户对应的目录。adduser可以用来将用户添加到指定组。
添加用户:useradd -m 用户名 然后设置密码 passwd 用户名
删除用户:userdel -r 用户名
** adduser与useradd区别**
useradd:
“useradd +用户名” 不会在/home目录下创建同名文件夹,也没有创建密码;因此不能使用该用户登录。
使用 “useradd -m +用户名” 方式创建,可在/home目录下创建同名文件夹,然后利用 " passwd + 用户名" 为指定的用户名设置密码。
adduser:
“adduser +用户名” 直接在/home目录下会自动创建同名文件夹。
删除用户,只需使用一个简单的命令“userdel 用户名”即可。不过最好将它留在系统上的文件也删除掉,你可以使用“userdel -r 用户名”来实现这一目的。
sudo 免密用于脚本需使用sudo
https://blog.csdn.net/u011596455/article/details/76944065
sudo visudo
修改这一样,让所有sudo指令免密
xxx ALL=(ALL:ALL) NOPASSWD: ALL
[解决:Jenkins sudo:抱歉,您必须拥有一个终端来执行 sudo]
https://blog.csdn.net/fst438060684/article/details/80984233
那么第一个思路就是免密使用sudo了,假设我使用jenkins的账户是xdq,那么我用root账户 修改/etc/sudoers(或sudo visudo)的配置,添加如下两项:
xdq ALL=(ALL) NOPASSWD: ALL
Defalults:xdq requiretty
后台命令
将任务放至后台运行
命令后加&
$ ./test.sh &
将已执行程序暂停/运行在后台
ctrl+z快捷键可直接将当前程序暂停在后台。
vi t.txt
ctrl+z后将vi暂停在后台,终端输入fg命令可直接重新调起。
jobs
jobs命令可以查看后台任务运行情况;
jobs -l 命令可显示执行任务的pid;
使用 fg 任务序号 可直接重新调起对应的后台任务;
使用bg 任务序号 可将后台暂停程序在后台运行。
linux后台执行命令
command > out.file 2>&1 &
command > out.file &
将command输出重定向到out.file中 将错误信息输出到屏幕 &符号可将命令放于后台执行
使用nohup使进程执行时不被hup信号中断(在服务器上运行模型时用,放置ssh断开连接后,程序被退出)。
nohup command >out.file 2>&1 &
bash终端log重定向
012文件描述符
- 0:标准输入
- 1:标准输出 - 通常指命令的正常输出信息。
- 2:标准错误 - 通常指命令的错误信息、警告等。
> 仅重定向标准输出(文件描述符1)到文件。
>& 是一个通用的重定向操作符,可以用于将两个文件描述符重定向到同一个目标。当后面是文件时,它重定向标准输出和标准错误到该文件;当后面是文件描述符时,它表示将左侧的文件描述符重定向到右侧的文件描述符所指向的目标。
| 命令 | 含义 |
|---|---|
command > file | 仅将标准输出重定向到 file |
command 2> file | 仅将标准错误重定向到 file |
command > file 2>&1 | 将标准输出和标准错误都重定向到同一个文件 file |
command &> file | 同上,是 > file 2>&1 的简化写法 |
command > /dev/null 2>&1 | 沉默模式,丢弃所有输出(正常和错误) |
符号分解:2>&1: 2、>& 和 1。
2: 代表标准错误。
1: 代表标准输出。
>&: 这是一个通用重定向符号,意思是“将左边的目标重定向到右边目标所指向的地方”,自主解析右侧目标。
2>&1 : 将“标准错误”重定向到“标准输出”当前所指向的地方。关键在于 “当前所指向的地方”。2>&1 本身并不定义“标准输出”要去哪里,它只是让“标准错误”去追随“标准输出”的脚步。
示例一:将标准输出和标准错误都重定向到同一个文件
这是 2>&1 最常用的场景。
命令:
my_command > output.log 2>&1
执行顺序和解释:
> output.log: 首先,Shell 将标准输出 的重定向目标设置为output.log文件。此时,1指向output.log。2>&1: 然后,Shell 将标准错误 也重定向到1当前指向的地方,也就是output.log。
最终结果: 无论是正常输出还是错误信息,都会被写入到同一个文件 output.log 中。
顺序很重要!
> output.log 2>&1 和 2>&1 > output.log 的效果是完全不同的。
-
正确写法:
> file 2>&11先指向file。- 然后
2追随1,也指向file。
-
错误写法:
2>&1 > file2>&1: 首先,2追随1。此时1还指向默认的屏幕,所以2也指向屏幕。> file: 然后,1被改变,指向file。但2仍然指向屏幕。- 结果: 只有标准输出进入
file,标准错误依然打印在屏幕上。
简洁等效写法:
my_command &> output.log
或者
my_command &>> output.log # 追加模式,而非覆盖
示例二:将标准输出和标准错误都丢弃
在 Linux 中,/dev/null 是一个“黑洞”设备,写入它的任何数据都会消失。
命令:
my_command > /dev/null 2>&1
解释:
> /dev/null: 标准输出被重定向到“黑洞”。2>&1: 标准错误追随标准输出,也进入“黑洞”。
最终结果: 命令执行后,在屏幕上将看不到任何输出(无论是正常的还是错误的)。这在脚本中运行不想要任何输出的命令时非常有用。
输出到文件logfile中,log信息不在屏幕显示
cmd > logfile
输出到文件logfile中,并在屏幕上显示:
cmd | tee logfile
cmd >&1 | tee logfile 将cmd的输出到终端,且将终端输出打印到log文件
追加输出到文件logfile中,并在屏幕上显示:
cmd >&1 | tee -a logfile
>后边加&表示后边跟的文件描述符,不是文件名,如>&1 重定向到标准输出(屏幕)
将命令正确执行和错误的输出结果都保存到文件log.log:
cmd 2>&1 | tee log.log -a
tee命令用于读取标准输入的数据,并将其内容输出成文件。
将终端的输出信息保存到log中:
sudo script screen.log
之后你在终端输入的相关命令,及终端的所有输出信息都被保存到screen.log文件中,然后执行以下命令,停止保存:
exit
Vim
在命令界面(esc不能编辑文本),在当前行任意位置,摁o键直接进入编辑页面并回车。
命令
esc下输入q:打开vim历史命令栏
直接输入Q 进入Ex模式,输入:vi恢复到vi模式。Ex模式下用来指定行进行操作。
vim底层实现基于ex,是可视化的ex。
vim查找字符串忽略大小写:
1)查找时使用\c参数。进入底行模式,输入命令“/string\c ” 或 “/\cstring”,将会忽略大小写查找string字符串。
注意:\c与字符串之间不要有空格,因为该空格也会被认为是查询的字符串
2)通过设置vim配置来忽略大小写查找。
set ignorecase 或 set ic 忽略大小写查找
set noignorecase 或set noic 严格大小写查找
:set nu 显示行号
:set hlsearch 高亮显示搜索结果
:vs xxx 竖栏显示xxx文件
ctrl+w x 交换左右栏显示,先同时嗯ctrl及w,然后放手,再摁下x,下同
:sp xxx 横栏显示xxx文件
使用ctrl+w 上下左右键切换文件栏目
q:可以显示vi的历史记录(注意无冒号)
:f 可以显示当前文件名
:pwd 可以看当前的详细路径,这个用ctrl+z也可以将vi放后台查看。
:Ex 横排打开栏,当前文件所在的目录
:Ve 竖排打开栏,当前文件所在的目录
:se list 显示文件的空格。
:set encoding = utf-8 只改变 Vim 内部的文本处理编码,不保存。
:set fileencoding=gbk 修改并保存文件编码
正则表达式
https://www.cnblogs.com/PegasusWang/p/3153300.html
删除指定行操作
指定行号删除:
:[start],[end]d删除从start到end行。d表示删除。
eg:删除从3到5的行:3,5d
代指符号:
.(点)代表当前行。
$代表最后一行。
%表示所有行。
[^]为反向匹配,用来匹配 不包含括号内字符 的内容。即匹配 不在方括号内列出的字符。
使用举例:
:.,$d 删除从当前行到文件末尾。
:.,1d 删除从当前行到文件开头。
10,$d删除第十行到文件末尾。
%d 删除所有行 也可以是:1,$d
" 删除中文后的空格(中文 英文 → 中文英文)
:%s/\([\u4e00-\u9fff]\+\) \(\a\)/\1\2/g
" 删除英文前的空格(英文 中文 → 英文中文)
:%s/\(\a\) \([\u4e00-\u9fff]\+\)/\1\2/g

https://blog.csdn.net/weixin_46932303/article/details/107090796
行末:$
行首:^
空格:\s
行末空格:\s+$
行首空格:^+\s
数字:\d
字符:\c
非数字:\D
.点 是元字符 匹配除换行符以外的任意字符
*星号 是标识重复的意思(重复零次或更多次)
runoo+b,可以匹配 runoob、runooob、runoooooob 等,+ 号代表前面的字符必须至少出现一次(1次或多次)。
runoo*b,可以匹配 runob、runoob、runoooooob 等,* 号代表前面的字符可以不出现,也可以出现一次或者多次(0次、或1次、或多次)。
colou?r 可以匹配 color 或者 colour,? 问号代表前面的字符最多只可以出现一次(0次或1次)
:g/str/d删除包含指定字符str的行
:g!/str/d删除不包含指定字符str的行
其他示例:
:g/^#/d删除以#为开头的注释行
:g/^$/d删除空白行
:g/^\s*$/d删除只有空格的空白行
:g/\d\s\d/d删除数字后跟空格再跟数字[222 333]的行
:g/\s*\d\s*\d\s/d删除具有多个空格和数字(矩阵式)[222 333 444]形式的行
使用替换/删除指定字符串
删除指定内容
:%s/\s\+$//或:%s/ $//g 删除所有行末空格
:%s/ *$//g或%s/\s*$//g删除所有行末的所有空格
:%s/^\s*//g或:%s/^ *//g删除所有行首所有空格
删除所有行指定字符后的内容::%s/指定字符.*//g,
如删除(后的所有内容::%s/(.*//g
.*用于匹配所有内容:
.点 是元字符 匹配除换行符以外的任意字符
*星号 是标识重复的意思(重复零次或更多次)
:%s/\t/ /g将tab替换成4个空格
:%s/^.\{n\}//删除每行前n个字符
:%s/.\{n\}$//删除每行后n个字符
:%s/指定字符串:.*$//删除每行指定字符后的所有内容
eg: 删除冒号:后的所有内容%s/\:.*$//g
:%s/^M//g去掉代码中的“^M”,注意命令中的^M是使用“CTRL+V CTRL+M”生成,而不是直接键入“^M”。
:s/str1/str2/ 替换当前行第一个 str1 为 str2
:s/str1/str2/g 替换当前行所有 str1 为 str2
:n,\$s/str1/str2/ 替换第 n 行开始到最后一行中每一行的第一个 str1 为 str2
:n,$s/str1/str2/g 替换第 n 行开始到最后一行中每一行所有 str1 为 str2
(n 为数字,若 n 为 .,表示从当前行开始到最后一行)
:%s/str1/str2/(等同于 :g/str1/s//str2/) 替换每一行的第一个 str1 为 str2
:%s/str1/str2/g(等同于 :g/str1/s//str2/g) 替换每一行中所有 str1 为 str2
可以使用 # 作为分隔符,此时中间出现的 / 不会作为分隔符
:s#str1/#str2/# 替换当前行第一个 str1/ 为 str2/
:%s+/str1/str10/+/str2/str20+ (使用+ 来 替换 / ): /str1/str10/替换成/str2/str20/
反向排除替换
- 使用分组和反向引用
- 在Vim的替换命令中,
s命令用于替换。可以使用\(和\)来创建分组,然后通过\1、\2等形式进行反向引用。 - 例如,如果你有一个字符串
abcde,想要将abc替换为xyz,但不想替换de,可以这样操作:- 假设文本在Vim的缓冲区中,进入命令模式(按下
:),输入%s/abc\(de\)/xyz\1/g。 - 这里
%表示对整个文件进行操作,s是替换命令,abc\(de\)是匹配模式,其中\(de\)将de部分作为一个分组,xyz\1是替换内容,\1引用了前面匹配到的de分组,g表示全局替换(如果有多个匹配的地方都会替换)。 - 例如
%s/sin(r\([xyz]\))/sr\1/g将sin(r[x/y/z])替换为sr[x/y/z]。其中x/y/z表示满足三者之一即替换
- 假设文本在Vim的缓冲区中,进入命令模式(按下
- 在Vim的替换命令中,
visual模式对选中文本进行替换
命令模式下,摁v键进入visual模式,选中文本;
输入:下边出现:
:'<,'>
在其后输入s/old/new/g,则可将选中文本中的old都替换成new。
不加g仅替换选中文本每一行的第一个old为new。
使用vi记录功能记录功能用于频繁的相同操作,
如:


- esc下嗯q+<a-z任意字母>,进入记录模式。
- 嗯i开始编辑,编辑完成后,嗯esc,并将光标移动到想要重复操作的行首
- 嗯q,退出记录模式,嗯<num>@<a-z刚才嗯的字母>,
num是要重复几行此操作,@后嗯刚才进入记录模式时输入的字母。
参考
快捷键
dw 删除一个word
D 删除光标所在到行结束。
可用Esc-v-上下左右键选中字符
~可将选中区域变换大小写
gu 转换选中为小写
gU 转换选中为大写
使用visual模式下选中文字,按U/u切换文字大小写
也可以Esc-gu/U-上下键会将选中变为小/大写
=可以去掉该行缩进/或自动对齐
gg=G对齐所有代码
命令模式下按v键进入visual模式选中代码,按=键可对齐选中代码
定位括号
"{"上按%,即可定位到对应的 “}”
自动补全
插入模式下, ctrl+n或者ctrl+p, 上下键切换,使用空格/回车补全单词, 退出模式
跳跃到上一次光标处
命令模式下嗯两个``可以跳转到上一次光标所在处
条目编号
比如当word粘贴参考文献等,标号消失,可以使用如下方法进行编号:
在 Vim 中自定义行号格式(如 [1]、(2) 等)可通过以下方法实现:
**方法一:**基于 :let 变量与全局命令
1. 2.
:%s/^/\=printf("%d. ", line('.'))/
[1] [2]
:%s/^/\=printf("[%d] ", line('.'))/
**方法二:**基于 :let 变量与全局命令
:let i=1 | g/^/s//\='['.i.'] '/ | let i+=1
- 自定义格式:修改单引号内符号即可调整样式,例如:
- 圆括号:
\='('.i.') '→(1)、(2) - 无括号:
\=i.'. '→1.、2.
- 圆括号:
i=1:初始化计数器为1g/^/:全局匹配所有行首\='['.i.'] ':动态拼接编号格式(此处为方括号+空格)i+=1:每处理一行后计数器递增
- 若需跳过空行,改用
g/\S/代替g/^/
ctags c/c++代码调用关系查看
#生成代码tag信息,用来追踪调用关系,-R表示文件夹下的代码进行递归创建tags,这样在存放tags的目录下的vi打开的代码文件可以在所有代码文件间跳转
ctags –R
#变量名定义查找,直接用vi打开tagname定义代码处
vi –t tagname (请把tag替换为您欲查找的变量或函数名)
#####################以下是在vi中的tag相关使用,“:”开头的命令为VI中命令行模式命令
:ts(ts助记字:tagslist)
:tp(tp助记字:tagspreview)
:tn(tn助记字:tagsnext)
#直接跳到光标所在函数或参数的默认定义处
Ctrl+ ]:注意是按一下ctrl,再按]
#显示tag(光标所在函数/参数)所有定义的列表
g + ] :注意是按一下g,再按]
#跳转返回到上一个定义处查找,即Ctrl+ ]的反跳转
Ctrl+ T
解决关于ctags只能追踪本层目录下的代码
解决办法是在在vim的配置文件 ~/vimrc 添加如下内容:
set tags=tags
set autochdir
使如果源文件在当前文件夹下没有找到tags,可以到它的上层目录下继续寻找。
ctags使用参考
要使用更多tags文件,可以通过改变’tags’选项的设置来引入更多的tags文件。如:
vim下,(ex command) :set tags=./tags, ./…/tags, ./*/tags
调试类
gdb调试C/C++程序
gdb --args /exefile arg1 args2
truss、strace或ltrace
三个调试工具的基本使用方法大体相同,下面仅介绍三者共有,而且是最常用的三个命令行参数:
-f :除了跟踪当前进程外,还跟踪其子进程。
-o file :将输出信息写到文件file中,而不是显示到标准错误输出(stderr)。
-p pid :绑定到一个由pid对应的正在运行的进程。此参数常用来调试后台进程。
使用上述三个参数基本上就可以完成大多数调试任务了,下面举几个命令行例子:
truss -o ls.truss ls -al: 跟踪ls -al的运行,将输出信息写到文件/tmp/ls.truss中。
strace -f -o vim.strace vim: 跟踪vim及其子进程的运行,将输出信息写到文件vim.strace。
ltrace -p 234: 跟踪一个pid为234的已经在运行的进程。
链接:https://www.cnblogs.com/chanix/p/12743848.html
python有调试器pdg,即python debug
当我们使用strace 调试程序发现程序在使用mmap/brk时发生段错误,此时很可能是堆栈溢出,堆栈不够用导致的,可以尝试使用ulimit查看和修改堆栈大小。
ulimit
语 法: ulimit [-aHS][-c <core文件上限>][-d <数据节区大小>][-f <文件大小>][-m <内存大小>][-n <文件数目>][-p <缓冲区大小>][-s <堆叠大小>][-t <CPU时间>][-u <程序数目>][-v <虚拟内存大小>]
补充说明: ulimit为shell内建指令,可用来控制shell执行程序的资源。
参 数:
-a 显示目前资源限制的设定。
-c <core文件上限> 设定core文件的最大值,单位为区块。
-d <数据节区大小> 程序数据节区的最大值,单位为KB。
-f <文件大小> shell所能建立的最大文件,单位为区块。
-H 设定资源的硬性限制,也就是管理员所设下的限制。
-m <内存大小> 指定可使用内存的上限,单位为KB。
-n <文件数目> 指定同一时间最多可开启的文件数。
-p <缓冲区大小> 指定管道缓冲区的大小,单位512字节。
-s <堆叠大小> 指定堆叠的上限,单位为KB。
-S 设定资源的弹性限制。
-t <CPU时间> 指定CPU使用时间的上限,单位为秒。
-u <程序数目> 用户最多可开启的程序数目。
-v <虚拟内存大小> 指定可使用的虚拟内存上限,单位为KB。
https://dude6.com/article/284743.html
查看及修改堆栈大小
默认是8182大小。
1、通过命令 ulimit -s 查看linux的默认栈空间大小,默认情况下 为10240 即10M
2、通过命令 ulimit -s 设置大小值 临时改变栈空间大小:ulimit -s 32767, 即修改为32M
ulimit -s unlimited 设置临时堆栈无限制。
3、可以在/etc/rc.local 内 加入 ulimit -s 32767 则可以开机就设置栈空间大小
4、在/etc/security/limits.conf 中也可以改变栈空间大小
https://zhuanlan.zhihu.com/p/616941834
c代码中:
#include <sys/resource.h>
int getrlimit(int resource, struct rlimit *rlptr);
int setrlimit(int resource, const struct rlimit *rlptr);
https://www.cnblogs.com/lidabo/p/17340999.html
adb 安卓调试
查看系统服务相关信息
adb shell dumpsys -l
adb shell service list
adb shell dumpsys media.camera |head 查看摄像头设备信息
usb转串口使用
- 接线方式:GND 对 GND,TX 对 RX,RX 对 TX
minicom使用
安装:
sudo apt install minicom
使用:
sudo minicom
打开波特率端口配置界面
sudo minicom -s
配置好后保存退到首界面,便可以看到log信息。
默认的usb串口节点是/dev/ttyUSB0
ctrl+a z 打开主配置
ctrl+a o 打开串口配置
ctrl+a x 退出
screen
screen 连接串口
screen /dev/ttyACM0 115200
退出终端:
Ctrl+A k
svn
下拉代码svn checkout
svn co http://localhost/test/testapp--username xxx之后输入密码,也可以通过–password直接给定密码
添加到暂存svn add
svn add filename
svn add *添加全部修改到暂存
撤回暂存svn revert
svn revert filename
svn revert *撤销所有修改
提交代码并上传到服务器svn commit
svn commit -m“xxx”
maven用来解决依赖关系的,通过pom.xml 来表明以来关系。
内存空间分布图

cat /proc/${PID}/maps可查看内存分配信息
串口
串口状态查看
stty查看串口参数,查看串口1(/dev/ttyS0)当前的参数,包括波特率、数据位等。
stty -F /dev/ttyS0 -a
stty设置串口参数
stty -F /dev/ttyS0 ispeed 115200 ospeed 115200 cs8
查看串口数据
cat /dev/ttyS0socat file:/dev/ttyS0,b115200,inlcr=1 stdout
minicom
安装:
sudo apt install minicom
启动:
sudo minicom
配置:
minicom -s
Minicom下的命令可以通过先按Ctrl+A ,再按Z查看。下面是命令的说明,可以在minicom下使用"Ctrl+A "即进入相应功能的界面。按 ESC 键返回主界面。
主要常用的命令有:
Z :帮助,上面已经使用过。
O(cOnfigure):minicom的相关配置,功能非常强大。
S(Send files):发送文件
R(Receive files):接收文件
使用xmodem收发文件
从开发板发送文件到PC:
- minicom配置及启动
- sx filename
显示Give your local XMODEM receive command now. - ctrl+a R 选择xmodem,输入filename,看到传送进度,默认放在当前目录
从PC端发送文件到开发板:
- minicom配置及启动
- rx filename
显示rx: ready to receive main.c - ctrl+a S 选择xmodem,选择文件,看到传送进度
或者使用zmodem选择文件传送
终端会话及分割Terminator
Terminator 是在 Ubuntu 中功能强大的终端分屏工具,支持多窗口并行操作、快捷键高效管理和自定义配置。
- 基础安装(推荐)
- 通过 APT 包管理器直接安装(Ubuntu 及衍生系统):
sudo apt update sudo apt install terminator - 安装后可通过
Ctrl+Alt+T启动(若替换了系统默认终端需手动设置)。
- PPA 安装(获取新版)
- 添加官方 PPA 并安装最新版:
sudo add-apt-repository ppa:gnome-terminator sudo apt update sudo apt install terminator - 设置默认终端(可选):
gsettings set org.gnome.desktop.default-applications.terminal exec /usr/bin/terminator gsettings set org.gnome.desktop.default-applications.terminal exec-arg "-x"
- 添加官方 PPA 并安装最新版:
基本使用:分屏与窗口管理
- 分屏操作
- 水平分屏:
Ctrl+Shift+O - 垂直分屏:
Ctrl+Shift+E - 重复操作可无限拆分窗口(如开发、编译、日志监控并行)。
- 水平分屏:
- 窗口切换与导航
- 窗格间跳转:
Alt+方向键或Ctrl+Tab(按顺序切换) - 全屏/还原:
F11或Ctrl+Shift+X(临时放大当前窗格)。
- 窗格间跳转:
- 常用快捷键速查
功能 快捷键 说明 复制文本 Ctrl+Shift+C选中即复制(需配置开启) 粘贴文本 Ctrl+Shift+V关闭当前窗格 Ctrl+Shift+W或输入 exit搜索终端历史 Ctrl+Shift+F支持正则表达式 重置终端 Ctrl+Shift+R清屏并重置
高级功能与配置
4. 自定义布局保存与加载
- 手动分割窗口后,通过右键 →
Preferences→Layouts保存当前布局(如命名dev-layout)。 - 启动时加载布局:
terminator -l dev-layout。
-
个性化配置
- 配置文件路径:
~/.config/terminator/config(无则新建)。 - 常用配置示例:
[profiles] [[default]] background_color = "#2d2d2d" # 背景色 background_type = transparent # 透明背景 font = Monospace 12 # 字体及大小 scrollback_lines = 10000 # 历史输出行数 copy_on_selection = True # 选中即复制 [keybindings] split_horiz = "<Primary><Shift>o" # 自定义快捷键 - 修改后无需重启,即时生效。
- 配置文件路径:
-
主题美化
- 安装等宽字体(如
Hack或DejaVu Sans Mono)提升可读性。 - 支持背景图片/透明度调节:在配置中设置
background_image和background_darkness。
- 安装等宽字体(如
典型应用场景
- 开发调试
- 左窗编辑代码,右窗实时编译,底部运行测试日志。
- 服务器管理
- 多 SSH 会话并行操作(如集群部署)。使用
ssh -X username@ip,而后可以通过terminator弹出新终端,在新终端中使用快捷键可对终端进行分割。 - 同时
terminator在网络断连又重联后,自动恢复连接。此外,支持ctrl+shift+t开启远程新终端。 - 与
tmux不同的是,tmux不依赖图形-X,而terminator需要图形支持。
- 多 SSH 会话并行操作(如集群部署)。使用
- 文档对照
- 上窗查看手册(
man命令),下窗执行操作。
- 上窗查看手册(
更多配置参考:官方文档 或知乎专栏《Ubuntu 终端分屏实践》。
终端会话及分割tmux(远程ssh/docker中不需要-X等)
安装方法:sudo apt-get install tmux
使用方法:
1.打开终端,输入 tmux
2.如果要上下分割:先按 ctrl + b 再按 shift + “(左引号)
3.如果要左右分割:先按 ctrl + b 再按 shift + %
4.切换窗口:先按 ctrl + b 再按 上 / 下 / 左 / 右 键
5.将会话分离:Ctrl+b 再按d
退出会话:Ctrl+b 再按d
重新恢复会话:tmux a
tmux的核心功能如下:
- 会话解绑
tmux 将终端窗口与会话分离,关闭窗口或断开 SSH 后会话仍后台运行,任务不中断。- 典型场景:SSH 断连后重新登录,使用tmux a`可恢复之前tmux的任务状态。
- 多任务管理
- 单窗口同时操作多个会话、窗口或窗格。
- 支持垂直/水平拆分窗格,并行执行命令。
- 会话共享
多人可实时连接同一会话,协作操作。
tmux使用:
1. 安装
sudo apt-get update && sudo apt-get install tmux
安装后验证:tmux -V。
2. 会话管理
| 操作 | 命令/快捷键 | 说明 |
|---|---|---|
| 新建会话 | tmux new -s <会话名> | 创建命名会话 |
| 分离会话 | Ctrl+b d | 会话后台运行 |
| 查看会话列表 | tmux ls | 显示所有会话 |
| 恢复会话 | tmux attach -t <会话名> tmux attach -d -t session-name | 重新接入会话 -d 参数强制分离其他客户端 |
| 重命名会话 | Ctrl+b $ | 修改当前会话名称 |
| 关闭会话 | tmux kill-session -t <会话名> | 终止指定会话 |
3. 窗口管理
| 操作 | 快捷键 | 说明 |
|---|---|---|
| 新建窗口 | Ctrl+b c | 创建新窗口 |
| 切换窗口 | Ctrl+b w | 可视化选择窗口 |
| 重命名窗口 | Ctrl+b , | 修改当前窗口名称 |
| 关闭窗口 | Ctrl+b & | 终止当前窗口 |
4. 窗格管理
| 操作 | 快捷键 | 说明 |
|---|---|---|
| 水平分割窗格 | Ctrl+b " | 上下分屏 |
| 垂直分割窗格 | Ctrl+b % | 左右分屏 |
| 切换窗格焦点 | Ctrl+b ↑↓←→ | 按方向切换 |
| 调整窗格尺寸 | Ctrl+b 方向键 | 按住调整大小 |
| 关闭当前窗格 | Ctrl+d | 逐级退出窗格/窗口 |
| 最大化窗格 | Ctrl+b z | 全屏切换当前窗格 |
5. 高效技巧
- 文本操作
- 进入复制模式:
Ctrl+b [,支持搜索和复制文本。 - 同步窗格:
Ctrl+b :setw synchronize-panes,向同一窗口所有窗格发送相同命令。
- 进入复制模式:
- 会话持久化
- 插件推荐:
Tmux Resurrect备份会话状态(需手动启动任务)。
- 插件推荐:
- 会话共享
多人协作时,通过共享会话实现实时同步操作。
tmux常用命令速查
# 查看所有快捷键
Ctrl+b ?
# 列出会话
tmux ls
# 重命名窗口
Ctrl+b ,
# 窗格布局切换
Ctrl+b 空格键 # 循环切换布局
提示:所有操作默认以
Ctrl+b为前缀键,可根据习惯修改配置文件~/.tmux.conf(如改为Ctrl+a)。
窗口页面滚动:
-
临时启用(仅当前会话有效)
2. 在 Tmux 界面中按下前缀键Ctrl+B
3. 输入冒号进入命令模式::
4. 输入命令并回车:set -g mouse on -
永久启用(推荐)
- 编辑 Tmux 配置文件:
nano ~/.tmux.conf - 添加配置项:
set -g mouse on - 保存文件并重新加载配置:
tmux source-file ~/.tmux.conf - 编辑 Tmux 配置文件:
-
键盘滚动(无需鼠标)
- 进入 复制模式:
- 按下
Ctrl+B→[
- 使用键盘滚动:
- 向上滚动:
Fn + ↑(Mac)或PageUp - 向下滚动:
Fn + ↓(Mac)或PageDown
- 退出复制模式:按
q键
窗口恢复
在tmux中使用Ctrl+b d分离会话后,可通过以下方法恢复窗口操作:
-
恢复最近会话
tmux attach # 或简写 tmux a默认恢复最后一次分离的会话。
-
恢复指定会话
先查看会话列表:tmux ls输出示例:
check_tmux: 1 windows (created Tue Jun 29 16:21:05 2025) debug: 2 windows (created Tue Jun 29 17:30:10 2025)按名称恢复目标会话:
tmux attach -t debug # -t 指定会话名 -
可视化会话选择
在tmux环境中按Ctrl+b s,通过方向键选择目标会话回车进入。注意事项:
- 恢复后窗口尺寸异常时,按
Ctrl+b :输入resize-window -A回车自适应调整 - 使用
tmux kill-session -t 会话名可彻底关闭会话释放资源
- 恢复后窗口尺寸异常时,按
其他
alias
-
创建临时别名
语法:alias 别名='原始命令'
示例:alias ll='ls -alF' # 输入ll等价于ls -alF alias grep='grep --color=auto' # 高亮关键词 -
查看所有别名
alias # 列出当前会话所有别名 alias ll # 查看特定别名定义 -
删除临时别名
unalias ll # 删除指定别名 unalias -a # 删除所有别名 -
永久生效配置
vi ~/.bashrc # 用户级配置(推荐) # 或 vi nano /etc/bash.bashrc # 系统级配置在文件末尾添加别名定义:
alias ll='ls -alF' alias la='ls -A'生效配置
source ~/.bashrc # 立即加载修改
波特率、比特率、码元、位bits
波特率:1s传送多少码元
码元:1s中可产生多少电平波动
比特率:1s传送多少bit
1字节=8位=8比特
码元:在数字通信中常常用时间间隔相同的符号来表示一位二进制数字.
码元也可以表示多进制数字信号,二进制时是1比特,n进制时,是n/2比特
即:
1码元 = n/2比特
波特率 = 比特率/(n/2)
ubuntu设置开机自启动
https://blog.csdn.net/castlehe/article/details/107905761
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)