awk
三个部分:
BEGIN{} #在脚本开始的时候执行一次,相当于初始化
{} #每一行都会执行一次的部分
END{} #脚本运行完之后会执行一次。相当于最后的总结。
如何写成文件?
#!/bin/awk -f BEGIN{ print "begin"; } { print "everyline"; } END{ print "end"; }
但是ubuntu上会报 ?/bin/awk 解释器已损坏。这是由于在/bin/awk这找不到awk程序,怎么办?
whereis awk ,找到awk的位置,然后改成正确的位置即可。
#!/usr/bin/awk -f BEGIN{ print "begin"; } { print "everyline"; } END{ print "end"; }
运行:
chmod +x mytest.awk ./mytest.awk data.txt
一些内建数据变量:
$0 $1 $2.... # $0表示读入的那一行$1...表示各个field
NF(Number of Fields)
NR(Number of Records)
FILENAME(正在处理的数据文件文件名)
awk有一个输入函数:getline
awk 有两个输出函数:print和printf,其中printf是用于格式化输出的,用法同c语言中的用法
awk 中使用管道:
"ls" | getline;
blablabla;
print $1 | "sort" >> "today.txt"
这样会多次调用getline,但只会调用一次 sort,即在所有输出完毕后通过pipe将数据传给sort。之前数据都缓存在了pipe里
但使用 system( "shell 命令" ) 时, awk无法直接将执行中的部分数据输出给Shell 命令. 且 Shell 命令执行的结果也无法直接输入到awk中.
system("date > date.txt")
awk 中的 > 与shell中的>不同, awk中的>会追加,只是第一次打开的文件时会进行覆盖原来的文件。
FS: Filed Separator。 例子: BEGIN { FS="[\t:]"}
for (variable in array){}
关闭文件或者管道:
close(your_file_name)
close("sort >> 1.txt") # 之前管道后面的字符串,一个字符都不能错,否则关闭的就是另外的文件
split( 原字符串, 数组名, 分隔字符(field separator) )
awk使用者所编写的函数可再重用, 并不需要每个awk式中都重新编写.将函数部分单独编写于一文件中, 当需要用到该函数时再以下列方式include进来.
$ awk -f 函数文件名 -f awk主程序文件名 数据文件文件名
awk 程式中常使用数组(Array)来记忆大量数据, delete 指令便是用来释放数组中的元素所占用的内存空间.
范 例 :
for( any in X_arr )
delete X_arr[any]
!!! delete 指令一次只能释放数组中的一个元素.
match(buffer, pattern),例如:
match('abcde',/c/)
print $1 # $0 是整个串
int(x) 会返回x的整数部分, int(1.2) 会返回1, int(-1.2)会返回-1.
sqrt(9)
exp(x) # e^x
log(exp(1))
rand() 返回0到1之间的随机数,使用前需要srand()
sin(x),cos(x),atan(x) #x为弧度制
OFS(Output File Separator)
ORS (Output Record Separator)
awk中的 ^ 为指数运算符
一些函数:
index(原串,要找的子串)
若原字串中含有欲找寻的子字串,则返回该子字串在原字串中第一次出现的位置,若未曾出现该子字串则返回0.
length( 字串 ) : 返回该字串的长度.
match( 原字串, 用以找寻比对的正则表达式 )。awk会在原字串中找寻合乎正则表达式的子字串. 若合乎条件的子字串有多个, 则以原字串中最左方的子字串为准
awk找到该字串后会依此字串为依据进行下列动作:
设定awk内建变量 RSTART, RLENGTH :
RSTART = 合条件的子字串在原字串中的位置.
= 0 ; 若未找到合条件的子字串
RLENGTH = 合条件的子字串长度
= -1 ; 若未找到合条件的子字串.
返回 RSTART 之值.
sub( 比对用的正则表达式, 将替换的新字串, 原字串 )
sub( )将原字串中第一个(最左边)合乎所指定的正则表达式的子字串改以新字串取代
第二个参数"将替换的新字串"中可用"&"来代表"合於条件的子字串"
gsub( 比对用的正则表达式, 将替换的新字串, 原字串 )
这个函数与 sub()一样,同样是进行字串取代的函数. 唯一不同点
gsub()会取代所有合条件的子字串
gsub()会返回被取代的子字串个数.
substr( 字串,起始位置 [,长度] )
返回从起始位置起,指定长度的子字串. 若未指定长度,则返回起始位置到字串末尾的子字串.