注意,awk后面只能用单引号, awk能执行的指令只有print,这是awk程序内部定义的!,必须要用单引号将字符串原封不动传进去
awk中所有字符串需要双引号,否则当作变量, 变量和字符串可以直接连接
awk [选项参数] 'script' var=value file(s)brawk [选项参数] -f scriptfile var=value file(s)
注意,选项参数里面也有, -v var=value用于自定义变量,但是放置位置有要求,brawk 'script' var1=v1 var2=v2 ... # 后面的变量定义,使用空格隔开brawk -v var1=v2 -v var2=v2 'script' var3=v3 ... # 前面的变量定义,用多个-v来定义
1. 引用参数 $:
$1, $2, ... 分别是第一个参数,第二个参数....., $0表示整行
2.文本分割 -F
# 使用","分割br $ awk -F, '{print $1,$2}' log.txt # -F与,的空格无关紧要br # 使用多个分隔符.先使用空格分割,然后对分割结果再使用","分割br $ awk -F '[ ,]' '{print $1,$2,$5}' log.txt
例子(如果要使用完整正则,应该用'单引号而非双引号,否则经常报错)
# 简单的过滤条件br# 过滤得到第一列为2的行并输出brawk '$1==2 {print $1}' log.txt
# 正则br# ~表示正则开始, / /中间是模式brawk '$1 ~/app/' tst.txt # 输出第一个参数中包含app的行brbr# 模式取反brawk '$1 !~/app/' test.txtbrawk '$1 !/app/' test.txt
cat /proc/net/snmp | grep -E "Udp: [[:digit:]]+" | awk -F ' ' '{print $6 > "1.txt"; print $7 > "2.txt"}' br# 虽然只支持print, 但是还支持linux最基本的一些操作,如重定向
# print的使用, 每个逗号输出一个空格brprint var1, var2, ... br# 变量也可以是字符串,支持字符串的连接:brprint var1","var2, var2 # 打印逗号的方式
内建变量
变量 | 描述 |
$n | 当前记录的第n个字段,字段间由FS分隔 |
$0 | 完整的输入记录 |
ARGC | 命令行参数的数目 |
ARGIND | 命令行中当前文件的位置(从0开始算) |
ARGV | 包含命令行参数的数组 |
CONVFMT | 数字转换格式(默认值为%.6g)ENVIRON环境变量关联数组 |
ERRNO | 最后一个系统错误的描述 |
FIELDWIDTHS | 字段宽度列表(用空格键分隔) |
FILENAME | 当前文件名 |
FNR | 各文件分别计数的行号 |
FS | 字段分隔符(默认是任何空格) |
IGNORECASE | 如果为真,则进行忽略大小写的匹配 |
NF | 一条记录的字段的数目 |
NR | 已经读出的记录数,就是行号,从1开始 |
OFMT | 数字的输出格式(默认值是%.6g) |
OFS | 输出记录分隔符(输出换行符),输出时用指定的符号代替换行符 |
ORS | 输出记录分隔符(默认值是一个换行符) |
RLENGTH | 由match函数所匹配的字符串的长度 |
RS | 记录分隔符(默认是一个换行符) |
RSTART | 由match函数所匹配的字符串的第一个位置 |
SUBSEP | 数组下标分隔符(默认值是/034) |
脚本:
1. 文件方式: 可以使用比较复杂的指令
#!/bin/awk -fbr#运行前brBEGIN {br math = 0br english = 0br computer = 0br br printf "NAME NO. MATH ENGLISH COMPUTER TOTAL\n"br printf "---------------------------------------------\n"br}br#运行中br{br math+=$3br english+=$4br computer+=$5br printf "%-6s %-6s %4d %8d %8d %8d\n", $1, $2, $3,$4,$5, $3+$4+$5br}br#运行后brEND {br printf "---------------------------------------------\n"br printf " TOTAL:%10d %8d %8d \n", math, english, computerbr printf "AVERAGE:%10.2f %8.2f %8.2f\n", math/NR, english/NR, computer/NRbr}
2. 交互方式
# 计算文件大小brls -l *.txt | awk '{sum+=$5} END {print sum}'br# 99乘法表brseq 9 | sed 'H;g' | awk -v RS='' '{for(i=1;i<=NF;i++)printf("%dx%d=%d%s", i, NR, i*NR, i==NR?"\n":"\t")}'
3. awk 条件语句和循环语句:
if (condition)br action-1brelsebr action-2brbrif (condition)br{br actionbr}
for (init, condition, incre\decre)br actionbr brwhile (condition)br action
breakbrcontinuebrexit: 退出程序