awk 基础用法示例
awk 是 Linux 文本三剑客之一,擅长按列处理文本、提取信息和统计分析。下面通过具体示例解释其基本用法:
准备工作:创建测试文件
首先创建
employee.txt
文件,包含员工编号、姓名、部门和年龄信息:
[lyk@controller ~ 11:22:03]$ cat << 'EOF' > employee.txt > 1) 张三 技术部 23> 2) 李四 人力部 22> 3) 王五 行政部 23> 4) 赵六 技术部 24> 5) 朱七 客服部 23> EOF
示例 1:打印所有内容(默认行为)
[lyk@controller ~ 11:22:12]$ awk '{ print }' employee.txt 1) 张三 技术部 232) 李四 人力部 223) 王五 行政部 234) 赵六 技术部 245) 朱七 客服部 23
解释
awk '{ print }' 文件名
是 awk 最基础的用法。
{ print }
是 awk 的动作,表示 “打印当前行”(默认打印整行,即$0
,$0
代表整行内容)。整个命令的作用:读取
employee.txt
的每一行,然后打印该行,等价于cat 文件名
。
示例 2:通过脚本文件执行 awk 命令
如果命令较复杂,可以把 awk 命令写到一个脚本文件中,用
-f
选项调用:
# 创建 awk 脚本文件(内容是要执行的 awk 命令)[lyk@controller ~ 11:23:53]$ vim commands.awk[lyk@controller ~ 11:25:38]$ cat commands.awk { print } # 脚本中只包含一条命令:打印每行# 用 -f 选项执行脚本[lyk@controller ~ 11:25:43]$ awk -f commands.awk employee.txt 1) 张三 技术部 232) 李四 人力部 223) 王五 行政部 234) 赵六 技术部 245) 朱七 客服部 23
-f 脚本名
表示 “从脚本文件中读取 awk 命令”,适合命令较多或需要复用的场景
示例 3:按内容匹配打印特定行
# 打印包含“张三”的行[lyk@controller ~ 11:25:58]$ awk '/张三/ { print }' employee.txt 1) 张三 技术部 23#效果一样[lyk@controller ~ 11:26:18]$ awk '/张三/' employee.txt 1) 张三 技术部 23
解释: /张三/
是 awk 的 “模式”,表示 “匹配包含‘张三’的行”。
当模式匹配成功时,执行后面的动作(
{ print }
),即打印该行。若省略动作,awk 会默认执行
{ print }
,因此两种写法效果相同
示例 4:统计满足条件的行数
AWK 中的所有变量都不需要初始化,并且会自动初始化为
0
[lyk@controller ~ 11:26:24]$ awk '> /术/ { count=count+1 } > END { print "Count="count }' employee.txt#输出结果Count=2
解释:
/术/
:匹配包含 “术” 的行(这里匹配 “技术部” 的两行){ count=count+1 }
:每匹配一行,变量count
就加 1(awk 变量默认初始化为 0,无需提前定义)END { ... }
:END
是特殊模式,表示 “所有行处理完毕后执行后面的动作”,这里用于打印最终统计结果
结果为
2
,因为文件中 “技术部” 出现了 2 次(张三和赵六)
示例 5:按行长度筛选内容
AWK 提供了一个内建的函数 length($arg) 用于返回字符串
$arg
的总长度。如果要获取某行的总长度,可以使用下面的语法:
length($0)
。同样的,如果要获取某列/字段的总长度,可以使用语法:
length($n)
。如果要判断某行的字符是否大于/小于/等于 N ,可以使用下面的语法:
length($0) > N
[lyk@controller ~ 11:27:16]$ awk 'length($0)>10 { print $0 }' employee.txt#因为所有的行的总长度都大于 18,因此输出结果如下:1) 张三 技术部 232) 李四 人力部 223) 王五 行政部 234) 赵六 技术部 245) 朱七 客服部 23
$0
,代表整行记录
解释
length($0)
是 awk 的内置函数,返回整行($0
)的字符长度length($0)>10
:筛选出长度大于 10 的行(示例中所有行长度都超过 10,因此全部打印)若要筛选某一列的长度,可替换为
length($n)
(n
为列号,如length($2)
表示第 2 列的长度)
核心概念总结
模式与动作:awk 基本语法是
模式 { 动作 }
,模式匹配行后执行动作(可省略动作,默认打印)。变量:无需声明,默认初始化为 0,可直接用于计数、累加等。
特殊模式:
END
表示所有行处理完后执行动作,用于汇总结果。内置函数:如
length()
计算长度,$0
代表整行,$n
代表第 n 列(默认按空格分隔列)。