1. 先搞懂:awk到底是个啥?
很多Linux新手看到awk就头大,觉得它是个高深的命令,其实一句话就能说透:awk是一个文本处理工具,更是一门简单的脚本语言,核心作用就是“读取文本、处理文本、输出结果”。
你可以把它想象成一个“文本流水线工人”:它会一行一行地读取你的文本文件,按照你设定的规则,对每一行进行加工(比如提取指定内容、过滤符合条件的行、做简单计算),最后把加工好的结果输出给你。
咱们平时用grep只能“找内容”,用sed能“改内容”,而awk擅长“提取+处理”——比如从日志里提取IP、统计某个字段的总和、按条件筛选行并格式化输出,这些都是awk的强项。
补充一点:咱们Linux系统里,默认的awk一般是gawk(GNU awk),它是awk的增强版,支持更多功能,咱们这三篇教程,全是基于gawk讲解(和系统默认awk用法完全兼容,放心学)。
2. 入门必看:awk的运行机制(浅显版)
在学具体命令之前,先搞懂awk的运行逻辑,不然学再多参数也会乱。awk的运行就分3步,记好这3步,后续所有用法都能套进去:
读取行:awk会从指定的文本文件(或标准输入)中,一行一行地读取内容,直到文件结束。
处理行:对于每一行,都会按照你写的“规则”(脚本)进行处理。规则可以很简单(比如只打印第2列),也可以很复杂(比如判断条件、做计算)。
输出结果:处理完成后,按照规则将结果输出(默认输出到屏幕,也可以输出到文件)。
举个最直观的例子:假设你有一个文本文件test.txt,内容如下:
张三 20 男
李四 25 女
王五 30 男
如果你用awk命令:awk '{print $2}' test.txt,它的运行过程就是:
读取第一行“张三 20 男”,按照规则“打印第2列”,输出20;
读取第二行“李四 25 女”,打印第2列,输出25;
读取第三行“王五 30 男”,打印第2列,输出30。
是不是很简单?接下来,我们先学“怎么运行awk”,再逐步拆解各种参数和用法。
3. 两种核心运行方式(必掌握)
根据上传的资料,awk有两种核心运行方式:直接在命令行写脚本 和 通过脚本文件运行,两种都要掌握,日常用得最多。
3.1 方式一:命令行直接写脚本(适合简单需求)
语法格式(牢记):
awk [选项] '脚本内容' 要处理的文件
关键注意点:
脚本内容必须用 单引号'' 包裹(避免被Linux shell解析,这是新手最容易踩的坑);
脚本的核心是“模式+动作”,格式一般是:
'模式 {动作}'(模式可选,动作必须用{}包裹);如果没有模式,只写动作,那么awk会对每一行都执行这个动作(比如上面的例子
awk '{print $2}' test.txt,就没有模式,只执行“打印第2列”的动作)。
实操示例(可直接复制运行):
先准备一个测试文件test.txt(和上面一样),执行以下命令,感受效果:
# 1. 打印所有行(动作:print,没有模式,默认处理所有行)
awk '{print}' test.txt
# 输出结果和cat test.txt一样:
# 张三 20 男
# 李四 25 女
# 王五 30 男
# 2. 打印每一行的第1列和第3列($1表示第1列,$3表示第3列,用逗号分隔)
awk '{print $1, $3}' test.txt
# 输出:
# 张三 男
# 李四 女
# 王五 男
# 3. 带模式:只打印“性别为男”的行(模式:$3=="男",动作:打印整行)
awk '$3=="男" {print}' test.txt
# 输出:
# 张三 20 男
# 王五 30 男
# 4. 带模式+复杂动作:打印性别为男的行,并且在前面加“姓名:”“年龄:”
awk '$3=="男" {print "姓名:"$1, "年龄:"$2}' test.txt
# 输出:
# 姓名:张三 年龄:20
# 姓名:王五 年龄:30
补充说明:$0 表示“整行内容”,比如 awk '{print $0}' test.txt 和 awk '{print}' test.txt 效果一样,都是打印整行。
3.2 方式二:通过脚本文件运行(适合复杂需求)
如果你的脚本比较复杂(比如有多条规则、循环、函数),直接写在命令行里会很乱,容易出错,这时候就可以把脚本写到一个文件里,然后用awk去执行这个文件。
语法格式(牢记):
awk [选项] -f 脚本文件名 要处理的文件
关键注意点:
用 -f 选项指定脚本文件(f是file的缩写);
脚本文件里,不需要用单引号包裹脚本内容,直接写“模式+动作”即可;
脚本文件可以任意命名,建议后缀为
.awk(方便识别,比如test.awk)。
实操示例(可直接复制运行):
# 1. 创建一个脚本文件test.awk,写入以下内容(用vim或nano编辑)
vim test.awk
# 脚本内容:
$3=="男" {
print "男性用户:"$1, "年龄:"$2}
$3=="女" {
print "女性用户:"$1, "年龄:"$2}
# 2. 保存退出后,用awk执行这个脚本,处理test.txt
awk -f test.awk test.txt
# 3. 输出结果:
# 男性用户:张三 年龄:20
# 女性用户:李四 年龄:25
# 男性用户:王五 年龄:30
是不是很清晰?复杂的逻辑拆分到脚本文件里,后续修改、复用都很方便。
4. 课后练习(自己动手试,巩固记忆):
用命令行直接写脚本,打印test.txt中“年龄大于25”的行;
创建一个脚本文件,实现“打印所有行的第1列,并在后面加‘_user’”(比如张三_user);
尝试用
awk '{print $0, "补充内容"}' test.txt,看看输出效果(理解$0的用法)。
下一篇,我们将详细讲解awk的命令行参数(结合上传资料的所有选项),包括最常用的-F、-v、-e等,还有字段分隔符、变量赋值等核心用法,帮你解锁更强大的文本处理能力!