1  简介

awk实质是一种编程语言,基本作用在于查找和替换。

2  基本用法

有文本名称为:awk.txt 内容为:

john.wang       male    30      021-111111
lucy.yang female 25 021-222222
jack.chen male 35 021-333333
lily.gong demale 20 021-444444 shanghai

 常用法1:awk -F ' '  '{print $1}'  awk.txt

-F是指定分隔符参数,其后可以指定分隔符,用来把原文的行分成一个一个小组,默认是空格,而$1表示分隔后的第一组,printf或者printf 表示打印和输出,awk.txt表示对哪个文件的内容进行处理,所以现有命令的执行结果是awk.txt的第一列。

常用法2:awk '{print}' awk.txt    默认是打印出awk.txt的所有行的内容。

常用法3:awk -f script.awk awk.txt    -f是指定脚本文件script.awk,script.awk的内容是:

BEGIN{

FS="m"

}

{print $1}

常用法2:awk '{print "a"}'   /etc/passwd      输出和源文件相的行,但是内容不同,这里一行只有一个a字母

参数详情见表:

 [-F|-f|-v]   大参数,-F指定分隔符,-f调用脚本,-v定义变量 var=value
' ' 引用代码块
BEGIN 初始化代码块,在对每一行进行处理之前,初始化代码,主要是引用全局变量,设置FS分隔符
// 匹配代码块,可以是字符串或正则表达式
{} 命令代码块,包含一条或多条命令
; 多条命令使用分号分隔
END 结尾代码块,在对每一行进行处理之后再执行的代码块,主要是进行最终计算或输出结尾摘要信息

  

3  内建变量

就是awk中建好了的变量,相当于接口或者参数

常用法1:awk  -F: '{print $1,$3,$6}' OFS="\t" /etc/passwd    表示一行一行处理awk.txt文件,用:作为源文件中每一行的组的分隔符,随后分开打印第1,3,6组(如果没有逗号,表示连起来打印),用OFS表明输出的时候,       格式按照制表符隔开地输出.

常用法2:awk -F":" '{print "Username:" $1 "\t Uid:" $3 }' /etc/passwd  每一行的第一组前都添加“username”作为提示,第三组前都添加制表符和uid作为提示符。

常用法3:awk '{print NF}' awk.txt    按照默认空格分字段的话,显示每行有多少个字段。awk '{print $NF}' awk.txt每行最后一个字段的值打印出来

常用法4:awk  'NF==4 {print }' awk.txt         显示只有4个字段的行,同样支持>和<,>=和<=

常用法5: awk '{print NR,NF,$0}' awk.txt     依次打印出行号,每行的字段数,本行的内容。awk 'NR==5 {print }' awk.txt (显示第五行)

常用法6: awk '$2~/male/ ||$3>3{print NR,$1,$2,$3}' OFS='\t' awk.txt    二字段匹配male 或者  3字段大于3 的行,打印出行号和$1,$2,$3(注意,print后边的字段符号必须用逗号分隔,否则OFS不起作用,因为此时的输出时候的换行符是\t。

常用法7:awk 'BEGIN{FS=" ";OFS="^^"}{print $1,NF}' awk.txt    把FS=“ ”作为划分原文字段的依据,但是输出的时候,把字段之间的分隔符变成OFS=“^^”。得到:格式如:John.wang^^4

常用法8,FILENAME:awk 'FNR==1{print FILENAME,":",$0}' *.txt    把当前文件夹下所有txt文件的文件名和第一行打印出来。这条命令也是一样的作用:awk 'BEGIN{FS=" ";OFS=":"}FNR==1{print FILENAME,$0}' *.txt

常用法9,输入参数获取(ARGC ,ARGV使用): 表示并不会,回头问问。#问题1

常用法10,按照宽度指定分隔符:echo 20100117054932 | awk 'BEGIN{FIELDWIDTHS="4 2 2 2 2 2"}{print $1"-"$2"-"$3,$4":"$5":"$6}'FIELDWIDTHS="4 2 2 2 2 2"就表示$1宽度是4,$2是2,$3是2  .... 。这个时候会忽略:FS分隔符。

多文件处理用ARGIND: awk 'ARGIND==1{print $1} ARGIND==1{print $0}' t1,t2   意思是打印t1的第一个字组,打印t2的每一行。注意argind一定在花括号外边。

常用法

    NF          表示字段数量,不知道列数的情况下打印出最后一列,就可以使用 {print $NF}
NR 每行的行号,在源文件中的行号
FNR 与NR类似,不过多文件记录不递增,每个文件都从1开始
FS BEGIN时定义分隔符,作用和-F是一样的,只是在代码块中指定而已,也就是放在引号里
OFS 打印到显示器的时候的字段的分隔符,FS是原文分隔的字段的标记,而OFS是输出的格式,输出的两个内容之间分隔符是自定义的,输出内容的行与行之间默认添加换行符
ORS 作用和OFS相仿,把所有输出放到一行里,并且用自定的行分隔符分开
RS 输入的记录分隔符, 默认为换行符(即文本是按一行一行输入)
FILENAME 文件名
OFS 输出字段分隔符, 默认也是空格,可以改为制表符等
ORS 输出的记录分隔符,默认为换行符,即处理结果也是一行一行输出到屏幕
除此以外,awk还支持|| ,&& ,!= ,~约等于,!~不约等于,\t,\n,+(匹配一个或者一个以上),,,等正则或者逻辑符号。

4   awk中的匹配 ,(常用)awk默认扩展正则表达式

涉及if语句,条件表达式,逻辑运算符。

常用法1:awk '/John/{print}'  awk.txt    同时匹配多个:awk '/34/ && /25/ {print}' awk.txt

常用法2:awk '$1~/jack.chen/{print $1}' awk.txt用每行第1字段匹配jack.chen,如果匹配上了,就打印出来。awk '$2~/female/{print $2}' awk.txt 第二个字段匹配female,注意,“~”符号表示匹配,不是精确匹配,意思就是jack.chen 和jack.che都可以匹配

常用法3:awk '{if($1~/\./){print $1} else{print $2}' awk.txt  按照默认的分隔符,如果第一字组可以匹配句号就打印第一字组,否则打印第二字组

常用法4:awk '{if($3>=22){print $0}}' awk.txt    打印出第三字组大于等于22的整组。

常用法5:awk -F: '$1~/mail/ && $3>8 {print }' /etc/passwd    ||与,$1可以匹配mail 并且 $3大于8

"+"使用:awk '/22+2/' awk.txt    #匹配开头有俩2,后边跟着若干个2并且结尾是一个2的一行

“?”使用:awk '/fe?male/' awk.txt    #匹配female或者feemale, 区分于带括号的写法:awk '/(fe)?male/' awk.txt,表示匹配male或者female

“|”使用: awk '/chen|wang/' awk.txt    #匹配带有chen或者wang的行

“{}"使用:awk '/3{6}/' awk.txt    #匹配333333(六个3),awk '/3{6,}/' awk.txt (个数后面加上句号表示至少有6个3)

“[]"使用:awk '/Joh[a-z]/' awk.txt    #匹配Joh加上任意一个小写字母的字符串

”~"使用:awk '$!~/c/' awk.txt     #把所有行中第一字段带c字母的行打印出来,注意,区别于 awk '$1/c/' awk.txt ,这句命令的意思是打印出所有第一字段为c的行

其他相关用法:

awk '$2 ~ /^h/' awk.txt   #^ 表示开头,以h开头的,$表示结尾

awk '/a..e/' awk.txt    #.表示除了换行符以外的任意字符,匹配的是a后跟着俩任意字符然后再跟着e

awk '/a.*e/' awk.txt    #星号表示任意多个全能字符,可以是0,也可以是10,

awk '/a\.e/' awk.txt    #\是转义字符,表示匹配a.e

5  awk中的数值运算

常用法1:awk -F: '/mysql/{print $3*$4}' /etc/passwd    +、-、*、/ 运算都可以支持。

常用法2:awk 'BEGIN{a=1;b=2;print (a>5 && b<=2),(a>5 || b<=2);}    返回0,1,

6 格式化输出

常用法1:awk '{printf "%-4s %-4s %-4.2f \n",$1,$2,$3}' awk.txt    基本符合shell中字符串格式的定义方式,注意:printf要在花括号里,后面跟着双引号,双括号内用空格隔开,外部用逗号隔开

7 条件语句if

常用法1:awk 'BEGIN{A=0;B=0}{if($3>4) {A++;print "large"}else{B++;print "small"}}END{print A "\t" B}' awk.txt    BEGIN相当于设置全局变量A和B,$3大于4的话,A加1,否则B加1,结束以后打印A和B。

    常用法2:awk 'BEGIN{i=1}{if(i<NF){print NR,NF} i++}' awk.txt  NF意思是每行的字段数量

常用法3,awk 'BEGIN{test=100;if(test>90){print "very good"}else{print "bad"}}'     #test大于90就输出good,否则输出bad,判断条件语句小括号括起来,命令动作语句可以用花括号括起来,同一个条件中中的语句不加分号

8  循环语句while,for,do

常用法1:awk 'BEGIN{i=1}{while(i<NF) print NF,"\t",$i,"\t",i++}' awk.txt    i++在原文中既是print后面跟着的对象,又是while递增1的实体对象,

加法迭代:awk 'BEGIN{test=100;total=0;while (i<=test){total+=i;i+=1;}{print total}}'    #从1加到100;注意此处的i从1开始迭代,不是从0开始的,

for循环第一种,迭代数组:awk 'BEGIN{for (k in ENVIRON){print k"="ENVIRON[k]}}'    #for(k in 数组)作用就是迭代访问数组

for循环第二种,设置循环条件:awk 'BEGIN{total=0;for (i=0;i<=100;i++){total+=i}{print total}}'    #for (i=0;i<=100;i++)有点像列表解析

do...while循环:awk 'BEGIN{total=0;i=1;do {total+=i;i++} while (i<=100){print total}}'    #do...while实际上和while差不多。

9 数组

定义数组,打印数组元素:awk 'BEGIN{a[0]="xiaohong";a[1]="xiaolan";print a[0]}'

打印所有下标:awk 'BEGIN{a[0]="xiaohong";a[1]="xiaolan";for (i in a)print i;}'

得到数组的长度:awk 'BEGIN{info='it is a test';lens=split(info,tA," ");print length(tA),lens}‘    length()是一个函数,返回字符串或者数组的长度,split表示把info用空格分开,然后每个字段当成数写到数组tA中,如果想查看数组:awk 'BEGIN{info='it is a test';lens=split(info,tA," ");for ( i in tA){print i,tA[i]}}'(这是无序数组)

得到有序数组:awk ’BEGIN{info="it is a test";lens=split(info,tA," "};for (i=1;i<=lens;i++){print i,tA[i]}'    精髓在于i的迭代方式

判断数组中是否有某个元素存在:awk 'BEGIN{tB["a"]="a1";tB["b"]="b1";if( "c" in tB){print "ok"}else{print "no"}}'

从文件中获得数组:awk -F: '{{a[NR]=$1;}{print NR,a[NR]}}' /etc/passwd    -F指定数组的字段分隔方式是冒号,数组a以函数为键,第一数组为值

删除数组的变量:awk 'BEGIN{tB[1]="a1";tB[2]="b1";delete tB[1];for(k in tB){print k,tB[k];}}'

统计词频:awk '{for(i=1;i<=NF;i++){arr[$i]=arr[$i]+1}}END{for(j in arr){print j,arr[j]}}' tmp    NF是每行中的单词,迭代每行中的每个单词,写到一个叫arr的字典中,读取,遍历打印。

10  awk 中获取外部变量

可操作和不可操作的变量传入时候有区别:

test = 'hello awk '(前提)

awk '{print test}' test="$test"    可以打印出来,证明这样写变量可以传入awk的【action】中。        awk test="$test" '{print test}'这样不能够打印出test的值,自然别的操作也不支持,除非用-v参数:awk -v test="$test" 'BEGIN{print test}'

11 多文件的处理

例题1:

t1 :

daqing 大晴

t3:

daqing 你好

想要得到混合输出:awk 'BEGIN{ORS=""}ARGIND==1{ast[$1]=$2}ARGIND==2{for(i=1;i<=2;i++){if($i in ast)print ast[$i];else print $i}print "\n"}' t3 t1    返回“大晴 你好”,ORS输出的时候,替换默认的换行符,第一个文件放到数组中,形如(‘daqing’:大晴),遍历第二个文件中每个字组,如果有“daqing”字符串,那就替换成“大晴“,如果没有,那就输出这个字组,if判断语句结束以后换行。

例题2:


t1:

daqing    大晴    (说明:中间有4个空格,是一个换行符)

t2:

daqing 你好

得到混合输出:awk 'BEGIN{FS="\t";ORS=""}ARGIND==1{aset1[$1]=$2}ARGIND==2{split($0,arr," ");for(i=1;i<=length(arr);i++){if(arr[i] in aset1)print aset1[arr[i]] ;else print arr[i]}print "\n"}' t3 t1

12 awk中字符串操作

awk中数据类型,是不需要定义,自适应的。 有时候需要强制转换,+表示数字到字符串的转换,“”表示字符串直接连接。

字符串转数字:awk 'BGEIN{a="100";b="-10";print (a+b)}    #得到结果90.

字符串转化为数字:awk 'BEGIN{a=100;b=-10;c=(a""b);print c}'    #c=把a和b用双引号连接起来,单引号不行。

13 awk的内置函数

 数学函数:

函数名	说明
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 参数则使用某天的时间。返回先前的种子值

内置函数的基本用法:awk 'BEGIN{OFMT="%.3f";fs=sin(1);fe=exp(10);fl=log(10);fi=int(3.1415);print fs,fe,fl,fi;}'    #返回:0.841 22026.466 2.303 3

获得任意随机数:awk '{srand();fr=int(100*rand();print fr}'    #srand的作用是初始化随机数的参数,如果没有的话,一天之内得到的随机数是一样的。int()的作用是取整,rand()是一个大于等于0小于1的随机数。

字符串处理相关的函数:

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 参数指定的表达式并返回最后生成的字符串。

gsub函数的使用:$ awk 'BEGIN{info="this is a test2010test";gsub(/[0-9]+/,"!",info);print info}'     #gsub函数基本上是一个替换函数,把数字换成叹号

index函数是查找:awk 'BEGIN{info="this is a test2010test";print index(info,"test")?"ok":"no found"}'    #index()查找info里是否有”test“,输出是或者没找到,此处有个特殊用法:awk 'BEGIN{print (2==3)?"ok":"no found"}' ,?"ok":"no found"预计是特殊格式,意思是:打印一个东西,东西是啥呢?ok或者no found。

match正则表达式:awk 'BEGIN{info="this is a test2010test!";print match(info,/[0-9]+/)?"ok":"no found";}'

substr截取:awk 'BEGIN{info="this is a test2010test!";print substr(info,4,10);}'       #输出:s is a tes,

    split数组用法:awk 'BEGIN{info="this is a test";split(info,tA," ");print length(tA);for(k in tA){print k,tA[k];}}'    #意思是用空格分隔info,然后储存到数组tA中,键是1234等序数,值是字组。

格式化字符printf:

%d	十进制有符号整数
%u 十进制无符号整数
%f 浮点数
%s 字符串
%c 单个字符
%p 指针的值
%e 指数形式的浮点数
%x %X 无符号以十六进制表示的整数
%o 无符号以八进制表示的整数
%g 自动选择合适的表示法

  格式化字符的基本用法: awk 'BEGIN{n1=124.113;n2=-1.224;n3=1.2345; printf("%.2f,%.2u,%.2g,%X,%o\n",n1,n2,n3,n1,n1);}'    #得到124.11,18446744073709551615,1.2,7C,174    #%.2f是保留两位小数,常用的是%d,%s,%f,可以尝试%g,%.2g也是不错的用法。

 

awk基本用法的更多相关文章

  1. Linux sed 和 awk的用法

    sed用法: 原文链接:http://www.cnblogs.com/dong008259/archive/2011/12/07/2279897.html sed是一个很好的文件处理工具,本身是一个管 ...

  2. 文本处理三剑客之AWK的用法

    1.awk命令简介: awk是一种可以处理数据.产生格式化报表的语言,功能十分强大. awk的工作方式是读取数据,将每一行数据视为一条记录(record)每笔记录以字段分隔符分成若干字段,然后输出各个 ...

  3. gawk(awk)的用法案例

    gawk(awk)的用法案例 本文首先简单介绍一个gawk和awk的区别,然后是一点基本使用流程,最后是自己做的一个分析数据文件的脚本代码,供大家参考.另外想了解基本流程的入门知识的可以下载附件pdf ...

  4. linux awk的用法

    linux awk的用法 <pre>[root@iZ23uewresmZ ~]# cat /home/ceshis.txtb 12 42 30 b 03 43 25 a 08 10 16 ...

  5. <三剑客> 老大:awk命令用法

    awk是一种编程语言,用于在linux/unix下对文本和数据进行处理.数据可以来自标准输入(stdin).一 个或多个文件,或其它命令的输出.它支持用户自定义函数和动态正则表达式等先进功能,是lin ...

  6. awk命令_Linux awk 命令用法详解

    本文索引 awk命令格式和选项 awk模式和操作 模式 操作 awk脚本基本结构 awk的工作原理 awk内置变量(预定义变量) 将外部变量值传递给awk awk运算与判断 算术运算符 赋值运算符 逻 ...

  7. awk的用法(转)

    awk 用法:awk ' pattern {action} ' 变量名 含义 ARGC 命令行变元个数 ARGV 命令行变元数组 FILENAME 当前输入文件名 FNR 当前文件中的记录号 FS 输 ...

  8. awk简单用法

    awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各 ...

  9. 【转】awk 数组用法【精华贴】

    文本处理的工作中,awk的数组是必不可少的工具,在这里,同样以总结经验和教训的方式和大家分享下我的一些学习心得,如有错误的地方,请大家指正和补充. awk的数组,一种关联数组(Associative ...

随机推荐

  1. POJ 2253 Frogger (Floyd)

    Frogger Time Limit: 1000MS   Memory Limit: 65536K Total Submissions:57696   Accepted: 18104 Descript ...

  2. POJ 3522 Slim Span(极差最小生成树)

    Slim Span Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 9546   Accepted: 5076 Descrip ...

  3. jquery 前端 跨域 jsonp

    1.jsonp 支持get:可以跨域: 2.java 在controller中增加header: /** * 获取用户信息 */ @ResponseBody @RequestMapping(value ...

  4. day15-ajax和jquery

    回顾: 分页: 将数据按照页码划分,提高用户的体验度. 分类: 逻辑分页:一次性将内容加载到内存(list),获取自己想要的数据 sublist截取.缺点:维护起来麻烦 物理分页:(经常使用) 每次只 ...

  5. 把菜单栏变成万能工具箱,让你的 Mac 更酷炫

    文章来源:知乎 文章收录于:风云社区 www.scoee.com,提供上千款各类mac软件下载 为了彰显存在感,各路 Mac 应用都喜欢在菜单栏上安置一个图标:其中有的只是用来召唤主界面,也有一些应用 ...

  6. 从LIst集合中安全的删除元素

    package cn.rocker.list; import java.util.ArrayList; import java.util.Iterator; import java.util.List ...

  7. img标签的onerror事件

    #情景分析: 有时,img标签中的src图片加载失败,原来的图片位置会出现一个碎片图标,这样让人很不爽,如何变得美观些呢? #解决方案: 可以借用img标签的onerror事件,img标签支持oner ...

  8. python 面向对象(二)成员

    ##################################总结########################### 类的成员: 变量: 实例变量      对象.属性=xxx 类变量    ...

  9. canvas svg webgl threejs d3js 的区别

    canvas 绘制2D位图. Echarts是基于Canvas技术的可视化工具,底层封装了原生的JavaScript的绘图 API. canvas里面绘制的图形不能被引擎抓取,canvas中我们绘制图 ...

  10. 利用 yEd 软件做元数据管理

    利用 yEd 软件做元数据管理 yEd Diagram editor 是我常用的 flow chart 制图工具, 另外我也用它画 ER 和 use case 图. 总结一下我喜欢 yEd 的原因:1 ...