awk纯干货

AWK的惊人表现:html

Awk设计的目的:简化通常文本处理的工做。程序员

属于POSIX的一部分。正则表达式

 

AWK命令行:shell

Awk的调用能够定义变量、提供程序而且指定输入文件:express

 

  • Awk [ -F fs ]  [ -v var=value ... ] 'program' [ -- ] \
  • [ var=value ... ] [ file(s) ]
  • Awk [ -F fs ]  [ -v var=value ... ] -f program'file [ -- ] \
  • [ var=value ... ] [ file(s) ] 

 

短程序一般是直接在命令行上提供,而比较长的程序,则委托-f选项指定,遇到需链接被指名的程序文件以获得完整的程序时,则可重复使用此选项,这是包含共享awk代码的程序库存之方便用法。选项需置于文件名以及通常var=value赋值的前面。数组

-- 是特殊选项:指出awk自己已没有更进一步的命令行选项,任何接下来的选项均可被你的程序使用。函数

 

-f选项是用来从新定义默认字段分隔字符,且通常惯例将它做为第一个命令行选项,紧接在-F选项后的fs参数是一个正则表达式,或是被提供做为下一个参数。字段分隔字符也可设置使用内建变量FS所指定的:post

 

初始化的-v选项必须放在命令行上直接给定的任何程序以前,它们会在程序启动以前以及处理任何文件以前生效,在一命令行程序以后的-v选项会被解释为一个文件名可(能是不存在的)spa

 

在命令行上其它地方的初始化会在处理参数时完成,而且会带上文件名。例如:命令行

Awk '{ ... }' Pass=1 *.tex Pass=2 *.tex

处理文件的列表两次,第一次是Pass设为1,第二次将它设为2.

注:使用字符串值进行初始化无须用引号框起来,除非shell要求这样的引用,以保护牸字符或空白。支持正则。

注:特殊文件名-(连字号)表示标准输入。/dev/stdin为标准输入,/dev/stderr标准错误输出,/dev/stdout标准输出。

 

Awk程序模型:

 

Awk把输入流看做一连串记录的集合,每条记录均可进一步细分为字段,一般,一行一条记录,而字段则由一个或多个非空白字符的单词组成。然而,是什么构成一条记录和一个字段,彻底是由程序员控制,且它们的定义,甚至能够在处理期间更改。

一个awk程序是一对以模式(pattern)与大括号框起来的操做(action)组合而成的。

 

输入会自动地由一个输入文件切换到下一个,且awk自己一般会处理每一个输入文件的打开、读取和关闭,以容许用户程序专心致力于记录的处理。虽然模式多半是数据或字符串表达式,不过awk以保留字BEGINEND提供两种特殊模式。

 

程序元素:awk处理数字与字符串数据,提供了标量(scalar)与数组(array)两种变量以保存数据、数字与字符串表达式。还提供了一些语句类型以处理数据:赋值、注释、条件、函数、输入、循环及输出。

 

#号注释单行,单条语句多行可用反斜杠。

 

字符串的比较,用的是传统的关系运算符。返回1为真,0为假。Awk并没有特殊的字符串接续运算符。两个连续字符串,会自动地链接在一块儿。

 

支持正则表达式,有两个运算符:~(匹配)与!~(不匹配)

 

正则表达式常量能够用引号或斜杠加以定介:"ABC" ~ /^[A-Z]+$/ 等同于"ABC" ~ "^[A-Z]+$" ,若是在引号字符串里正好须要有字面意义的引号,则应以反斜杠("...\"...")保护。

 

Awk处理字符串转数据的函数,s = "123" 接着n = 0  + s ,便将数据123赋值给n了。(并不适用)

 

Awk的数值运算符[


Awk可用括号以控制计算顺序。

1、复合式,像/=这样,以左边运算数做为右这的第一个去处数。N /=3 即是n=n/3

2、赋值的结果用来做为另外一个表达式的部分表达式:(赋值运算符为右结合性)

 

Awk里通常经常使用到的内建标量变量


命令行参数

Awk对于命令行的自动化处理,awk经过内变量ARGC(参数计数)ARGV(参数向量,或参数值),让命令行参数可用。

 

awk程序化模式中,经过输入文件隐含循环的每一次迭代,会处理单一记录(record),一般是一行文本,记录可进一步再侵害为更小的字符串,叫作字段(field)

 

FS的默认值为单一空格,它接受特殊的解释方式 。一个或多个空白字符(空格与制表字符)以及行的开头与结尾的空白,都将被忽略。所以a b a        b相同。

----------------------------

[root@bogon 8csjb]# cat awkfs

a b c d

a        b        c        d        e        f

[root@bogon 8csjb]# awk -F" " '{print $1,$2,$3,$4,$5,$6}' awkfs

a b c d  

a b c d e f

--------------------------------------------------

匹配单个空格设置FS  = "[ ]"

 

字段能够特殊名称$1\$2...$NFawk程序使用。字段引用无须是固定的,有必须的话,它们还能够转换(经过截断)为整数值:假定k3,则值$k\$(1+2)$(27/9)、以及$3、都引用到第三个字段。特殊字段名称$0引用到当前的记录,初始值是从输入流中读取,且记录分隔字符不是记录的一部分。引用到0NF范围以上的字段编号是不会有错。

 

模式与操做构成awk程序的核心,awk的非传统数据驱动程序模式,使得它更吸引用户使用,也成就了许多awk程序的简洁形式。

 

模式由字符串与或数值表达式构建而成:一昊它们计算出当前输入记录的值为非零(真),则实行结合性的操做。若是模式是正则表达式,则意指此表达式会被来与整个输入记录进行匹配。

 

操做段落是可选地接在一个模式以后,也就是操做所在之处:它标明了如何处理该记录。

 

常见用法:一个print语句里包含了以逗号隔开的零或多个表达式,每一个表达式会被计算,有必要时会转换为一个字符串,且以输出字段分隔字符OFS的值将输出分隔后传送到标准输出,接在最后项目以后的是输出记录分隔字符ORS的值。

-------------------------------------------------------------------------------------------

[root@bogon ~]# echo '1 2 3 4 5 a' |awk '{ OFS ="abc"; print $1,$2,$3,$4,$5,$6}'

1abc2abc3abc4abc5abca

[root@bogon ~]# echo '1 2 3 4 5 a' |awk '{ OFS ="\n"; print $1,$2,$3,$4,$5,$6}'

1

2

3

4

5

a

[root@bogon ~]# echo '1 2 3 4 5 a' |awk '{ OFS =" "; print $1,$2,$3,$4,$5,$6}'

1 2 3 4 5 a

------------------------------------------------------------------------------------------------------

改变输出字段分隔字符而没有指定任何字段,不会改变$0;,若是咱们更改输出字段分隔字符,并指定至少一个字段(即强制以新的字段分隔字符从新组合记录)结果为

[root@bogon ~]# echo '1 2 3 4 5 a' |awk '{ OFS ="\n";  print $0}'

1 2 3 4 5 a

[root@bogon ~]# echo '1 2 3 4 5 a' |awk '{ OFS ="\n"; $1=$1; print $0}'

1

2

3

4

5

A

----------------------------------------------------------------------

 

若是程序为空,则awk不会读取任何输入并当即退出,因此咱们能够匹配cat

除开NUL字符问题,awk能够轻松取代cat

 

大量实例:

要将原始数值及它们的对数打印为单栏的数据文件,可以使用:

Awk '{ print $1, log($1) }' file(s)

打印文本文件5%行左右的随机样本。使用虚拟承受机产行函数。

Awk 'rand() <0.05' file(s)

在以空白分隔字段的表格中,报告第n栏的和:

Awk -v COLUMN=n '{ sum += $COLUMN} END { print sum }' file(s)

------------------------------------------------------------------------------------

[root@bogon 8csjb]# echo "2" |awk -v COLUMN=n '{ sum += $COLUMN} END { print sum }'

2         #字符视为0

[root@bogon 8csjb]# echo "2" |awk -v COLUMN=n '{ sum += $COLUMN} END { print sum/2 }'

1        #算术运算符

[root@bogon 8csjb]# awk '/print/' awk        #等同于grep 'print' awk

print "ARGC =", ARGC

print "ARGV[" k "] = [" ARGV[k] "]"

查找100-150

[root@bogon 8csjb]# awk '(1 <= FNR) && (FNR <=15) && /print/ {print FILENAME ":" FNR ":" $0 }' awk

awk:2:        print "ARGC =", ARGC

awk:4:        print "ARGV[" k "] = [" ARGV[k] "]"

sed以下:

[root@bogon 8csjb]# sed -n  1,15p -s awk |egrep 'print'

print "ARGC =", ARGC

print "ARGV[" k "] = [" ARGV[k] "]"

[root@bogon 8csjb]# awk 'BEGIN { FS = "print"; OFS = "&" } { $1=$1;print}' awk

BEGIN{

& "ARGC =", ARGC

for (k=0; k<ARGC; k++)

& "ARGV[" k "] = [" ARGV[k] "]"

}

删除已排序流里的重复行:

Sort file(s) |uniq

Sort file(s) | awk 'Last !=$0 { print } { Lst =$0 }'

将回车字符/换行字符的行终结,一致转换为以换行字符做为行终结。

Sed -e 's/\r$//' file(s)

Sed -e 's/^M$//' file(s)        #^M ctrl+M

Mawk ''BEGIN { RS = "\r\n" } {print }' file(s)  

 

要将单空格的文本行,转换为双空格的行。

-------------------------------------------------------------------------------------------------------

[root@bogon 8csjb]# sed -e 's/$/\n/' awk

BEGIN{

 

print "ARGC =", ARGC

 

for (k=0; k<ARGC; k++)

 

print "ARGV[" k "] = [" ARGV[k] "]"

 

}

[root@bogon 8csjb]# awk 'BEGIN { ORS = "\n\n"} {print}' awk         #记录分隔符ORS

[root@bogon 8csjb]# awk 'BEGIN { ORS = "\n\n"} 1'  awk

[root@bogon 8csjb]# awk '{ print $0 "\n"}'   awk

[root@bogon 8csjb]# awk '{ print; print "" }'   awk

将双空格行转换为单空格同样是很容易的:

[root@bogon 8csjb]# awk '{ print; print "" }'   awk|awk 'BEGIN {RS ="\n *\n" } {print}'

BEGIN{

print "ARGC =", ARGC

for (k=0; k<ARGC; k++)

print "ARGV[" k "] = [" ARGV[k] "]"

}

寻找超过限制长度72个字符的行

egrep -n '^.{73,}' file(s)

[root@bogon 8csjb]# awk 'length($0) >3 {print FILENAME ":" FNR ":" $0 }' awk

awk:1:BEGIN{

awk:2:        print "ARGC =", ARGC

awk:3:        for (k=0; k<ARGC; k++)

awk:4:        print "ARGV[" k "] = [" ARGV[k] "]"

 

查找html标题内容

Awk -v ORS=' ' -v RS='( \n)' '/<title *>/, /<\/tiltle *>/' file(s) | sed -e '$@</title *> *@&\n@g'

煮酒品茶:能够更新批量下载网页那东西了,取标题页。@/没区别。特别环境特别使用。

 

语句:程序语言必须支持连续性的、条件式的及重复的执行。

连续执行如:a=1;b=2;c=3

条件式执行:

If (expression)

Statement1

Else

Statemnt2

 

重复执行whiledo) (forfor)

 

注意:由于浮点算术一般不精确,因此避免在for语句表达式里,计算非整数的值。

 

其它的流程控制语句

只针对此记录略过更进一步的模式检查。

使用Next语句。

针对当前输入文件略过更进一步的模式检查。

Gawk与近期的nawk都提供nextfile语句,它会使得当前输入文件当即关闭且模式的匹配会从命令行上下一个文件里的记录从新开始。

 

用户控制的输入

Awk直接处理命令行上标明的输入文件,意指绝大多数的awk程序都没必要本身打开与处理文件。它也能够经过awkgetline语句来作这件事情。

 


awk支持重定向。


 

基础数值函数



相关文章
相关标签/搜索