概念
grep和sed工具只能以行为默认单位,相对于他俩而言,awk不仅仅可以以行为单位,也可以以列为单位。
awk默认的行分隔符是\n,默认的列分隔符是连续的空格和Tab。
awk命令行的基本形式为:
①awk option ‘script’ file1 file2 …
②awk option -f scriptfile file1 file2 …
和sed的用法基本一样。awk可以在命令行调用,如①;也可编写一个脚本文件,用-f 调用如②。
编辑命令的格式如下
/pattern/{actions}
pattern是正则表达式,action是一系列操作。
$1,$2..分别表示第一列,第二列等。类似于shell中的位置参数,$0表示整个行
awk和C语言有非常相似的语言,有printf函数,也可使用变量,无需定义。所以说awk是一门弱类型,解释型语言。
如统计文件的空行
统计文件的行数
awk中的condition可以是两个特殊的BEGIN和END。处理文件前,BEGIN后的action执行一次,处理文件结束后,END后的action执行一次。
awk的调用方式
①命令方式
awk [-F 域分隔符] ‘commands’ file
[]是可选的,默认域分隔符是连续的空格或Tab
一行内容称为一个记录,每行中以域分隔符分开的一列称为一个域。
②shell脚本方式
编写脚本文件,求1~100的和
ps:注意编写awk脚本文件时,第一行为 #!/usr/bin/awk,此时在命令行调用awk脚本文件时就如上面图中的做法,还有另一种就是在第一行时直接加上-f。即 #!/usr/bin/awk -f ,此时在命令行调用awk脚本时,如下
awk与正则表达式
awk支持正则表达式的
①awk ‘REG/{action}’ file
②awk正则运算语句(~、~!(! ~))
③awk内置使用正则表达式函数
gsub( Ere, Repl, [ In ] ) 在整个ln中,用Repl代替Ere
sub( Ere, Repl, [ In ] ) 在整个ln中,用最长的Repl代替Ere
match( String, Ere ) 检测string是否包含Ere
split( String, A, [Ere] ) 使用Ere为域分隔符,将string分成序列A
以上的函数不太常用,就举个match的例子
awk内置变量
ARGC 命令行参数个数
ENVIRON 支持队列中系统环境变量的使⽤用 FILENAME awk浏览的⽂文件名
FNR 浏览⽂文件的记录数
FS 设置输⼊入域分隔符,等价于命令行-F选项
NF 浏览记录的域的个数
NR 已读的记录数
OFS 输出域分隔符
ORS 输出记录分隔符
RS 控制记录分隔符
awk中的print和printf
其中print函数的参数可以是变量、数值或者字符串。字符串必须⽤用双引号引⽤用,参数⽤用逗号分隔。如果没有逗号,参数就串联在一起而无法区分。这里,逗号的作⽤用与输出⽂文件的分隔符的作用是一样的,只是后者是空格而已。
printf函数,其用法和c语⾔言中printf基本相似,可以格式化字符串,输出复杂时,printf更 加好用,代码更易懂。