awk 是一种强大的文本处理工具,它既是编程语言也是命令行工具,主要用于模式扫描和处理文本数据。awk 名称来自其三位创始人 Alfred Aho、Peter Weinberger 和 Brian Kernighan 的姓氏首字母。
awk [options] 'pattern {action}' file
pattern
:匹配模式action
:匹配后执行的动作file
:要处理的文件选项 | 说明 |
---|---|
-F fs | 指定字段分隔符 |
-v var=value | 定义变量 |
-f scriptfile | 从脚本文件读取awk命令 |
awk '{print}' file.txt # 打印整个文件
awk '{print $0}' file.txt # 同上,$0表示整行
awk '{print $1}' file.txt # 打印第一列
awk '{print $1,$3}' file.txt # 打印第一和第三列
awk -F':' '{print $1}' /etc/passwd # 使用冒号作为分隔符
变量 | 说明 |
---|---|
NR | 当前记录数(行号) |
NF | 当前记录的字段数 |
FS | 字段分隔符(默认空格) |
OFS | 输出字段分隔符(默认空格) |
RS | 记录分隔符(默认换行) |
ORS | 输出记录分隔符(默认换行) |
示例:
awk '{print NR,NF,$0}' file.txt # 打印行号,字段数和整行
awk '/pattern/ {print}' file.txt # 打印包含pattern的行
awk '$3 > 100 {print}' file.txt # 第三列大于100的行
awk '/start/,/end/' file.txt # 从匹配start到匹配end的行
awk '{if ($1 > 50) print $1; else print "小于等于50"}' file.txt
awk '{for(i=1;i<=NF;i++) print $i}' file.txt # 打印每个字段
awk '{count[$1]++} END {for(item in count) print item, count[item]}' file.txt
awk '{print length($0)}' file.txt # 计算行长度
awk '{print substr($1,2,3)}' file.txt # 提取子串
awk '{print toupper($1)}' file.txt # 转换为大写
awk '{print tolower($1)}' file.txt # 转换为小写
awk '{print sqrt($1)}' file.txt # 平方根
awk '{print int($1)}' file.txt # 取整
awk 'BEGIN {print systime()}' # 当前时间戳
awk 'BEGIN {print "开始处理"} {print} END {print "处理结束"}' file.txt
awk 'function myfunc(x) {return x*x} {print myfunc($1)}' file.txt
awk '{print FILENAME, NR, $0}' file1.txt file2.txt
awk '{print > "output.txt"}' file.txt
awk 'END {print NR}' file.txt
awk '{sum += $1} END {print sum}' file.txt
awk '{a[$0]++} END {for(i in a) if(a[i]>1) print i}' file.txt
awk '{printf "%-10s %5d\n", $1, $2}' file.txt
awk -F',' '{print $1,$3}' data.csv
awk是一个极其强大的工具,掌握它可以显著提高文本处理效率。建议通过实际练习来巩固这些知识。