文件查看编辑命令 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