1:
awk在shell中可以说不仅仅是一个工具,而是一门语言,下面简单介绍一下的语法和用法:
awk 的模式: awk 'BEGIN{actions} pattens{actions}...END{actions}' data_file :
awk 每次从 data_file文件中取出一条记录(record)(默认是一行,如果设置了RS内置变量就可以修改),如果此record符合
pattens表达式的描述,就执行actions的动作,执行完所有的pattens{actions}后又重新取出record开始一样的匹配操作:
例如 awk ' $0 != "" {printf("$0")}' config.txt.
要注意的事项: 第一个“'”和awk字样有一个空格,后一个“'”和数据文件有一个空格,这样做是为了提示在shell中awk 程序的开始和结束.
BEGIN{actions}和END{actions}是两个特殊的pattens{actions}模型,他们分别是在awk程序开始处理record之前执行和awk处理完所有的record后运行一次。
BEGIN{actions}主要处理一些设置的工作如设置内置变量读取传进来的例如:
awk 'BEGIN
{
FS = "|"
RS = "\n"
global_file = "\home\hostname\target_file"
total = 0
}
{
print $0
total++
}
END
{
close(source_file)
print total
}
' source_file
可以看到在awk 中的变量可以再等号两端有空格(shell要求不能有)有点类似于c语言如果将语句写在一行只需要在语句间用";"连起来
2:
关于pattens:
awk支持一下的表达式
3:
关于actions
4:
awk内置的字符处理函数
4.1:index(原字串,要寻找的字串):
若原字串中含有 要寻找的字串,返回该子串在原子串中第一次出现的位置,若未曾出现该子串返回0,位置以1开始。
4.2:length(字串)
返回字串的长度:如“hualu”返回5
4.3:match(原字串,用以寻找对比的正则表达式)
在原字串中寻找合乎 正则表达式的 子字串,若符合要求的 子字串 有多个 以最左端为准。找到子字串后会进行如下动作:
设定awk中的内置变量 RSTART, RLENGTH.
RSTART = 子字串子在原字串中出现的位置,为0表示未找到
RLENGTH = 子字串的长度,为-1表示未找到
例如:
awk ' BEGIN
{
match("banana",/(an)+/)
print RSTART, RLENGTH
}
结果:2 4
4.4:split(原字串,数组,分隔符号)
用指定的 分隔符号将原字串 分割并依此存储到数组中
4.5: printf()
和c中的一样
4.6: sub(用以对比的正则表达式,将替换的新字串,原字串)
将原字串中符合要求正则表达式描述的第一个子字串(最左端的)替换成 新字串,新字串可用"&"表示合乎条件的子字串,如果原字串没有给出默认为¥0
4.7: gsub()
用法和sub一样只是将原字串中满足条件的所有字串都替换掉
4.8:substr(字串,起始位置,长度)
返回从起始位置开始,指定长度的 子字串,若未指定长度返回 从起始位置开始到字串结束的子字串
5.
数学函数:
5.1:int(x)
返回x的整数部分(去掉小数)这个的用法,实际工作中有这么个情况,将文件中的有序列的数据按1000条分割成多个文件文件末尾表明里面的数据的情况,数据记录 如 order|name|selary
awk '
{
number = 1000 * (int($1/1000)+1)
file = "target_"number
printf("%s\n", $0) >file
}' source.file
5.2:rand()
返回介于0-1之间的随机数值
5.3:srand(x)
指定x为rand()函数起始种子
6.
awk的内建变量
argc, argv,FILENAME,
FS(field separator): 栏分割符
RS(record separator):记录分隔符
NR(number record):awk程序运行到目前为止读取的 记录数
FNR:和NR相似,当读取一个新文件时,FNR置为0
NF(number field):目前的数据行所切分的栏数
OFS:输出时 栏分割符,默认是“ ”,在print中如果 print "nihao","lvjian" 则两个之间加上OFS
ORS:输出时的 记录分隔符
7.
正则表达式
^ :行首匹配,该字符串必须出现于行手
$ :行末匹配,该字符串必须出现于行尾
[...]:和shell中的相同
[^...]:和shell中的相同
*:前面的字符可出现0次或多次
+:awk特有,前面的字符可出现一次或多次
?:前面的字符可出现1次或不出现
~:匹配,字串~/正则表达式/ :表示字串中如何有字串符合正则表达式的描述就匹配,注意这里不是要求字串符合正则表达式的描述。只要其字串匹配就算成立
!~:不匹配
8.
actions主要由一下指令组成:
8.1:表达式
8.2:printf,print 表达式列表
8.3:if 语句
if()
{}
else
{}
8.4:while两种形式
while()
{
语句
}
do
{
语句
}while
8.5:for语句,有两种形式
for (a in array)
{
语句
}
for (表达式;判断;循环动作)
{
语句
}
8.6: break 和c相同,跳出循环
8.7: continue 和c相同
8.8:next
执行next指令时,awk略过其后的所有指令包含以后所有的pattens{actions}接着读取下一条记录开始第一个模型的匹配
8.9exit
退出awk程序