openEuler常用操作

news/2025/3/4 12:24:54/文章来源:https://www.cnblogs.com/xiugeng/p/18750293

一、常用系统命令

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 命令可将数据:

  1. 继续传递给后续管道
  2. 同时输出到文件/其他命令
# 语法: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优势

  1. 命令行编辑功能:Bash提供了强大的命令行编辑能力,允许用户使用方向键前后移动光标,并对命令进行任意的编辑操作。
  2. 历史命令功能:Bash会保存其会话中用户曾经执行过的命令,这使得用户可以方便地重复使用或修改以前输入的命令。
  3. 命令和文件名补全:Bash支持通过按下Tab键来自动补全命令或文件名。
  4. 变量和流程控制:Bash提供了一套完整的变量和流程控制语句,如if-else、for循环、while循环等
  5. 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)最佳实践和常见错误

✅ 推荐做法
  1. 变量引用始终加花括号:${var}
  2. 字符串比较使用双引号:[ "$var" = "test" ]
  3. 数值运算使用$(( ))sum=$((num1 + num2))
  4. 敏感信息避免硬编码: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、环境变量

环境变量是操作系统级别的动态键值对,用于:

  1. 定义Shell及其子进程的运行环境
  2. 存储系统/用户级配置
  3. 实现进程间通信

关键操作命令

命令 功能 示例
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)环境变量永久和临时设置

  1. 永久设置:
    | 配置文件 | 作用范围 | 加载时机 |
    |----------|----------|---------|
    | ~/.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 可包含脚本逻辑,支持变量扩展,适合于复杂环境初始化。

  1. 临时设置:
# 临时环境变量(不影响当前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 Appleapple 视为相同
-m 合并已排序文件 sort -m file1 file2 合并多个已排序文件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/893368.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是项目管理?五大流程是什么?

项目管理这东西,大家可能听过,但是具体怎么操作,很多人可能就一头雾水了。 简单来说,项目管理就是为了完成某个特定目标,把时间、资源、人员等因素有条不紊地组织、协调、控制和调整,最终确保项目按时、按预算、高质量地完成。 这个“项目”可以是任何东西,比如公司新产…

最全面的浏览器教程-完结撒花

完结撒花 🎉🎉🎉完结撒花 🎉🎉🎉 《最全面的浏览器教程》目前要告一段落了,耗时我一个多月,整理了大量的笔记,参考了很多教程和文章,累计写了 24 篇文章,7.3 万字,200 多张图片,收获了很多粉丝和鼓励,在此表示感谢。 如果后续有学到什么新技巧,看到好玩意…

牛客题解 | 字符串相乘

牛客题库题解题目 题目链接 题解 题目难度:中等难度 知识点:字符串、大数相乘 模拟人工计算 计算的过程基本上和小学生列竖式做乘法相同。为编程方便,并不急于处理进位,而将进位问题留待最后统一处理。数组a存储第一个数字123(逆序)数组b存储第二数组20(逆序)结果存入数…

皮尔逊、斯皮尔曼、肯德尔相关系数

相关系数和特征选择 相关系数和特征选择,一个是属性,一个是特征。一般,把数据集中的各列成为属性,而对算法模型表现有益的属性成为特征。例如,在预测泰坦尼克乘客的存活情况时,乘客姓名这个属性对我们的预测可能没有帮助,甚至会干扰模型表现;而乘客年龄、性别或许与存活…

认识 TapFlow,以编程方式运行 TapData

TapFlow 是 TapData Live Data Platform 最新推出的一个面向编程的API 框架。TapFlow 可以让开发者和数据工程师用一个简单易用而又强大的编程语言来进行数据管道和数据模型的开发工作。**什么是TapFlow? ** TapFlow 是 TapData Live Data Platform 最新推出的一个面向编程的A…

Maya 影视渲染,渲染101 让创作无压力!

Maya 创作时,渲染是不是常让人崩溃?漫长等待、电脑性能不足、报错频出,今天就给大家分享基于渲染 101 平台的 Maya 云渲染,轻松解决这些难题!告别漫长等待,效率飙升**** 自己电脑渲染复杂 Maya 项目,耗时久,进度慢。渲染 101 的云渲染有强大计算集群,众多高性能服务器…

Java SpringBoot 升级后,编译打包都没问题,运行报错

编译打包都没问题,运行报错 10:36:39,587 |-INFO in ch.qos.logback.classic.joran.JoranConfigurator@5966cc - Registering current configuration as safe fallback point Exception in thread "main" java.lang.NoClassDefFoundError: org/springframework/core…

在Hyper-V虚拟化平台上,怎么创建和管理虚拟机呢?

确实,在Hyper-V虚拟化平台上,创建和管理虚拟机(VMs)是实现资源高效利用和业务灵活部署的关键。以下是对这一观点的详细阐述:一、创建虚拟机:资源高效利用的基础 资源分配与优化: 在创建虚拟机时,管理员需要根据业务需求合理分配CPU、内存、存储和网络等资源。通过精确的…

STM32实战——ESP8266 WIFI模块

此篇博文提供了ESP8266的开发指南,包括在STM32上使用ESP8266进行WiFi连接、发送和接收HTTP请求以及在ESP8266中使用AT指令发送GET方式请求等内容。ESP8266 硬件介绍 ESP8266系列模组有哪些:在本实验中,ESP8266与ESP-01不做区分。 ESP-01引脚介绍:引脚 功能3.3 3.3V供电,避…

一招学会Prometheus对接三方监控平台

文章来源:乐维社区 通过将Prometheus与不同的监控工具和服务集成,企业可以实现对更广泛资源和服务的监控,包括那些不由Prometheus原生支持的系统。这种集成不仅有助于获取更全面、深入的监控数据,还能提升故障排查和性能优化的效率,从而确保系统的稳定性和可靠性。 环境说…

Motoman机器人XRC控制柜维修

在现代工业生产中,YASKAWA机器人扮演着至关重要的角色。然而,如同所有的机械设备一样,YASKAWA机器人也会出现故障,尤其是其控制柜部分。因此,安川机器人维修工作对于保障机器人的正常运行意义非凡,这其中安川机器人控制柜维修更是关键环节。一、常见故障及解决方法1. 电源…

【域攻击】无文件落地攻击:msiexec

msiexec.exe属于系统进程,是Windows Installer的一部分,用于安装Windows Installer安装包(MSI),对系统的正常运行非常重要,一般在运行Microsoft Update安装更新或安装部分软件的时候出现,占用内存比较大,我们亦可以使用其作为无文件落地的媒介,下面举例说明: Step 1:使…