awk常用命令
awk命令
可以简单的理解为是grep命令的增强命令
新建文件 sample.txt
1 2 this is a test 2 3 Are you like awk 3 This's a test 4 10 There are orange,apple,mongo
awk默认每行按照空格或tab键分割
文件sample.txt分割如下
输出文件sample.txt的第三列和第四列
命令:awk ‘{print $3,$4}’ sample.txt
结合printf命令,格式化输出第三列和第四列和第五列
命令:awk ‘{printf “%-8s %-8s %-8s\n”, $3, $4, $5}’ sample.txt
设置分割符号
将分隔符设置为:,
命令:awk -v FS=”,” ‘{print $1, $3}’ sample.txt
ps: -v 为设置变量的意思,FS表示列分隔符
设置变量
命令:awk -v a=1 ‘{print $1, $1+a}’ sample.txt
过滤输出
输出满足条件的行
一般过滤
过滤第一列不等于2的行
命令:awk ‘$1!=2’ sample.txt
过滤第一列不等于2并且第三列等于this的行
命令:awk ‘$1!=2 && $3==”this”’ sample.txt
过滤第一列不等于2或者第三列等于Are的行
命令:awk ‘$1!=2 || $3==”Are”’ sample.txt
正则表达式过滤
过滤包含re字符的行
命令:awk ‘/re/’ sample.txt
反向搜索,过滤不包含re字符的行
命令:awk ‘!/re/’ sample.txt
过滤某一列包含th字符的行
命令:awk ‘$3 ~ /re/’ sample.txt
命令:awk ‘$4 ~ /re/’ sample.txt
命令:awk ‘$5 ~ /re/’ sample.txt
内置变量
内置变量:awk预定好的变量,可以直接使用
常见内置变量
变量 | 含义 |
---|---|
$n | 当前记录的第n个字段,字段间由FS分隔 |
$0 | 完整的输入记录 |
FILENAME | 当前文件名 |
FS | 输入字段分隔符, 默认为空白字符 |
OFS | 输出字段分隔符, 默认为空白字符 |
RS | 输入记录分隔符(输入换行符), 指定输入时的换行符 |
ORS | 输出记录分隔符(输出换行符),输出时用指定符号代替换行符 |
NF | 当前行的字段的个数(即当前行被分割成了几列) |
NR | 行号,当前处理的文本行的行号。 |
FNR | 各文件分别计数的行号 |
ARGC | 命令行参数的个数 |
ARGV | 数组,保存的是命令行所给定的各参数 |
输出文件名,当前行,当前行被分割成列数,当前行行数
命令:awk ‘{print FILENAME, $0, NF, NR}’ sample.txt
格式化输出文件名,当前行,当前行被分割成列数,当前行行数
命令:awk ‘{printf “%-10s %-40s %-10s %-10s\n”, FILENAME, $0, NF, NR}’ sample.txt
awk脚本
awk脚本语法规则类C,执行阶段分三个阶段
- BEGIN{ 代码 }
- { 代码 }
- END { 代码 }
执行流程
PS:之前使用的都是-2方式
简单的例子
命令:awk ‘BEGIN{print “this is begin”} {print “this is main”} END{print “this is end”}’ sample.txt
分析-可以简单的理解为执行了以下main方法
一般的例子
命令:awk ‘BEGIN{printf “%4s %4s %4s %4s %4s %4s %4s %4s %4s\n”,”FILENAME”,”ARGC”,”FNR”,”FS”,”NF”,”NR”,”OFS”,”ORS”,”RS”;printf “———————————————\n”} {printf “%4s %4s %4s %4s %4s %4s %4s %4s %4s\n”,FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS} END{printf “———————————————\n”}’ sample.txt
以文件的方式执行awk脚本
创建文件 score.txt,内容如下
Marry 2143 78 84 77
Jack 2321 66 78 45
Tom 2122 48 77 71
Mike 2537 87 97 95
Bob 2415 40 57 62
创建文件 calc.awk,内容如下
#!/bin/awk -f
BEGIN {
math = 0
english = 0
computer = 0
printf "NAME NO. MATH ENGLISH COMPUTER TOTAL\n"
printf "---------------------------------------------\n"
}
{
math+=$3
english+=$4
computer+=$5
printf "%-6s %-6s %4d %8d %8d %8d\n", $1, $2, $3,$4,$5, $3+$4+$5
}
END {
printf "---------------------------------------------\n"
printf " TOTAL:%10d %8d %8d \n", math, english, computer
printf "AVERAGE:%10.2f %8.2f %8.2f\n", math/NR, english/NR, computer/NR
}
执行awk脚本
命令:awk -f calc.awk score.txt
PS: -f 加载文件