Linux文本处理工具之awk

调用方式 1.命令行 awk [-F field-separator] ‘commands’ input-file(s) commands是真正awk命令,[-F域分隔符]是可选的。input-file(s) 是待处理的文件。在awk中,文件的每一行中,由域分隔符分开的每一项称为一个域。通常,在不指名-F域分隔符的情况下,默认的域分隔符是空格(或者tab)。 2.shell脚本方式 将所有的awk命令插入一个文件,并使awk程序可执行,然后awk命令解释器作为脚本的首行,以便通过键入脚本名称来调用。相当于shell脚本首行的:#!/bin/sh 可以换成:#!/bin/awk -f 3.将所有的awk命令插入一个单独文件,然后调用:awk -f awk-script-file input-file(s)其中,-f选项加载awk-script-file中的awk脚本,input-file(s)跟上面的是一样的。 内置变量 ARGC:命令行参数个数 ARGV:命令行参数排列 ENVIRON:UNIX环境变量 ERRNO:UNIX系统错误消息 FILENAME:awk浏览的文件名 OFMT:数字的输出格式 %.6g FNR:浏览文件的记录数 FS:设置输入域分隔符,等价于命令行 -F选项 NF:浏览记录的域的个数 NR:已读的记录数,就是行号,从1开始 FNR:当前记录数 OFS:输出域分隔符 ORS:输出记录分隔符 RS:控制记录分隔符 $0:当前记录(作为单个变量) $1~$n:当前记录的第n个字段,字段间由FS分隔 输出函数 print:参数可以是变量、数值或者字符串。字符串必须用双引号引用,参数用逗号分隔。如果没有逗号,参数就串联在一起而无法区分。这里,逗号的作用与输出文件的分隔符的作用是一样的,只是后者是空格而已 printf:其用法和c语言中printf基本相似,可以格式化字符串,输出复杂时,printf更加好用,代码更易懂。具体格式如下: %d 十进制有符号整数 %u 十进制无符号整数 %f 浮点数 %s 字符串 %c 单个字符 %p 指针的值 %e 指数形式的浮点数 %x %X 无符号以十六进制表示的整数 %o 无符号以八进制表示的整数 %g 自动选择合适的表示法 获取外部变量 1.获取普通外部变量 awk ‘{action}’ 变量名=变量值 2.BEGIN程序块中变量 awk –v 变量名=变量值 [–v 变量2=值2 …] ‘BEGIN{action}’ 3.环境变量 需要用到内置变量ENVIRON实现 运算符 1.赋值运算符 = += -= *= /= %= ^= **= 2.逻辑运算符 ||:逻辑或 &&:逻辑与 3.正则运算符 ~:匹配正则表达式 ~!:不匹配正则表达式 4.关系运算符 < <= > >= != == 5.算术运算符 + – * / & ++ — 6.其它运算符 $:字段引用 空格:字符串连接符 ?:C条件表达式 in:数组中是否存在某键值 字符操作 1.字符串转数字 将变量通过”+”连接运算。自动强制将字符串转为整型。非数字变成0,发现第一个非数字字符,后面自动忽略 2.数字转字符串 只需要将变量与””符号连接起来运算即可 3.字符串连接 只需要将变量与””符号连接起来运算即可 数组操作 在awk中数组叫做关联数组,因为下标既可以是数也可以是串。awk中的数组不必提前声明,也不必声明大小。数组元素用0或空串来初始化,这根据上下文而定。需要注意的是不同版本下面函数不一定相同。其相关的函数有length、asort、delete、split。当然也可以实现多维数组。 流程控制语句 1.条件判断语句(if) if(表达式){语句1}else{语句2} if(表达式){语句1}else if(表达式){语句2}else{语句3} 2.循环语句(while、for、do while) while(表达式){语句} for(变量 in 数组){语句} for(变量;条件;表达式){语句} do{语句}while(条件) 3.关键字 break:当break语句用于while或for语句时,,导致退出程序循环。 continue:当continue语句用于while或for语句时,使程序循环移动到下一个迭代。 next:能能够导致读入下一个输入行,并返回到脚本的顶部。这可以避免对当前输入行执行其他的操作过程。 exit:语句使主输入循环退出并将控制转移到END,如果END存在的话。如果没有定义END规则,或在END中应用exit语句,则终止脚本的执行。 正则表达式 +:包含一个或多个字符或扩展正则表达式的具体值(在 +(加号)前)在这个字符串中,则字符串匹配。命令行:awk ‘/smith+ern/’ testfile ?:包含零个或一个字符或扩展正则表达式的具体值(在 ?(问号)之前)在字符串中,则字符串匹配。命令行:awk ‘/smith?/’ testfile |:以 |(垂直线)隔开的字符串的任何一个在字符串中,则字符串匹配。命令行:awk ‘/allen | alan /’ testfile ():在正则表达式中将字符串组合在一起。命令行:awk ‘/a(ll)?/’ testfile {m}:有m个模式的具体值位于字符串中,则字符串匹配。命令行:awk ‘/l{2}/’ testfile {m,}:至少m个模式的具体值在字符串中,则字符串匹配。命令行:awk ‘/t{2,}/’ testfile {m, n}:在m和n之间(包含的m和n)个模式的具体值在字符串中(其中m <= n),则字符串匹配。命令行:awk ‘/er{1, 2}/’ testfile [String]:正则表达式与方括号内String变量指定的任何字符匹配。命令行:awk ‘/sm[a-h]/’ testfile [^ String]:在 [ ](方括号)和在指定字符串开头的 ^ (插入记号) 指明正则表达式与方括号内的任何字符不匹配。这样,命令行:awk ‘/sm[^a-h]/’ testfile ~,!~:表示指定变量与正则表达式匹配或不匹配的条件语句。命令行:awk ‘$1 ~ /n/’ testfile ^:指定字段或记录的开头。命令行:awk ‘$2 ~ /^h/’ testfile $:指定字段或记录的末尾。命令行:awk ‘$2 ~ /y$/’ testfile .:表示除了在空白末尾的终端换行字符以外的任何一个字符。命令行:awk ‘/a..e/’ testfile \ :转义字符。当位于在扩展正则表达式中具有特殊含义的任何字符之前时,转义字符除去该字符的任何特殊含义。例如,命令行:/a\/\// 内置函数 1.算术函数 atan2( y, x ) 返回 y/x 的反正切。 cos( x ) 返回 x 的余弦;x 是弧度。 sin( x ) 返回 x 的正弦;x 是弧度。 exp( x ) 返回 x 幂函数。 log( x ) 返回 x 的自然对数。 sqrt( x ) 返回 x 平方根。 int( x ) 返回 x 的截断至整数的值。 rand( ) 返回任意数字 n,其中 0 <= n < 1。 srand( [Expr] ) 将 rand 函数的种子值设置为 Expr 参数的值,或如果省略 Expr 参数则使用某天的时间。返回先前的种子值。 2.字符串函数 gsub( Ere, Repl, [ In ] ) 除了正则表达式所有具体值被替代这点,它和 sub 函数完全一样地执行,。 sub( Ere, Repl, [ In ] ) 用 Repl 参数指定的字符串替换 In 参数指定的字符串中的由 Ere 参数指定的扩展正则表达式的第一个具体值。sub 函数返回替换的数量。出现在 Repl 参数指定的字符串中的 &(和符号)由 In 参数指定的与 Ere 参数的指定的扩展正则表达式匹配的字符串替换。如果未指定 In 参数,缺省值是整个记录($0 记录变量)。 index( String1, String2 ) 在由 String1 参数指定的字符串(其中有出现 String2 指定的参数)中,返回位置,从 1 开始编号。如果 String2 参数不在 String1 参数中出现,则返回 0(零)。 length [(String)] 返回 String 参数指定的字符串的长度(字符形式)。如果未给出 String 参数,则返回整个记录的长度($0 记录变量)。 blength [(String)] 返回 String 参数指定的字符串的长度(以字节为单位)。如果未给出 String 参数,则返回整个记录的长度($0 记录变量)。 substr( String, M, [ N ] ) 返回具有 N 参数指定的字符数量子串。子串从 String 参数指定的字符串取得,其字符以 M 参数指定的位置开始。M 参数指定为将 String 参数中的第一个字符作为编号 1。如果未指定 N 参数,则子串的长度将是 M 参数指定的位置到 String 参数的末尾 的长度。 match( String, Ere ) 在 String 参数指定的字符串(Ere 参数指定的扩展正则表达式出现在其中)中返回位置(字符形式),从 1 开始编号,或如果 Ere 参数不出现,则返回 0(零)。RSTART 特殊变量设置为返回值。RLENGTH 特殊变量设置为匹配的字符串的长度,或如果未找到任何匹配,则设置为 -1(负一)。 split( String, A, [Ere] ) 将 String 参数指定的参数分割为数组元素 A[1], A[2], . . ., A[n],并返回 n 变量的值。此分隔可以通过 Ere 参数指定的扩展正则表达式进行,或用当前字段分隔符(FS 特殊变量)来进行(如果没有给出 Ere 参数)。除非上下文指明特定的元素还应具有一个数字值,否则 A 数组中的元素用字符串值来创建。 tolower( String ) 返回 String 参数指定的字符串,字符串中每个大写字符将更改为小写。大写和小写的映射由当前语言环境的 LC_CTYPE 范畴定义。 toupper( String ) 返回 String 参数指定的字符串,字符串中每个小写字符将更改为大写。大写和小写的映射由当前语言环境的 LC_CTYPE 范畴定义。 sprintf(Format, Expr, Expr, . . . ) 根据 Format 参数指定的 printf 子例程格式字符串来格式化 Expr 参数指定的表达式并返回最后生成的字符串。 3.时间函数 mktime( YYYY MM DD HH MM SS[ DST]) 生成时间格式 strftime([format [, timestamp]]) 格式化时间输出,将时间戳转为时间字符串,具体格式如下: %a 星期几的缩写(Sun) %A 星期几的完整写法(Sunday) %b 月名的缩写(Oct) %B 月名的完整写法(October) %c 本地日期和时间 %d 十进制日期 %D 日期 08/20/99 %e 日期,如果只有一位会补上一个空格 %H 用十进制表示24小时格式的小时 %I 用十进制表示12小时格式的小时 %j 从1月1日起一年中的第几天 %m 十进制表示的月份 %M 十进制表示的分钟 %p 12小时表示法(AM/PM) %S 十进制表示的秒 %U 十进制表示的一年中的第几个星期(星期天作为一个星期的开始) %w 十进制表示的星期几(星期天是0) %W 十进制表示的一年中的第几个星期(星期一作为一个星期的开始) %x 重新设置本地日期(08/20/99) %X 重新设置本地时间(12:00:00) %y 两位数字表示的年(99) %Y 当前月份 %Z 时区(PDT) %% 百分号(%) systime() 得到时间戳,返回从1970年1月1日开始到当前时间(不计闰年)的整秒数 4.其他函数 close( Expression ) 用同一个带字符串值的 Expression 参数来关闭由 print 或 printf 语句打开的或调用 getline 函数打开的文件或管道。如果文件或管道成功关闭,则返回 0;其它情况下返回非零值。如果打算写一个文件,并稍后在同一个程序中读取文件,则 close 语句是必需的。 system(Command ) 执行 Command 参数指定的命令,并返回退出状态。等同于 system 子例程。 Expression | getline [ Variable ] 从来自 Expression 参数指定的命令的输出中通过管道传送的流中读取一个输入记录,并将该记录的值指定给 Variable 参数指定的变量。如果当前未打开将 Expression 参数的值作为其命令名称的流,则创建流。创建的流等同于调用 popen 子例程,此时 Command 参数取 Expression 参数的值且 Mode 参数设置为一个是 r 的值。只要流保留打开且 Expression 参数求得同一个字符串,则对 getline 函数的每次后续调用读取另一个记录。如果未指定 Variable 参数,则 $0 记录变量和 NF 特殊变量设置为从流读取的记录。 getline [ Variable ] < Expression 从 Expression 参数指定的文件读取输入的下一个记录,并将 Variable 参数指定的变量设置为该记录的值。只要流保留打开且 Expression 参数对同一个字符串求值,则对 getline 函数的每次后续调用读取另一个记录。如果未指定 Variable 参数,则 $0 记录变量和 NF 特殊变量设置为从流读取的记录。 getline [ Variable ] 将 Variable 参数指定的变量设置为从当前输入文件读取的下一个输入记录。如果未指定 Variable 参数,则 $0 记录变量设置为该记录的值,还将设置 NF、NR 和 FNR 特殊变量。 5.排序函数 asort:对数组的值进行排序,并且会丢掉原先键值; asorti:对数组的下标进行排序。

你可以用爱得到全世界,你也可以用恨失去全世界

Linux文本处理工具之awk

相关文章:

你感兴趣的文章:

标签云: