19. Linux free命令、awk命令
一、free
命令:详细解析系统内存状态
free
命令用于实时查看 Linux 系统的 物理内存 和 交换分区(Swap) 使用情况,是系统监控和性能排查的核心工具。
1. 基本语法与核心选项
free [选项]
常用选项:
选项 | 作用 | 示例 |
---|---|---|
-h | 以人类可读格式(K/M/G)显示 | free -h (最常用) |
-b | 以字节(Byte)为单位 | free -b |
-k | 以 KB(1024 字节)为单位(默认) | free -k |
-m | 以 MB 为单位 | free -m |
-g | 以 GB 为单位 | free -g |
-s <秒数> | 持续刷新,间隔指定秒数 | free -s 2 (每 2 秒刷新一次) |
-t | 在输出末尾增加一行“总计”(Mem + Swap) | free -t |
-w | 显示更详细的缓冲区(buffers)和缓存(cache)拆分 | free -w |
2. 输出详解(以 free -h
为例)
total used free shared buff/cache available
Mem: 15Gi 5.2Gi 3.1Gi 982Mi 7.1Gi 9.3Gi
Swap: 10Gi 0B 10Gi
Mem 行(物理内存):
total
:总物理内存容量(系统可识别的内存总和,可能略小于硬件实际内存,因部分被 BIOS/内核占用)。used
:已使用的内存(total - free - buff/cache
)。free
:完全空闲的内存(未被任何进程使用,直接可用)。shared
:被多个进程共享的内存(如 tmpfs 临时文件系统使用的内存)。buff/cache
:buffers
:内核用于缓存磁盘块的内存(临时存储即将写入磁盘的数据,减少磁盘 I/O)。cache
:内核用于缓存文件内容的内存(临时存储从磁盘读取的数据,下次访问可直接从内存获取)。- 这部分内存可被系统“回收”给新进程使用,因此不算“真正占用”。
available
:最关键的指标,表示系统可立即分配给新进程的内存(约等于free + buff/cache
中可回收的部分),比free
更能反映实际可用内存。
Swap 行(交换分区):
- 虚拟内存的一种,当物理内存不足时,系统会将部分不常用的内存数据写入磁盘的 Swap 分区,释放物理内存。
used
过高(如超过 50%)通常意味着物理内存不足,可能导致系统卡顿(磁盘速度远慢于内存)。
3. 实用场景示例
-
快速查看内存整体状态:
free -h # 直观了解总内存、已用、可用及 Swap 情况
-
持续监控内存变化(如观察程序运行时的内存占用):
free -s 1 -h # 每 1 秒刷新一次,以人类可读格式显示
-
查看内存和 Swap 总计:
free -th # 末尾增加一行 "Total",显示 Mem + Swap 的总和
二、awk
命令:全能文本处理工具
awk
是一种编程语言,专注于结构化文本处理,能按行读取文本、按字段拆分内容,并支持条件判断、循环、计算等复杂操作,被称为“文本处理瑞士军刀”。
1. 基本语法与工作原理
awk [选项] '模式 {动作}' 文件名
工作原理:
- 按行读取输入(文件或标准输入)。
- 对每行执行“模式匹配”(可选,不写模式则匹配所有行)。
- 对匹配成功的行执行“动作”(用
{}
包裹,通常是print
输出或计算)。
2. 核心选项
选项 | 作用 | 示例 |
---|---|---|
-F <分隔符> | 指定字段分隔符(默认以空格/制表符为分隔符,连续空白视为一个分隔符) | awk -F: '{print $1}' /etc/passwd (以冒号分隔) |
-v <变量名=值> | 定义 awk 变量 | awk -v n=3 '{print $n}' file.txt (打印第 3 个字段) |
-f <脚本文件> | 从文件中读取 awk 脚本(适合复杂逻辑) | awk -f script.awk data.txt |
3. 关键概念与内置变量
- 字段(Field):每行被分隔符拆分后的片段,用
$n
表示第 n 个字段($1
第一个字段,$0
表示整行)。 - 内置变量:
变量 含义 NR
当前处理的行号(从 1 开始) NF
当前行的字段总数(最后一个字段可表示为 $NF
)FS
输入字段分隔符(同 -F
选项,可在脚本中用BEGIN{FS=":"}
设置)OFS
输出字段分隔符(默认是空格,可自定义,如 `BEGIN{OFS=" FILENAME
当前处理的文件名
4. 实用示例(从基础到进阶)
(1)基础字段提取
-
打印文件
data.txt
的所有内容(等价于cat data.txt
):awk '{print $0}' data.txt
-
打印
data.txt
每行的第 1 和第 3 个字段:awk '{print $1, $3}' data.txt
-
处理 CSV 文件(以逗号分隔),打印第 2 个字段:
awk -F',' '{print $2}' data.csv
(2)条件过滤与匹配
-
打印
/etc/passwd
中 UID 为 0 的用户(root 用户,第 3 个字段为 0):awk -F: '$3 == 0 {print $1, $3}' /etc/passwd # 输出:root 0
-
打印
access.log
中包含“404”错误的行(模式为/404/
,正则匹配):awk '/404/ {print $0}' access.log
-
打印
scores.txt
中分数(第 2 字段)大于 90 的记录:awk '$2 > 90 {print $1, $2}' scores.txt
(3)统计与计算
-
统计
/etc/passwd
中的用户总数(NR
是行号,最后一行的行号即总条数):awk -F: 'END {print "用户总数:", NR}' /etc/passwd
-
计算
sales.txt
中第 3 字段(销售额)的总和:awk '{sum += $3} END {print "总销售额:", sum}' sales.txt
-
计算平均值(如学生平均分):
awk '{sum += $2; count++} END {print "平均分:", sum/count}' scores.txt
(4)自定义分隔符与格式化输出
- 用
|
分隔输出字段,并添加标题行:
输出:awk -F: 'BEGIN {print "用户名|UID"; OFS="|"} {print $1, $3}' /etc/passwd
用户名|UID root|0 daemon|1 ...
(5)结合管道处理其他命令输出
-
查看内存使用时,仅提取物理内存的
available
数值(配合free -h
):free -h | awk 'NR==2 {print "可用内存:", $7}' # NR==2 表示第 2 行(Mem 行),$7 是 available 字段
-
统计当前登录的用户数(配合
who
命令):who | awk 'END {print "当前登录用户数:", NR}'
(6)复杂逻辑脚本(-f
选项)
创建 script.awk
文件,实现“筛选并计算”功能:
# script.awk:筛选第2字段>80的行,计算这些行第3字段的总和
BEGIN {sum = 0count = 0print "符合条件的记录:"
}
$2 > 80 {print $0 # 打印符合条件的行sum += $3count++
}
END {print "总共有", count, "条记录,第3字段总和为:", sum
}
执行:
awk -f script.awk data.txt
总结
free
命令是内存监控的核心,重点关注available
字段判断系统内存是否充足。awk
命令适合处理结构化文本(如日志、配置文件、CSV),通过“模式+动作”实现灵活的提取、过滤和统计,结合管道可与其他命令无缝协作。
多练习实际场景(如分析日志、处理配置文件)能快速掌握这两个工具的用法~