一、常用系统命令
1、echo命令
echo
命令:在终端设备上输出字符串或变量提取后的值。
语法格式: echo [选项] [string 或 $variable]
$
:提取变量的实际值。-n
:输出后不换行。(默认换行)-e
:启动转义字符(如\n
换行符、\t
制表符等)。-E
:关闭转义字符。(默认开启)
引号规则:
- 单引号 ' ':禁止变量和转义字符替换
- 双引号 " ":允许变量和转义字符替换
# 显示普通字符串
[root@hqs-openEuler ~]# echo "Hello, openEuler!"
Hello, openEuler!# 显示变量
[root@hqs-openEuler ~]# name="openEuler"
[root@hqs-openEuler ~]# echo "Welcome to $name"
Welcome to openEuler# 不换行输出
[root@hqs-openEuler ~]# echo -n "Loading..." && echo " Done!"
Loading... Done!# 转义字符处理
[root@hqs-openEuler ~]# echo -e "Line 1\nLine 2\tTabbed" # \n 换行,\t 制表符
Line 1
Line 2 Tabbed
# 单引号不允许转义字符替换
[root@hqs-openEuler ~]# echo 'Line 1\nLine 2\tTabbed'
Line 1\nLine 2\tTabbed# 显示命令执行结果
[root@hqs-openEuler ~]# echo "The current directory is: `pwd`"
The current directory is: /root
2、重启/关机命令
(1)reboot命令
reboot
命令:重启系统。
# 语法:reboot [选项]
reboot # 正常重启
reboot -f # 强制重启(可能导致数据丢失)
选项 | 说明 |
---|---|
-f |
强制重启(跳过正常关闭流程) |
-w |
模拟重启(只写日志,不实际执行) |
(2)shutdown命令
shutdown
命令:安全关闭或重启系统。支持定时操作和用户通知。
主要选项:
选项 | 说明 |
---|---|
-r |
重启系统(Reboot) |
-h |
关闭系统(Halt) |
-c |
取消已计划的关机/重启 |
-k |
仅发送警告消息,不实际执行操作 |
时间格式:
格式 | 示例 | 说明 |
---|---|---|
now |
shutdown -r now |
立即执行 |
+分钟数 |
shutdown -h +10 |
10分钟后执行 |
HH:MM |
shutdown -r 14:30 |
指定具体时间(24小时制) |
# 语法:shutdown [选项] [时间] [消息]sudo shutdown -r +5 "系统将在5分钟后重启!" # 5分钟后重启并通知用户
sudo shutdown -h 20:00 # 20:00关闭系统
sudo shutdown -c # 取消计划操作
(3)poweroff和halt命令
halt
:停止系统运行但不切断电源(需物理关闭电源)。
poweroff
:停止系统运行并切断电源(相当于关机)。
(4)init命令
init
命令:通过改变运行级别实现系统的关闭、重启等操作。
# 语法:init [选项] [运行级别]
init 0 # 关机
init 6 # 重启
(5)systemctl命令
systemctl
命令:用于管理系统服务。
# 语法:systemctl [选项] [服务名]
systemctl poweroff # 关机
systemctl reboot # 重启
systemctl halt # 停止系统运行但不切断电源
systemctl suspend # 休眠
(6)强制重启/关机
当系统完全无相应时:
echo 1 > /proc/sys/kernel/sysrq # 启用SysRq功能
echo b > /proc/sysrq-trigger # 强制重启(可能会导致数据丢失)
echo o > /proc/sysrq-trigger # 强制关机(可能会导致数据丢失)
(7)查看关机/重启日志
journalctl -b -1 # 查看上次关机/重启日志journalctl -u systemd-shutdown # 查看关机/重启过程日志last reboot # 查看历史重启记录
3、ps命令
ps
(Process Status)用于查看当前系统的进程状态信息,支持多种选项组合以灵活筛选和格式化输出。
常用选项:
选项 | 说明 |
---|---|
a |
显示所有用户的进程(包括其他用户) |
u |
以用户友好的格式显示详细信息(如 CPU、内存占用) |
x |
显示没有控制终端(TTY)的进程(如后台服务) |
-e 或 -A |
显示所有进程(等价于 ps aux ) |
-f |
显示完整格式(包括父进程 PID、启动时间等) |
-l |
长格式输出(显示优先级、信号状态等) |
-o |
自定义输出字段(如 pid,user,cmd,%cpu ) |
--forest |
以树形结构显示进程层级关系 |
--sort |
按指定字段排序(如 --sort=-%cpu 按 CPU 降序) |
# 查看当前用户的进程
[root@hqs-openEuler ~]# psPID TTY TIME CMD1597 pts/0 00:00:00 bash2616 pts/0 00:00:00 ps# 查看所有进程(BSD 风格)
[root@hqs-openEuler ~]# ps aux
进程所有者 进程ID CPU占用率 内存占用率 虚拟内存 物理内存 终端 状态 启动时间 命令
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 1.0 71928 35936 ? Ss 10:55 0:01 /usr/lib/systemd/systemd -
root 2 0.0 0.0 0 0 ? S 10:55 0:00 [kthreadd]# 查看所有进程(GNU 风格)
[root@hqs-openEuler ~]# ps -ef# 查看指定进程
[root@hqs-openEuler ~]# ps -p | grep sshd# 实时监控进程
[root@hqs-openEuler ~]# watch -n 1 'ps aux | grep sshd'# 查看进程环境变量
[root@hqs-openEuler ~]# ps eww -p 913 # 显示指定进程的环境变量PID TTY STAT TIME COMMAND913 ? S 0:00 /usr/sbin/chronyd LANG=en_US.UTF-8 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin PIDFILE=/run/chrony/chronyd.pid USER=root INVOCATION_ID=c1f316ff55dd4e20b6493e043a608663 JOURNAL_STREAM=8:8963 SYSTEMD_EXEC_PID=880 OPTIONS=# 显示线程信息
[root@hqs-openEuler ~]# ps -eLf # 查看所有线程(`LWP` 字段为线程 ID)
输出字段:
字段 | 说明 |
---|---|
PID |
进程 ID |
USER |
进程所有者 |
%CPU |
CPU 占用率 |
%MEM |
内存占用率 |
VSZ |
虚拟内存大小(KB) |
RSS |
实际物理内存占用(KB) |
TTY |
进程关联的终端(? 表示无终端,如守护进程) |
STAT |
进程状态:R (运行)、S (睡眠)、D (不可中断睡眠)、Z (僵尸)、T (停止)、+ (前台进程) |
START |
进程启动时间 |
TIME |
累计 CPU 占用时间 |
COMMAND |
启动进程的命令([] 表示内核线程) |
4、kill命令
kill
用于向进程发送信号以控制其行为(如终止、暂停、重新加载配置等)。默认发送 SIGTERM
信号(正常终止进程)。
常用信号:
信号名 | 信号值 | 说明 | 场景 |
---|---|---|---|
SIGTERM |
15 (默认) | 请求进程终止(允许进程清理资源) | 正常关闭进程 ★★★ |
SIGKILL |
9 | 强制终止进程(立即停止,不可被捕获或忽略) | 进程无响应时 ★★ |
SIGHUP |
1 | 挂起信号(常用于重新加载配置) | 重启服务(如 nginx -s reload) ★★ |
SIGINT |
2 | 中断信号(等同于 Ctrl+C ) |
终止前台进程 ★★ |
SIGSTOP |
19 | 暂停进程(不可被捕获) | 调试进程状态 ★ |
SIGCONT |
18 | 继续执行被暂停的进程 | 恢复暂停的进程 ★ |
# 语法:kill [选项] [信号] <PID>...
# 选项:
# -l:列出所有支持的信号名和值
# -s <信号>:指定信号名或值# 正常终止进程
kill 1234
# 等同于
kill -15 1234# 强制终止进程
kill -9 1234
# 等同于
kill -SIGKILL 1234# 终止所有同名进程
killall -9 nginx# 重新加载配置(如 Web 服务器)
kill -1 $(pgrep nginx) # 向所有 nginx 进程发送 SIGHUP(重新加载配置)# 查找并终止进程
kill $(ps aux | grep 'python script.py' | awk '{print $2}') # 终止指定命令的进程# 暂停/恢复进程
kill -STOP 1234 # 暂停进程
kill -CONT 1234 # 恢复进程
5、pstree命令
pstree
命令:以树形图的形式展示进程之间的关系。
选项 | 说明 |
---|---|
-p |
显示进程的 PID |
-u |
显示进程所属的用户名 |
-a |
显示进程的完整命令行参数 |
-n |
按 PID 数字排序(默认按进程名排序) |
-h |
高亮当前进程及其祖先进程 |
-G |
使用 VT100 终端颜色高亮不同层级 |
-l |
不截断长命令行(默认超过屏幕宽度会截断) |
-T |
仅显示线程(不合并相同进程名的线程) |
-s |
显示指定进程的父进程链 |
# 语法:pstree [选项] [PID或用户名]# 显示当前用户的进程树
[root@hqs-openEuler ~]# pstree
systemd─┬─NetworkManager─┬─dhclient│ └─3*[{NetworkManager}]├─agetty├─auditd───{auditd}├─chronyd├─crond├─dbus-daemon├─firewalld───{firewalld}├─irqbalance───{irqbalance}├─polkitd───3*[{polkitd}]├─restorecond├─rngd───3*[{rngd}]├─rsyslogd───2*[{rsyslogd}]├─sshd───sshd───sshd───bash───pstree├─systemd-journal├─systemd-logind├─systemd-udevd└─tuned───3*[{tuned}]# 显示PID和用户名
[root@hqs-openEuler ~]# pstree -pu
systemd(1)─┬─NetworkManager(929)─┬─dhclient(1139)│ ├─{NetworkManager}(935)│ ├─{NetworkManager}(936)│ └─{NetworkManager}(938)# 查找指定进程的的子树
[root@hqs-openEuler ~]# pstree -p 951
tuned(951)─┬─{tuned}(1286)├─{tuned}(1288)└─{tuned}(1289)
6、tracepath
tracepath
命令:用于跟踪数据包在网络中的路径。显示路径中的每一跳(hop)及对应延迟、MTU 等信息。
选项 | 说明 |
---|---|
-n |
禁用 DNS 反向解析(直接显示 IP 地址) |
-b |
同时显示主机名和 IP 地址 |
-l <长度> |
设置初始数据包长度(单位:字节,默认基于 MTU 自动计算) |
-m <跳数> |
设置最大跳数(默认 30) |
-p <端口> |
指定目标端口(默认使用随机端口) |
# 语法:tracepath [选项] <目标主机> [端口]
tracepath example.com
# 输出示例:
# 1?: [LOCALHOST] 0.023ms
# 1: 192.168.1.1 5.123ms
# 2: 10.100.0.1 12.456ms pmtu 1500# 禁用 DNS 解析
tracepath -n 8.8.8.8
二、标准IO和管道
进程的 I/O(输入/输出)通道是操作系统提供的通信机制,允许进程与外部设备、文件、网络或其他进程交换数据。
管道符 |
是 Unix/Linux 中用于进程间通信的核心符号,允许将一个命令的输出直接传递给另一个命令的输入,形成命令流水线。
1、I/O通道类型
通道类型 | 描述 | 典型应用场景 |
---|---|---|
标准流 | 每个进程默认打开的 3 个文件描述符:stdin (0)、stdout (1)、stderr (2) |
控制台输入输出 |
文件 I/O | 通过文件描述符操作磁盘文件(如 open() , read() , write() ) |
读写本地文件 |
管道(Pipe) | 单向通信,用于父子进程或兄弟进程间数据传输(` | ` 符号) |
命名管道(FIFO) | 具名管道,支持无关进程间通信(通过文件系统路径访问) | 跨进程持久化通信 |
套接字(Socket) | 支持网络通信(TCP/UDP)或本地进程间通信(Unix Domain Socket) | 客户端-服务器模型 |
设备文件 | 通过 /dev 下的特殊文件与硬件交互(如 /dev/sda , /dev/ttyS0 ) |
磁盘操作、串口通信 |
2、I/O重定向
操作符 | 说明 | 示例 |
---|---|---|
> |
重定向标准输出到文件(覆盖) | ls > output.txt |
>> |
追加标准输出到文件 | echo "log" >> app.log |
< |
从文件读取标准输入 | sort < input.txt |
2> |
重定向标准错误到文件 | grep * 2> errors.log |
&> |
重定向标准输出和错误到同一文件 | command &> all_output.log |
| |
管道:将前一个命令的输出作为下一个命令的输入 | ps aux | grep nginx |
3、管道符
管道符(|
)是命令行中用于将多个命令串联的工具,将前一个命令的标准输出作为后一个命令的标准输入。通过管道符,可以组合简单命令实现复杂操作。
- 单向数据流:数据从左到右传递。
- 并行执行:所有命令同时运行,通过缓冲区协调输入输出。
- 仅传递标准输出:错误输出需手动重定向(如 2>&1)
# 列出当前目录下所有文件,并过滤出以 .bak 结尾的文件
[root@hqs-openEuler ~]# ls -l | grep ".bak"
-rw-r--r--. 1 root root 0 Feb 25 09:52 hcip.bak# 统计当前目录文件数量
[root@hqs-openEuler ~]# ls | wc -l
5# 多级处理
[root@hqs-openEuler ~]# ps aux | grep sshd | grep -v grep | awk '{print $2}'
951
1308
1480# 分页显示
# 查看长文本使用分页器
[root@hqs-openEuler ~]# cat /etc/passwd | less
4、三通管道(Tee Pipe)
三通管道是命令行中实现「一输入多输出」的特殊操作,名称源于管道三通接头(TEE junction)。通过 tee
命令可将数据:
- 继续传递给后续管道
- 同时输出到文件/其他命令
# 语法:tee [选项] <文件名># 1.保存中间结果
# 示例:将标准输入输出重定向到文件并输出到屏幕
[root@hqs-openEuler ~]# echo "Hello World" | tee output.txt# 将进程列表同时:
# - 输出到 processes.log
# - 传递给 grep 过滤
[root@hqs-openEuler ~]# ps aux | tee processes.log | grep "nginx"# 2.多路处理
# 同时进行三种操作:
# - 原始数据存 all.log
# - 错误信息过滤存 error.log
# - 实时查看处理结果
[root@hqs-openEuler ~] python script.py 2>&1 | tee all.log | grep "ERROR" | tee error.log# 3.多命令并行处理
# 使用进程替换实现三通:
# - 同时传递给 wc 和 grep
# - 最终结果排序
cat data.txt | tee >(wc -l) >(grep "key") | sort
三、shell
Shell 又称命令解释器,能识别用户输入的各种命令,并传递给操作系统。作用类似于Windows操作系统中的命令行。
在 Linux 中,Shell 既是用户交互的界面,也是控制系统的脚本语言。
Shell有多种不同的类型,其中Bash(Bourne Again Shell)是最常见的Shell之一。除此之外,还有C Shell(csh)、Korn Shell(ksh)和Z Shell(zsh)等。每种Shell都有其独特的特性和语法风格,但它们的基本功能相同:作为用户与Kernel之间的桥梁。
命令可以分为两大类:内置命令和外部命令。内置命令是Shell自身的一部分,不需要创建新的进程来执行;而外部命令则是独立的可执行文件,当执行时,Shell会根据PATH环境变量查找对应的文件并启动一个新的进程来运行该命令。无论是内置还是外部命令,它们都需要经过Shell进行解析后才能被Kernel理解和执行。
1、Bash优势
- 命令行编辑功能:Bash提供了强大的命令行编辑能力,允许用户使用方向键前后移动光标,并对命令进行任意的编辑操作。
- 历史命令功能:Bash会保存其会话中用户曾经执行过的命令,这使得用户可以方便地重复使用或修改以前输入的命令。
- 命令和文件名补全:Bash支持通过按下Tab键来自动补全命令或文件名。
- 变量和流程控制:Bash提供了一套完整的变量和流程控制语句,如if-else、for循环、while循环等
- I/O重定向及管道:Bash允许用户轻松地将程序的输出重定向到文件或其他程序中,从而实现数据处理的自动化。
2、bash shell 快捷键
Bash Shell 提供了丰富的快捷键,这些快捷键极大地提高了命令行操作的效率。
快捷键 | 功能描述 |
---|---|
Ctrl + a |
将光标移到命令行首 |
Ctrl + e |
将光标移到命令行尾 |
Ctrl + f |
按字符前移(右向) |
Ctrl + b |
按字符后移(左向) |
Alt + f |
按单词前移(右向) |
Alt + b |
按单词后移(左向) |
Ctrl + p |
上一个命令(历史记录中) |
Ctrl + n |
下一个命令(历史记录中) |
Ctrl + r |
搜索历史命令 |
Ctrl + l |
清屏 |
Ctrl + d |
删除光标所在位置的字符 |
Ctrl + h |
向前删除字符(退格键功能) |
Ctrl + w |
删除光标前的一个单词 |
Ctrl + k |
删除从光标到行尾的所有字符 |
Ctrl + u |
删除从光标到行首的所有字符 |
Ctrl + t |
交换光标前后的两个字符 |
Alt + t |
交换光标前的两个单词 |
Ctrl + xx |
在行首和当前光标位置之间切换 |
Ctrl + x Ctrl + e |
编辑当前命令行(使用默认文本编辑器) |
3、bash变量
变量类型对比
类型 | 作用域 | 生命周期 | 声明方式 | 示例 |
---|---|---|---|---|
本地变量 | 当前Shell | Shell进程结束 | 默认声明 | var="value" |
环境变量 | 子进程可见 | Shell进程结束 | export 声明 |
export PATH=$PATH:/new |
特殊参数 | 全局 | 随上下文变化 | 系统预定义 | $0 (脚本名) |
位置参数 | 函数/脚本内 | 调用周期 | 脚本/函数参数传入 | $1 , $2 |
数组变量 | 同普通变量 | 同普通变量 | declare -a |
arr=(1 2 3) |
关联数组 | 同普通变量 | 同普通变量 | declare -A |
declare -A dict=([k]=v) |
(1)变量声明语法
语法形式 | 作用 | 注意事项 | 等效写法 |
---|---|---|---|
var=value |
基础赋值 | 等号两侧不能有空格 | declare var=value |
declare var=value |
显式声明变量 | 支持类型声明(-i/-a等) | - |
readonly var=value |
创建只读变量 | 不可修改/删除 | declare -r var=value |
export var=value |
创建环境变量 | 子进程可继承 | declare -x var=value |
local var=value |
函数内声明局部变量 | 只能在函数内使用 | - |
(2)变量引用
引用形式 | 功能描述 | 防空白截断 | 示例 | 输出结果 |
---|---|---|---|---|
$var | 基础引用 | ❌ | echo $var |
value | |||
${var} | 标准引用 | ✅ | echo ${var}file |
valuefile | |||
"$var" | 保留空白引用 | ✅ | echo "$var" |
value(保留格式) | |||
'$var' | 禁止变量扩展 | - | echo '$var' |
$var | |||
$(cmd) | 命令替换 | ✅ | echo $(date) |
当前时间 | |||
`cmd` |
旧式命令替换(已不推荐) | ✅ | echo `date` |
当前时间 |
(3)特殊参数
参数 | 描述 | 典型应用场景 | 示例 |
---|---|---|---|
$0 | 脚本/命令名称 | 获取当前执行脚本名 | echo "Script: $0" |
|||
$# | 参数个数 | 验证输入参数数量 | if [ $# -lt 2 ]; then |
|||
$@ | 所有位置参数(保留分隔) | 遍历所有参数 | for arg in "$@"; do |
|||
$* | 所有位置参数(合并) | 批量传递参数 | echo "$*" |
|||
$? | 上条命令退出状态 | 错误检查 | if [ $? -ne 0 ]; then |
|||
`$ | 参数 | 描述 | 典型应用场景 |
----------- | --------------------------- | --------------------------- | -------------------------- |
| 当前Shell进程ID | 生成临时文件名 | `tmp="/tmp/$$.tmp"` |
| $!
| 最后一个后台进程PID | 管理后台进程 | kill $!
|
| $-
| 当前Shell选项设置 | 调试脚本 | echo "Options: $- "
|
(4)数组
操作 | 语法 | 示例 | 结果 |
---|---|---|---|
声明数组 | declare -a arr |
arr=(a b c) |
创建索引数组 |
获取元素 | ${arr[index]} | echo ${arr[0]} |
a | |
获取所有元素 | ${arr[@]} | echo "${arr[@]}" |
a b c | |
获取元素个数 | ${#arr[@]} | echo ${#arr[@]} |
3 | |
追加元素 | arr+=(d) |
arr+=(d) |
(a b c d) |
删除元素 | unset arr[index] |
unset arr[1] |
(a c) |
(5)关联数组
操作 | 语法 | 示例 | 结果 |
---|---|---|---|
声明关联数组 | declare -A dict |
dict=([k1]=v1 [k2]=v2) |
创建键值对 |
获取键列表 | ${!dict[@]} | echo "${!dict[@]}" |
k1 k2 | |
获取值列表 | ${dict[@]} | echo "${dict[@]}" |
v1 v2 | |
遍历操作 | for key in "${!dict[@]}" |
循环处理键值对 | - |
(6)变量替换
语法格式 | 功能描述 | 示例 | 结果 |
---|---|---|---|
${var:-default} | 空值时使用默认值 | echo ${var:-100} |
var为空输出100 | ||
${var:=default} | 空时赋值默认值 | echo ${var:=100} |
var被设为100 | ||
${var:?error_msg} | 空时报错退出 | ${var:?未定义} |
终止并提示错误 | ||
${var:+replacement} | 非空时使用替代值 | echo ${var:+存在} |
var非空输出"存在" | ||
${var:offset:length} | 子字符串提取 | ${str:2:3} |
第3字符起取3位 | ||
${#var} | 获取字符串长度 | echo ${#str} |
输出字符串长度 | ||
${var#pattern} | 删除最短前导匹配 | ${file#*/} |
去除第一个/ 前内容 |
||
${var##pattern} | 删除最长前导匹配 | ${file##*/} |
保留文件名 | ||
${var%pattern} | 删除最短后导匹配 | ${file%.*} |
去除扩展名 | ||
${var%%pattern} | 删除最长后导匹配 | ${file%%-*} |
去除最后- 后内容 |
(7)数值运算方法对比
方法 | 语法 | 支持浮点数 | 示例 | 输出 |
---|---|---|---|---|
$(( )) | echo $((1+2)) |
❌ | echo $((3*4)) |
12 | |
let |
let "res=5**2" |
❌ | let "x=10%3" |
x=1 |
expr |
expr 10 + 20 |
❌ | expr 100 / 5 |
20 |
bc |
echo "scale=2;7/3" | bc |
✅ | echo "1.2+3.8" | bc |
5.0 |
awk |
awk 'BEGIN{print 3.14*2}' |
✅ | awk 'BEGIN{print 1/3}' |
0.333333 |
(8)最佳实践和常见错误
✅ 推荐做法
- 变量引用始终加花括号:
${var}
- 字符串比较使用双引号:
[ "$var" = "test" ]
- 数值运算使用
$(( ))
:sum=$((num1 + num2))
- 敏感信息避免硬编码:
read -s passwd
❌ 常见错误
var = "value" # 等号两侧有空格
echo $var # 未加引号导致空白符解析异常
[ $var = "" ] # 变量未加引号,空值时报错
export var= # 创建空环境变量污染环境
4、通配符和转义字符
通配符是一种特殊的符号,用来匹配文件名或目录名中的某些模式。以下是几种常见的通配符:
*
:代表任意数量的任意字符(包括零个字符)。例如,*.txt会匹配所有以.txt结尾的文件。?
:代表单个任意字符。例如,file?.txt可以匹配file1.txt、file2.txt等,但不会匹配file10.txt。[ ]
:字符集,可以匹配方括号内列出的任何一个字符。例如,file[abc].txt可以匹配filea.txt、fileb.txt或filec.txt。{}
:花括号用于指定多个可能的字符串。例如,file{a,b,c}.txt将会匹配filea.txt、fileb.txt和filec.txt。
转义字符是用来告诉Shell不要解释紧跟在其后的特殊字符的特殊含义,而是将其视为普通字符。在Linux Shell中,最常用的转义字符是反斜杠\。例如,如果你想输出一个包含美元符号$的字符串,而不想让Shell尝试去解析它作为变量,你可以这样写:
echo "Price is \$5"
除了反斜杠外,还有其他几种转义方式:
单引号''
:单引号内的所有字符都会被视为普通字符,不进行任何变量替换或命令替换。双引号""
:双引号内的字符保留其变量属性,即允许变量替换和命令替换。反引号 或者$(command)
:执行其中的命令并返回结果
4、环境变量
环境变量是操作系统级别的动态键值对,用于:
- 定义Shell及其子进程的运行环境
- 存储系统/用户级配置
- 实现进程间通信
关键操作命令
命令 | 功能 | 示例 |
---|---|---|
export |
提升变量为环境变量 | export VAR=value |
env |
显示当前环境变量 | env | grep PATH |
printenv |
查看指定环境变量 | printenv USER |
set |
显示所有变量(含非环境变量) | set | less |
unset |
删除变量 | unset TMPDIR |
(1)常用环境变量
变量名 | 用途描述 | 默认值示例 |
---|---|---|
PATH |
可执行文件搜索路径 | /usr/local/sbin:/usr/bin |
HOME |
当前用户主目录路径 | /home/username |
USER |
当前登录用户名 | ubuntu |
SHELL |
默认Shell程序路径 | /bin/bash |
LANG |
系统语言设置 | en_US.UTF-8 |
PWD |
当前工作目录 | /var/www |
OLDPWD |
上一个工作目录 | /home |
PS1 |
主命令提示符格式 | \u@\h:\w\$ |
EDITOR |
默认文本编辑器 | vim |
LD_LIBRARY_PATH |
动态链接库搜索路径 | /usr/local/lib |
(2)环境变量永久和临时设置
- 永久设置:
| 配置文件 | 作用范围 | 加载时机 |
|----------|----------|---------|
|~/.bashrc
| 当前用户(非登录Shell) | 每次打开新终端 |
|~/.bash_profile
| 当前用户(登录Shell) | 登录时加载 |
|~/.profile
| 当前用户(兼容性配置) | 登录Shell且无.bash_profile |
|/etc/environment
| 系统全局 | 所有用户登录时 |
|/etc/profile
| 系统全局 | 所有用户登录时 |
/etc/environment
vs /etc/profile
深度对比:
特性 | /etc/environment |
/etc/profile |
---|---|---|
作用层级 | 系统级 PAM 环境变量 | 全局 Shell 配置脚本 |
适用Shell | 所有用户进程 | Bash 及其他兼容Shell |
变量类型 | 仅简单键值对 | 可包含脚本逻辑 |
语法要求 | 无 export 关键字 |
需显式使用 export |
变量扩展 | 不支持 ${VAR} 扩展 |
支持变量扩展 |
加载时机 | 登录时最早加载 | 登录Shell初始化时加载 |
典型应用 | 基础路径配置 | 复杂环境初始化 |
而且 /etc/environment
是 纯键值对,不支持变量扩展,所以 /etc/environment
适合于基础路径配置,而 /etc/profile
则适合于复杂环境初始化。
/etc/profile
可包含脚本逻辑,支持变量扩展,适合于复杂环境初始化。
- 临时设置:
# 临时环境变量(不影响当前Shell)
DEBUG=1 python script.py
(3)常用环境变量操作
# 1.查看环境变量
echo $PATH
printenv PATH# 2.设置环境变量
export VAR=value
export PATH=$PATH:/new/path# 3.删除环境变量
unset VAR# 4.环境切换--多版本管理
# 环境切换脚本
activate_dev() {export API_ENDPOINT="https://dev.api.com"export DB_NAME="dev_db"
}
activate_prod() {export API_ENDPOINT="https://api.com" export DB_NAME="prod_db"
}# 5.动态路径设置
# 避免重复添加PATH
[[ ":$PATH:" != *":/new/path:"* ]] && PATH="/new/path:$PATH"
5、Shell脚本编程
Shell脚本结构:
#!/bin/bash # 脚本头,指定脚本使用的解释器
# 注释内容 # 注释,用于解释脚本功能
name="John" # 变量声明(等号两侧不能有空格)
echo "Hello, $name!" # 使用变量
readonly age=30 # 创建只读变量
unset name # 删除变量
脚本声明:告诉系统使用哪种shell解释器执行脚本。
注释信息:对脚本解释,对命令进行解释说明。
运行脚本:
# 赋予执行权限
chmod +x script.sh
# 执行脚本
./script.sh# 或者直接使用解释器执行(不需要赋予执行权限)
bash script.sh
sh script.sh
四、文本处理工具
工具 | 作用描述 | 示例 | 输出结果 |
---|---|---|---|
sed |
流编辑器,用于文本替换和处理 | sed 's/old/new/g' |
替换所有匹配项 |
awk |
处理结构化文本数据(按列) | awk -F: '{print $1}' |
提取第一列数据 |
grep |
文本搜索工具,支持正则表达式 | grep "pattern" file |
匹配行 |
cut |
文本分割工具,支持字段分割 | cut -d: -f1 file |
提取第一列数据 |
sort |
文本排序工具 | sort file |
按行排序 |
uniq |
去重相邻重复行 | sort file.txt | uniq |
去重排序后的重复行(需先排序) |
tr |
字符替换工具 | tr 'a-z' 'A-Z' |
大小写转换 |
wc |
统计工具 | wc -l file |
统计行数 |
head |
显示文件前几行 | head -n 5 file |
显示前5行 |
tail |
显示文件后几行 | tail -n 5 file |
显示后5行 |
split |
文件分割工具 | split -l 100 file |
分割每100行 |
paste |
文件合并工具 | paste file1 file2 |
合并文件 |
join |
文件连接工具 | join file1 file2 |
连接文件 |
cat |
打印文件内容 | cat file |
打印文件内容 |
cat |
查看/合并文件内容 | cat file1.txt file2.txt |
合并 file1 和 file2 的内容并显示 |
more |
分页查看文件(仅向下翻页) | more large_file.log |
逐页显示 large_file.log 的内容 |
less |
分页查看文件(支持上下翻页) | less large_file.log |
可上下滚动浏览 large_file.log |
补充说明:
sed
: 支持正则替换(s/old/new/)、行删除(d)、插入(i)等,适合批量修改文本awk
: 支持条件判断、循环、变量,适合处理表格数据(如 CSV)和复杂计算grep
: 快速过滤行,常用参数:-i(忽略大小写)、-v(反向匹配)、-E(扩展正则)less
: 比 more 更强大,支持回退、搜索(/pattern)、跳转行号(:50)等操作head
: 默认显示前 10 行,-n 指定行数tail
: 常用 -f 实时追踪日志(如 tail -f app.log)
1、grep命令
grep
命令用于在文件中搜索指定的字符串或正则表达式,并输出匹配的行。以下是一些常用的grep
命令选项:
命令格式 | 功能描述 | 示例命令 | 输出结果示例 |
---|---|---|---|
grep "pattern" file |
在文件中搜索指定模式 | grep "error" app.log |
匹配包含"error"的行 |
grep -i "pattern" file |
忽略大小写 | grep -i "error" app.log |
匹配包含"error"的行(不区分大小写) |
grep -v "pattern" file |
反向匹配 | grep -v "error" app.log |
打印不匹配的行 |
grep -n "pattern" file |
显示匹配行行号 | grep -n "fail" app.log |
输出格式:行号:行内容 |
grep -r "pattern" dir |
递归搜索目录中的文件 | grep -r "user" /var/log |
输出目录下所有文件中匹配的行 |
grep -c "pattern" file |
统计匹配行数 | grep -c "error" app.log |
输出匹配行数,如:3 |
grep -A n "pattern" 文件 |
显示匹配行及后n行 | grep -A 2 "error" app.log |
匹配行及后两行 |
grep -B n "pattern" 文件 |
显示匹配行及前n行 | grep -B 2 "error" app.log |
匹配行及前两行 |
grep -C n "pattern" 文件 |
显示匹配行及前后n行 | grep -C 2 "error" app.log |
匹配行及前后两行 |
(1)正则表达式支持
正则类型 | 语法示例 | 作用描述 | 示例命令 | 匹配示例(输入行) |
---|---|---|---|---|
基础正则(BRE) | grep "a.b" file |
匹配任意单个字符(. ) |
grep "h.t" file.txt |
匹配 "hat"、"hot" 等 |
扩展正则(ERE) | grep -E "a|b" file |
逻辑或(| ) |
grep -E "err|warn" log.txt |
匹配含 "err" 或 "warn" 的行 |
行首/行尾锚定 | ^start 或 `end |
正则类型 | 语法示例 | 作用描述 |
----------- | ------------- | -------------- | ------------------- | ---------------------- |
基础正则(BRE) | grep "a.b" file |
匹配任意单个字符(. ) |
grep "h.t" file.txt |
匹配 "hat"、"hot" 等 |
扩展正则(ERE) | grep -E "a|b" file |
逻辑或(| ) |
grep -E "err|warn" log.txt |
匹配含 "err" 或 "warn" 的行 |
匹配行首或行尾 | grep "^2023" log.txt |
匹配以 "2023" 开头的行 | ||
字符集合 | [0-9] 或 [a-zA-Z] |
匹配指定范围内的字符 | grep "[A-Z]" file.txt |
匹配包含大写字母的行 |
量词 | a{2,4} |
匹配重复次数 | grep -E "x{3}" file.txt |
匹配 "xxx" |
(2)高级用法
功能描述 | 命令格式 | 示例命令 | 输出结果示例 |
---|---|---|---|
同时匹配多个模式 | grep -e "pattern1" -e "pattern2" 文件 |
grep -e "error" -e "warn" log.txt |
输出含 "error" 或 "warn" 的行 |
仅输出匹配的文本部分 | grep -o "pattern" 文件 |
grep -o "[0-9]\+" file.txt |
输出纯数字部分(如 123 ) |
静默模式(仅返回状态码) | grep -q "pattern" 文件 |
grep -q "ready" status.txt && echo "Yes" |
无输出,状态码决定后续操作 |
排除二进制文件 | grep -I "pattern" 文件 |
grep -I "text" * |
仅搜索文本文件,忽略二进制文件 |
(3)与其他工具结合
组合工具 | 示例命令 | 作用描述 |
---|---|---|
find |
find . -name "*.log" -exec grep "error" {} \; |
在指定文件中搜索模式 |
awk |
grep "GET" access.log | awk '{print $1}' |
先过滤行,再提取列数据 |
sort |
grep "user" log.txt | sort | uniq -c |
搜索后排序并统计重复次数 |
xargs |
echo "file1 file2" | xargs grep "text" |
将参数传递给 grep 执行 |
2、cut 命令
功能描述 | 命令格式 | 示例命令 | 输出结果示例(假设输入内容) |
---|---|---|---|
按列切割文本(默认制表符分隔) | cut -f 列号 文件 |
cut -f2 data.txt |
输出第二列内容(默认制表符分隔) |
指定分隔符切割文本 | cut -d 分隔符 -f 列号 文件 |
cut -d',' -f3 data.csv |
输出逗号分隔文件的第三列 |
按字符位置切割文本 | cut -c 起始-结束 文件 |
cut -c1-5 file.txt |
输出每行的前5个字符 |
按字节位置切割文本 | cut -b 起始-结束 文件 |
cut -b2-4 file.txt |
输出每行的第2到第4个字节 |
忽略不含分隔符的行 | cut -s -d 分隔符 -f 列号 文件 |
cut -s -d':' -f1 /etc/passwd |
输出所有含":"行的第一列(如用户名) |
3、wc 命令
wc
命令用于统计文件中的行数、字数和字符数。
功能描述 | 命令格式 | 示例命令 | 输出结果示例 |
---|---|---|---|
统计文件行数、单词数、字节数 | wc 文件 |
wc data.txt |
3 12 66 data.txt (行数 单词数 字节数) |
仅统计行数 | wc -l 文件 |
wc -l log.txt |
100 log.txt |
仅统计单词数 | wc -w 文件 |
wc -w text.txt |
500 text.txt |
仅统计字节数 | wc -c 文件 |
wc -c data.bin |
2048 data.bin |
仅统计字符数(UTF-8等) | wc -m 文件 |
wc -m utf8.txt |
1500 utf8.txt |
统计最长行的长度(字符) | wc -L 文件 |
wc -L code.py |
80 code.py |
4、sort 命令
sort
命令用于对文本进行排序。
选项 | 作用描述 | 示例命令 | 输出说明 |
---|---|---|---|
-n |
按数值大小排序(非字典序) | sort -n data.txt |
正确排序 10 > 2 |
-r |
逆序排序(降序) | sort -nr values.txt |
数值从大到小排列 |
-k |
指定排序字段(列号) | sort -k3,3 -t',' file.csv |
按第三列排序(逗号分隔) |
-t |
指定字段分隔符 | sort -t':' -k1 /etc/passwd |
以冒号分隔,按用户名排序 |
-u |
去重(保留唯一行) | sort -u log.txt |
输出所有不重复的行 |
-o |
输出到文件(覆盖原文件) | sort file.txt -o sorted.txt |
排序结果保存到 sorted.txt |
-f |
忽略大小写 | sort -f mixed.txt |
Apple 和 apple 视为相同 |
-m |
合并已排序文件 | sort -m file1 file2 |
合并多个已排序文件 |