Skip to main content

Linux 核心命令

文件查看编辑命令 awk

awk 是一个非常强大的文本处理工具,它可以逐行读取文件,根据分隔符将一行切成字段,然后对这些字段进行各种操作,比如打印、计算、条件判断等。它天生适合处理表格数据、日志文件。

1. 基本用法:打印整行

最简单的用法就是把整行原封不动地打印出来。

awk '{print}' file.txt

2. 按字段打印数据

默认分隔符是空格或 TAB,可以直接用 $1$2 代表第 1、2 列,$0 代表整行。

# 打印第一列
awk '{print $1}' file.txt

# 打印第一列和第三列
awk '{print $1, $3}' file.txt

3. 使用自定义分隔符

-F 参数可以指定字段分隔符,比如逗号、冒号等。

# 按逗号分隔,打印第二列
awk -F ',' '{print $2}' file.txt

# 按冒号分隔,打印第一列和第三列
awk -F ':' '{print $1, $3}' file.txt

4. 条件过滤

awk 可以直接在花括号前加条件,相当于 if 语句。

# 打印第二列等于 100 的行
awk '$2 == 100 {print $0}' file.txt

# 打印第一列大于 50 的行
awk '$1 > 50 {print $1, $2}' file.txt

# 匹配包含 keyword 的行
awk '/keyword/ {print $0}' file.txt

5. 使用模式和动作组合

模式可以是正则表达式,动作就是 {} 里的代码。

# 正则匹配第一列以 abc 开头的行
awk '$1 ~ /^abc/ {print $1, $2}' file.txt

# 正则匹配第二列不包含 xyz 的行
awk '$2 !~ /xyz/ {print $0}' file.txt

6. 内置变量

awk 有一些非常实用的内置变量。

# NR: 当前行号
awk '{print NR, $0}' file.txt

# NF: 当前行的字段数
awk '{print NF, $0}' file.txt

# $NF: 最后一列
awk '{print $NF}' file.txt

# $(NF-1): 倒数第二列
awk '{print $(NF-1)}' file.txt

7. BEGIN 和 END 块

BEGIN 在读文件前执行一次,END 在文件读完后执行一次,常用于打印表头、统计结果等。

awk 'BEGIN {print "Name Age"} {print $1, $2} END {print "Done"}' file.txt

8. 数值计算

awk 可以直接在 {} 里做算术运算。

# 第二列加 10
awk '{print $1, $2 + 10}' file.txt

# 计算第一列和第二列的和
awk '{print $1 + $2}' file.txt

9. 内置函数

awk 提供了很多内置函数,可以直接用。

# length(): 返回字段长度
awk '{print length($1)}' file.txt

# tolower() / toupper(): 大小写转换
awk '{print tolower($1), toupper($2)}' file.txt

# substr(): 取子串
awk '{print substr($1, 1, 3)}' file.txt

10. 变量赋值

你可以直接给变量赋值并使用它们。

# 在 awk 脚本里给变量赋值
awk '{x=$2*2; print $1, x}' file.txt

# 从命令行传变量
awk -v num=10 '{print $1, $2+num}' file.txt

11. 多文件处理

awk 可以一次处理多个文件,FILENAME 变量能获取当前文件名。

awk '{print FILENAME, NR, $0}' file1.txt file2.txt

12. 修改输出分隔符

默认打印多个字段时用空格分隔,可以用 OFS 改成别的符号。

awk 'BEGIN {OFS=","} {print $1, $2}' file.txt