Skip to content

进阶命令

本章将介绍 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 -h

uniq - 去重

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 -dD

cut - 提取字段

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-3

tr - 字符转换

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 -nr

sed - 流编辑器

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' *.conf

awk - 文本处理工具

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.bz2

xz 和 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 -s

fg 和 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 %1

wait - 等待任务完成

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/Linux

hostname - 主机名

bash
# hostname - 显示或设置主机名

# 显示主机名
hostname

# 显示 FQDN
hostname -f

# 显示 IP 地址
hostname -I

# 设置主机名(临时)
sudo hostname newname

# 永久设置主机名
sudo hostnamectl set-hostname newname

# 查看主机名配置
hostnamectl

uptime - 运行时间

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 中管理用户账户和用户组。