awk其名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母。
实际上 AWK 的确拥有自己的语言: AWK 程序设计语言 , 三位创建者已将它正式定义为“样式扫描和处理语言”。
它允许您创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,还有无数其他的功能。
awk: 更适合格式化文本,对文本进行较复杂格式处理
使用方法

1 2 3 4 5 6
|
awk [ -F<FS字段分隔符> 输入文件折分隔符,fs是一个字符串或者是一个正则表达式 -v<变量=值> 定义变量 -f<脚本> 读取awk命令脚本 ] 'BEGIN{} NR==2{命令;命令;} END{}' 文件
|
awk 允许您定义一个 BEGIN 块, 在awk开始处理的时候执行, 一般用来处理FS和一些初始化操作
awk 还提供了另一个特殊块,叫作 END 块。 awk 在处理了输入文件中的所有行之后执行这个块。通常, END 块用于执行最终计算或打印应该出现在输出流结尾的摘要信息。
中部为行块可以多个
; 花括号前可通过布尔运算
查看是否需要执行方法块
awk变量
变量名 |
含义 |
$0 |
当前记录 |
$n |
当前记录第n个字段 |
FILENAME |
当前文件名 |
FS |
输入域分隔符,默认为一个空格(-F定义) |
RS |
输入记录分隔符, 默认换行符/n |
NF |
当前记录里域个数 |
NR |
当前记录数 |
OFS |
输出域分隔符 |
ORS |
输出记录分隔符 |
ARGC |
命令行变元个数 |
ARGV |
令行变元数组 |
FNR |
当前文件中的记录号 |
awk if/循环/数组
if
1 2 3 4 5 6 7 8 9 10 11
|
if ($1=="foo"){ if($2=="foo"){ print "uno" }else{ print "one" } }elseif($1=="bar"){ print "two" }else{ print "three" }
|
while
1 2 3
|
count=1 do { print "I get printed at least once no matter what" } while ( count !=1 )
|
for
1 2 3 4 5 6 7 8 9 10 11 12 13
|
for ( x=1;x<=4;x++ ) { if ( x==2 ) { continue } print "iteration", x if ( x==3 ) { break } }
for (x in a) { print a[x] }
|
数组
内置函数
函数 |
说明 |
gsub(/正则/, 替换值, 源字符串) |
正则表达式替换(全部g模式) |
index(源字符串, “查找字符串”) |
查找 |
match(源字符串, /正则/) |
匹配查找 |
substr(源字符串, 开始位置, 截取长度) |
截取 |
split(源字符串, 分割存放数组, “分割字符串”) |
分割 |
例子🌰
常用显示
1
|
$ awk '{print $1}' file.txt // 打印第一字段
|
自定义分隔符
1
|
$ awk -F; '{print $1}' file.txt // 定义;分隔符。 使用;分割字段
|
统计/etc/passwd的账户人数
1
|
$ awk '{count++;print $0;} END{print "user count is ",count}' passwd
|
计算文件占用字节数
1
|
$ ll |awk 'BEGIN {size=0;} {size=size+$5;} END{print "[end]size is ",size}'
|
正则匹配
1 2 3 4 5 6 7 8 9
|
# 变量 ~ /正则/ # 变量 !~ /正则/ awk 'BEGIN{a="100testaa";if(a~/100/) {print "ok"}}'
# 匹配所有包含root的行 awk '/root/{print $0}' passwd
# 以分号作为分隔符,匹配第5个字段是root的行 awk -F: '$5~/root/{print $0}' passwd
|
数组
1
|
cat /etc/passwd | awk 'NR <= 8 && $2 {a[NR] = $2"-"; print a[NR]} END {print "-----"; for (x in a) print a[x] }'
|
执行Shell
1 2 3 4
|
awk 'BEGIN{print "hostname"|"sh"}' // 将hostname字符串打印到sh执行 awk 'BEGIN{system("df -h")}' // 通过system函数执行 ls | awk '/.*\.log$/{print "mv "$0,"A_"$0}' | sh // 重命名 awk -v var=${LANG} '{print var}' // 使用变量
|
替换文件
1
|
awk 'gsub(/ /, "", $2); print $0;' // gsub() 返回修改数。下个语句才可以使用修改值
|
OFS重构
1 2 3 4
|
# 修改值域的值,下次引用$0时,对$0进行按引用时的OFS进行重构;否则OFS对$0不生效 # 如果是$0=$0 则表示不重构$0; 对重构进行覆盖 echo "aaa bbb"|awk '{OFS="#";$1=$1;print $0;}' # aaa
|