简介。awk是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。
它在命令行中使用,但更多是作为脚本来使用。awk的处理文本和数据的方式是这样的,它逐行扫描文件,从第一行到最后一行,寻找匹配的特定模式的行,并在这些行上进行你想要的操作。如果没有指定处理动作,则把匹配的行显示到标准输出(屏幕),如果没有指定模式,则所有被操作所指定的行都被处理。
awk分别代表其作者姓氏的第一个字母。因为它的作者是三个人,分别是alfred aho、brian kernighan、peter weinberger。gawk是awk的gnu版本,它提供了bell实验室和gnu的一些扩展。
下面介绍的awk是以gun的gawk为例的,在linux系统中已把awk链接到gawk,所以下面全部以awk进行介绍。
命令格式和选项。
的语法有两种形式。
awk [options] 'script' var=value file(s)
awk [options] -f scriptfile var=value file(s)
2.2.命令选项。
f fs or --field-separator fs
指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-f:。
v var=value or --asign var=value
赋值一个用户定义变量。
f scripfile or --file scriptfile
从脚本文件中读取awk命令。
mf nnn and -mr nnn
对nnn值设置内在限制,-mf选项限制分配给nnn的最大块数目;-mr选项限制记录的最大数目。这两个功能是bell实验室版awk的扩展功能,在标准awk中不适用。
w compact or --compat, -w traditional or --traditional
在兼容模式下运行awk。所以gawk的行为和标准的awk完全一样,所有的awk扩展都被忽略。
w copyleft or --copyleft, -w copyright or --copyright
打印简短的版权信息。
w help or --help, -w usage or --usage
打印全部awk选项和每个选项的简短说明。
w lint or --lint
打印不能向传统unix平台移植的结构的警告。
w lint-old or --lint-old
打印关于不能向传统unix平台移植的结构的警告。
w posix
打开兼容模式。但有以下限制,不识别:\x、函数关键字、func、换码序列以及当fs是一个空格时,将新行作为一个域分隔符;操作符**和**=不能代替^和^=;fflush无效。
w re-interval or --re-inerval
允许间隔正则表达式的使用,参考(grep中的posix字符类),如括号表达式[[:alpha:]]
w source program-text or --source program-text
使用program-text作为源**,可与-f命令混用。
w version or --version
打印bug报告信息的版本。
3.模式和操作。
awk脚本是由模式和操作组成的:
pattern 如$ awk '/root/' test,或$ awk '$3 < 100' test。
两者是可选的,如果没有模式,则action应用到全部记录,如果没有action,则输出匹配全部记录。默认情况下,每一个输入行都是一条记录,但用户可通过rs变量指定不同的分隔符进行分隔。
3.1.模式。
模式可以是以下任意一个:
/正则表达式/:使用通配符的扩展集。
关系表达式:可以用下面运算符表中的关系运算符进行操作,可以是字符串或数字的比较,如$2>%1选择第二个字段比第一个字段长的行。
模式匹配表达式:用运算符~(匹配)和~!(不匹配)。
模式,模式:指定一个行的范围。该语法不能包括begin和end模式。
begin:让用户指定在第一条输入记录被处理之前所发生的动作,通常可在这里设置全局变量。
end:让用户在最后一条输入记录被读取之后发生的动作。
3.2.操作。
操作由一人或多个命令、函数、表达式组成,之间由换行符或分号隔开,并位于大括号内。主要有四部份:
变量或数组赋值。
输出命令。内置函数。
控制流命令。
的环境变量。
的环境变量。
运算符。table2.运算符。
6.记录和域。
6.1.记录。
awk把每一个以换行符结束的行称为一个记录。
记录分隔符:默认的输入和输出的分隔符都是回车,保存在内建变量ors和rs中。
0变量:它指的是整条记录。如$ awk ''test将输出test文件中的所有记录。
变量nr:一个计数器,每处理完一条记录,nr的值就增加1。如$ awk ''test将输出test文件中所有记录,并在记录前显示记录号。
6.2.域。
记录中每个单词称做“域”,默认情况下以空格或tab分隔。awk可跟踪域的个数,并在内建变量nf中保存该值。如$ awk ''test将打印test文件中第一和第三个以空格分开的列(域)。
6.3.域分隔符。
内建变量fs保存输入域分隔符的值,默认是空格或tab。我们可以通过-f命令行选项修改fs的值。如$ awk -f: 'test将打印以冒号为分隔符的第一,第五列的内容。
可以同时使用多个域分隔符,这时应该把分隔符写成放到方括号中,如$awk -f'[:t]' test,表示以空格、冒号和tab作为分隔符。
输出域的分隔符默认是一个空格,保存在ofs中。如$ awk -f: 'test,$1和$5间的逗号就是ofs的值。
专用正则表达式元字符。
一般通用的元字符集就不讲了,可参考我的sed和grep学习笔记。以下几个是gawk专用的,不适合unix版本的awk。
y 匹配一个单词开头或者末尾的空字符串。
b 匹配单词内的空字符串。
匹配一个单词的开头的空字符串,锚定开始。
匹配一个单词的末尾的空字符串,锚定末尾。
w 匹配一个字母数字组成的单词。
w 匹配一个非字母数字组成的单词。
匹配字符串开头的一个空字符串。
匹配字符串末尾的一个空字符串。
字符集。可参考grep正则匹配。doc
9.匹配操作符(~)
用来在记录或者域内匹配正则表达式。如$ awk '$1 ~/root/' test将显示test文件第一列中以root开头的行。
10.比较表达式。
conditional expression1 ? expression2: expression3,例如:
$ awk ' 1: $3: print max}' test。
如果第一个域大于第三个域,$1就赋值给max,否则$3就赋值给max。
awk '$1 + 2 < 100' test。如果第一和第二个域相加大于100,则打印这些行。
awk '$1 > 5 &&2 < 10' test,如果第一个域大于5,并且第二个域小于10,则打印这些行。
11.范围模板。
范围模板匹配从第一个模板的第一次出现到第二个模板的第一次出现之间所有行。如果有一个模板没出现,则匹配到开头或末尾。如$ awk '/root/,/mysql/' test将显示root第一次出现到mysql第一次出现之间的所有行。
12.一个验证passwd文件有效性的例子。
cat /etc/passwd | awk -f: '
nf !=7\
参考 参考实训大纲
四 说明。一 大纲的应用。1 本大纲适应于市场营销专业。2 本大纲分为必学专业知识模块和技能模块 选学专业知识模块与技能模块两大部分。选学部分由学校和任课教师根据实际专业需要和学生要求,在规定的学时选学时间内,在规定的选学内容中,选择其中一项为教学内容。3 对知识学习内容和技能练习内容提出的层次。1...
楚雄气候条件 参考 参考
楚雄师范学院学报2 0 0 6 年第6 期。云南楚雄气候与旅游 何萍。楚雄师范学院,云南楚雄675000 摘要 文章介绍了楚雄的地理位置和特点,根据多年来的气象资料分析了楚雄州的气候特征。与旅游的关系,并对楚雄州的主要风景点进行了简单介绍,对如何充分利用当地的气候资源发展旅。游业具有一定的参考价值。...
SP2参考参考
d 原因四 季节性需求突变件,对策 冬夏季前提前统计上年度同季用量变化大的零件提前上调基准,季节过去后根据用量变化及时下调基准。17.特约店滞销库存一般是指 一年以上没有出库记录的 非新车型的零件。18.滞销产生的原因 至少3个 a 原因一 订错货,b 原因二 重复订货,c 原因三 前台维修退件,d...