Appearance
进阶命令
本章将介绍 Linux 的进阶命令,包括文本处理、数据流处理、压缩解压、任务管理等高级操作,帮助你更高效地使用 Linux。
文本处理命令
sort - 排序
bash
# sort - 对文本文件进行排序
# 基本排序(按 ASCII 码)
sort file.txt
# 按数字排序
sort -n numbers.txt
# 按数字排序(逆序)
sort -nr numbers.txt
# 按字段排序
sort -k2 file.txt # 按第 2 列排序
sort -k2 -n file.txt # 按第 2 列数字排序
# 指定字段分隔符
sort -t: -k3 -n /etc/passwd # 以 : 分隔,按第 3 列(UID)排序
# 去除重复行
sort -u file.txt
# 检查是否已排序
sort -c file.txt
# 忽略大小写
sort -f file.txt
# 按月份排序
sort -M months.txt
# 随机排序
sort -R file.txt
# 常用示例
# 按 CPU 使用率排序进程
ps aux --sort=-%cpu | head
# 按内存使用率排序进程
ps aux --sort=-%mem | head
# 按文件大小排序
du -h --max-depth=1 | sort -huniq - 去重
bash
# uniq - 去除重复行(需要先排序)
# 基本去重
sort file.txt | uniq
# 显示重复次数
sort file.txt | uniq -c
# 只显示重复行
sort file.txt | uniq -d
# 只显示不重复的行
sort file.txt | uniq -u
# 忽略大小写
sort file.txt | uniq -i
# 比较前 N 个字段
sort file.txt | uniq -f 1 # 跳过第 1 个字段比较
# 比较前 N 个字符
sort file.txt | uniq -s 5 # 跳过前 5 个字符比较
# 常用示例
# 统计日志中各 IP 访问次数
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head
# 查找重复文件
find . -type f -exec md5sum {} \; | sort | uniq -w32 -dDcut - 提取字段
bash
# cut - 从文件中提取字段
# 按字节提取
cut -b 1-10 file.txt # 提取第 1-10 个字节
# 按字符提取
cut -c 1-5 file.txt # 提取第 1-5 个字符
# 按字段提取
cut -f 1 file.txt # 提取第 1 个字段
cut -f 1,3 file.txt # 提取第 1 和第 3 个字段
cut -f 1-3 file.txt # 提取第 1-3 个字段
# 指定分隔符
cut -d: -f1 /etc/passwd # 以 : 分隔,提取第 1 个字段(用户名)
cut -d',' -f2 file.csv # 提取 CSV 第 2 列
# 提取除指定字段外的所有字段
cut -d: -f 2- --complement /etc/passwd
# 常用示例
# 提取所有用户名
cut -d: -f1 /etc/passwd
# 提取 IP 地址
echo "192.168.1.100" | cut -d. -f1-3tr - 字符转换
bash
# tr - 转换或删除字符
# 字符替换
echo "hello" | tr 'a-z' 'A-Z' # 小写转大写
echo "HELLO" | tr 'A-Z' 'a-z' # 大写转小写
# 删除字符
echo "hello 123" | tr -d '0-9' # 删除数字
echo "hello world" | tr -d ' ' # 删除空格
# 删除非指定字符
echo "hello 123" | tr -d -c '0-9' # 只保留数字
# 压缩重复字符
echo "hello world" | tr -s ' ' # 压缩多个空格为一个
# 删除换行符
cat file.txt | tr -d '\n'
# 删除 Windows 换行符
cat file.txt | tr -d '\r'
# 字符集
tr '[:lower:]' '[:upper:]' < file.txt # 小写转大写
tr -d '[:digit:]' < file.txt # 删除数字
tr -d '[:punct:]' < file.txt # 删除标点符号
# 常用示例
# 统计单词频率
cat file.txt | tr -s ' ' '\n' | sort | uniq -c | sort -nrsed - 流编辑器
bash
# sed - 流编辑器,用于文本替换和处理
# 替换第一个匹配
sed 's/old/new/' file.txt
# 替换所有匹配
sed 's/old/new/g' file.txt
# 替换第 n 个匹配
sed 's/old/new/2' file.txt # 替换每行第 2 个匹配
# 只替换第 n 行
sed '3s/old/new/' file.txt
# 替换指定范围的行
sed '1,5s/old/new/' file.txt
# 使用正则表达式
sed 's/[0-9]\+/NUM/g' file.txt
# 使用不同的分隔符
sed 's#/old/path#/new/path#g' file.txt
# 删除行
sed '3d' file.txt # 删除第 3 行
sed '1,5d' file.txt # 删除第 1-5 行
sed '/pattern/d' file.txt # 删除匹配的行
sed '/^$/d' file.txt # 删除空行
# 只显示匹配的行
sed -n '/pattern/p' file.txt
# 在行首添加内容
sed 's/^/prefix: /' file.txt
# 在行尾添加内容
sed 's/$/ :suffix/' file.txt
# 直接修改文件
sed -i 's/old/new/g' file.txt
# 创建备份后修改
sed -i.bak 's/old/new/g' file.txt
# 插入行
sed '3i\new line' file.txt # 在第 3 行前插入
sed '3a\new line' file.txt # 在第 3 行后追加
# 多个命令
sed -e 's/old/new/g' -e 's/foo/bar/g' file.txt
# 常用示例
# 删除 HTML 标签
sed 's/<[^>]*>//g' file.html
# 提取 IP 地址
ifconfig | sed -n '/inet /p' | sed 's/.*inet addr:\([0-9.]*\).*/\1/'
# 批量替换文件内容
sed -i 's/old.domain.com/new.domain.com/g' *.confawk - 文本处理工具
bash
# awk - 强大的文本处理工具
# 基本语法:awk 'pattern {action}' file
# 打印整行
awk '{print}' file.txt
# 打印指定字段
awk '{print $1}' file.txt # 打印第 1 个字段
awk '{print $1, $3}' file.txt
# 指定分隔符
awk -F: '{print $1}' /etc/passwd
# 打印行号
awk '{print NR, $0}' file.txt
# 打印字段数
awk '{print NF}' file.txt
# 条件匹配
awk '/pattern/ {print}' file.txt
awk '$3 > 100 {print}' file.txt
# BEGIN 和 END 块
awk 'BEGIN {print "Header"} {print} END {print "Footer"}' file.txt
# 计算总和
awk '{sum += $1} END {print sum}' numbers.txt
# 计算平均值
awk '{sum += $1} END {print sum/NR}' numbers.txt
# 格式化输出
awk '{printf "%-10s %5d\n", $1, $2}' file.txt
# 内置变量
# NR - 当前行号
# NF - 当前行字段数
# $0 - 整行内容
# $1-$n - 第 n 个字段
# FS - 字段分隔符
# RS - 记录分隔符
# OFS - 输出字段分隔符
# ORS - 输出记录分隔符
# 自定义变量
awk -v var="value" '{print var, $0}' file.txt
# 条件语句
awk '{if ($1 > 100) print "big"; else print "small"}' file.txt
# 循环语句
awk '{for (i=1; i<=NF; i++) print $i}' file.txt
# 常用示例
# 统计日志中各 IP 访问次数
awk '{count[$1]++} END {for (ip in count) print ip, count[ip]}' access.log
# 提取特定列并计算
awk -F: '{sum += $3} END {print sum}' /etc/passwd
# 过滤并格式化输出
df -h | awk '/^\/dev/ {printf "%-20s %10s %10s\n", $1, $3, $4}'
# 查找大文件
ls -l | awk '$5 > 1048576 {print $9, $5}'压缩与解压
gzip 和 gunzip
bash
# gzip - 压缩文件(.gz 格式)
# 压缩文件(原文件会被删除)
gzip file.txt
# 保留原文件
gzip -k file.txt
# 压缩到指定文件
gzip -c file.txt > file.txt.gz
# 解压
gunzip file.txt.gz
gzip -d file.txt.gz
# 查看压缩文件内容
zcat file.txt.gz
zless file.txt.gz
# 显示压缩信息
gzip -l file.txt.gz
# 指定压缩级别(1-9,默认 6)
gzip -9 file.txt # 最高压缩率
gzip -1 file.txt # 最快速度
# 递归压缩目录
gzip -r directory/bzip2 和 bunzip2
bash
# bzip2 - 压缩文件(.bz2 格式,压缩率比 gzip 高)
# 压缩文件
bzip2 file.txt
# 保留原文件
bzip2 -k file.txt
# 解压
bunzip2 file.txt.bz2
bzip2 -d file.txt.bz2
# 查看压缩文件内容
bzcat file.txt.bz2
bzless file.txt.bz2xz 和 unxz
bash
# xz - 压缩文件(.xz 格式,压缩率最高)
# 压缩文件
xz file.txt
# 保留原文件
xz -k file.txt
# 解压
unxz file.txt.xz
xz -d file.txt.xz
# 查看压缩文件内容
xzcat file.txt.xz
# 指定压缩级别(0-9)
xz -9 file.txt # 最高压缩率tar - 打包归档
bash
# tar - 打包和解包文件
# 创建 tar 包
tar -cvf archive.tar files/
# 创建 gzip 压缩包
tar -czvf archive.tar.gz files/
# 创建 bzip2 压缩包
tar -cjvf archive.tar.bz2 files/
# 创建 xz 压缩包
tar -cJvf archive.tar.xz files/
# 解压 tar 包
tar -xvf archive.tar
# 解压 gzip 压缩包
tar -xzvf archive.tar.gz
# 解压 bzip2 压缩包
tar -xjvf archive.tar.bz2
# 解压 xz 压缩包
tar -xJvf archive.tar.xz
# 解压到指定目录
tar -xzvf archive.tar.gz -C /path/to/dest/
# 查看压缩包内容
tar -tvf archive.tar.gz
# 追加文件到 tar 包
tar -rvf archive.tar newfile.txt
# 排除文件
tar -czvf archive.tar.gz --exclude='*.log' files/
# 选项说明:
# -c: 创建新归档
# -x: 解压归档
# -v: 显示过程
# -f: 指定归档文件名
# -z: gzip 压缩/解压
# -j: bzip2 压缩/解压
# -J: xz 压缩/解压
# -t: 列出归档内容
# -C: 指定解压目录zip 和 unzip
bash
# zip - 创建 zip 压缩包
# 压缩文件
zip archive.zip file1 file2
# 压缩目录
zip -r archive.zip directory/
# 指定压缩级别
zip -9 archive.zip file.txt # 最高压缩率
# 添加密码
zip -P password archive.zip file.txt
# unzip - 解压 zip 文件
# 解压到当前目录
unzip archive.zip
# 解压到指定目录
unzip archive.zip -d /path/to/dest/
# 查看压缩包内容
unzip -l archive.zip
# 解压指定文件
unzip archive.zip file1.txt
# 覆盖已存在的文件
unzip -o archive.zip
# 不覆盖已存在的文件
unzip -n archive.zip压缩格式对比
| 格式 | 扩展名 | 压缩率 | 速度 | 兼容性 |
|---|---|---|---|---|
| gzip | .gz | 中 | 快 | 高 |
| bzip2 | .bz2 | 高 | 慢 | 中 |
| xz | .xz | 最高 | 最慢 | 中 |
| zip | .zip | 中 | 快 | 最高 |
bash
# 常用压缩命令速查
# 打包并压缩目录
tar -czvf backup.tar.gz /path/to/dir/
# 解压到指定目录
tar -xzvf backup.tar.gz -C /path/to/dest/
# 快速压缩(低压缩率)
gzip -1 file.txt
# 最高压缩率
xz -9 file.txt任务管理
jobs - 查看后台任务
bash
# jobs - 查看当前 Shell 的后台任务
# 启动后台任务
sleep 100 &
# 输出:[1] 12345
# 查看后台任务
jobs
# 输出:[1]+ Running sleep 100 &
# 显示任务 ID 和进程 ID
jobs -l
# 输出:[1]+ 12345 Running sleep 100 &
# 只显示进程 ID
jobs -p
# 显示运行中的任务
jobs -r
# 显示已停止的任务
jobs -sfg 和 bg - 前后台切换
bash
# fg - 将后台任务切换到前台
# 将最近的后台任务切换到前台
fg
# 将指定任务切换到前台
fg %1 # % 后跟任务号
# bg - 将停止的任务放到后台运行
# 将最近停止的任务放到后台
bg
# 将指定任务放到后台
bg %1
# 示例:暂停和恢复任务
sleep 100 # 前台运行
Ctrl+Z # 暂停任务
bg # 放到后台继续运行
jobs # 查看任务
fg # 切换回前台nohup - 持久运行
bash
# nohup - 使命令在退出终端后继续运行
# 后台运行命令
nohup command &
# 输出重定向
nohup command > output.log 2>&1 &
# 示例
nohup ./my_script.sh > script.log 2>&1 &
# nohup 默认将输出写入 nohup.out 文件
nohup ./server &
# 使用 disown 使任务不受终端关闭影响
command &
disown -h %1wait - 等待任务完成
bash
# wait - 等待后台任务完成
# 启动多个后台任务
sleep 5 &
sleep 10 &
# 等待所有后台任务完成
wait
# 等待指定任务
sleep 5 &
PID=$!
wait $PID
# 在脚本中使用
#!/bin/bash
# 并行执行任务
task1 &
task2 &
task3 &
# 等待所有任务完成
wait
echo "所有任务完成"watch - 定时执行
bash
# watch - 定时执行命令并显示输出
# 每 2 秒执行一次(默认)
watch date
# 指定间隔时间
watch -n 5 df -h # 每 5 秒执行一次
# 高亮显示变化
watch -d free -h
# 显示标题
watch -t "echo 'Current time:'; date"
# 精确时间间隔
watch -n 0.5 command
# 常用示例
# 监控内存使用
watch -n 1 free -h
# 监控磁盘空间
watch -n 5 df -h
# 监控进程
watch -n 2 'ps aux | grep nginx'
# 监控日志文件大小
watch -n 10 'ls -lh /var/log/*.log'time - 测量执行时间
bash
# time - 测量命令执行时间
# 基本用法
time ls -l
# 输出说明:
# real - 实际运行时间(墙上时钟时间)
# user - 用户态 CPU 时间
# sys - 内核态 CPU 时间
# 保存时间到文件
time -o timing.txt command
# 格式化输出
time -f "耗时: %E" command
# 格式说明:
# %E - 实际时间 (格式: MM:SS.SS)
# %U - 用户态 CPU 时间
# %S - 内核态 CPU 时间
# %P - CPU 使用率
# 在脚本中使用
#!/bin/bash
start_time=$(date +%s)
# 执行命令
sleep 5
end_time=$(date +%s)
echo "耗时: $((end_time - start_time)) 秒"系统信息命令
uname - 系统信息
bash
# uname - 显示系统信息
# 显示所有信息
uname -a
# 输出:Linux ubuntu 5.15.0-91-generic #101-Ubuntu SMP x86_64 GNU/Linux
# 显示内核名称
uname -s # Linux
# 显示主机名
uname -n
# 显示内核版本
uname -r # 5.15.0-91-generic
# 显示硬件架构
uname -m # x86_64
# 显示处理器类型
uname -p
# 显示操作系统
uname -o # GNU/Linuxhostname - 主机名
bash
# hostname - 显示或设置主机名
# 显示主机名
hostname
# 显示 FQDN
hostname -f
# 显示 IP 地址
hostname -I
# 设置主机名(临时)
sudo hostname newname
# 永久设置主机名
sudo hostnamectl set-hostname newname
# 查看主机名配置
hostnamectluptime - 运行时间
bash
# uptime - 显示系统运行时间和负载
uptime
# 输出:10:30:45 up 5 days, 3:21, 2 users, load average: 0.00, 0.01, 0.05
# 输出说明:
# 10:30:45 - 当前时间
# up 5 days, 3:21 - 系统运行时间
# 2 users - 登录用户数
# load average - 系统负载(1分钟、5分钟、15分钟平均值)
# 只显示运行时间
uptime -p
# 只显示启动时间
uptime -s
# 负载含义:
# 负载值接近 CPU 核心数表示系统繁忙
# 负载值超过 CPU 核心数表示系统过载date - 日期时间
bash
# date - 显示或设置日期时间
# 显示当前日期时间
date
# 格式化输出
date "+%Y-%m-%d %H:%M:%S" # 2024-01-15 10:30:45
date "+%Y年%m月%d日" # 2024年01月15日
# 显示时间戳
date +%s # Unix 时间戳
# 时间戳转日期
date -d @1705308645
# 显示指定日期
date -d "2024-01-01"
date -d "next Monday"
date -d "last week"
date -d "+7 days"
date -d "-1 month"
# 设置系统时间
sudo date -s "2024-01-15 10:30:00"
# 常用格式:
# %Y - 四位年份
# %m - 两位月份
# %d - 两位日期
# %H - 24小时制小时
# %M - 分钟
# %S - 秒
# %A - 星期几全名
# %a - 星期几缩写
# %B - 月份全名
# %b - 月份缩写cal - 日历
bash
# cal - 显示日历
# 显示当月日历
cal
# 显示指定月份
cal 1 2024 # 2024年1月
# 显示全年日历
cal 2024
# 显示三个月
cal -3
# 显示 Julian 日历
cal -j
# 高亮今天
cal -h小结
本章介绍了 Linux 进阶命令:
| 类别 | 命令 | 功能 |
|---|---|---|
| 文本处理 | sort, uniq, cut, tr, sed, awk | 文本排序、去重、提取、转换 |
| 压缩解压 | gzip, bzip2, xz, tar, zip | 文件压缩和归档 |
| 任务管理 | jobs, fg, bg, nohup, wait, watch, time | 后台任务管理 |
| 系统信息 | uname, hostname, uptime, date, cal | 系统状态信息 |
常用命令速查
bash
# 文本处理
sort file.txt | uniq -c # 统计重复行
cut -d: -f1 /etc/passwd # 提取用户名
sed 's/old/new/g' file.txt # 替换文本
awk '{print $1}' file.txt # 提取第一列
# 压缩解压
tar -czvf backup.tar.gz dir/ # 打包压缩
tar -xzvf backup.tar.gz # 解压
# 任务管理
nohup command & # 后台持久运行
watch -n 5 command # 定时执行
# 系统信息
uname -a # 系统信息
uptime # 运行时间
date "+%Y-%m-%d %H:%M:%S" # 格式化时间下一步
下一章我们将学习 用户和组管理,了解如何在 Linux 中管理用户账户和用户组。
