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. appium 切换native/ webview,findby,还有页面元素定位一直小于0的问题的解决

    之前一直有个bug没有解决. 今天,终于解决了. 疑问过程: app是混合应用,项目做了H5优化之后,以前的用例执行总会失败,体现在原来的一个元素点击无反馈 排查原因:1.项目做了H5优化,2.测试的 ...

  2. Unity 着色器基础知识

    一.着色器基础知识 着色器通过代码模拟物体表面发生的事情,其实就是GPU中运行的一段代码. 着色器的类型: 顶点着色器.片元着色器.无光照着色器.表面着色器.图像特效着色器.计算着色器. 坐标空间: ...

  3. UI动画的一些制作过程

    选中将要制作的3D物体,window----Animation----录制,选中的AddKey在之间的节点前点左键.

  4. HTML常用提交按钮

    1. 标签=元素 disabled(不可操作)  readonly(只读)  placeholder(提示文本) autofocus(自动获焦)  autocomplete=”on(默认.规定启用自动 ...

  5. 面向对象【day08】:异常处理(六)

    本节内容 1.概述 2.异常梳理 3.异常梳理流程图 4.异常大全 5.自定义异常 一.概述 异常处理是当程序出错了,但是我们又不想让用户看到这个错误,而且我在写程序的时候已经预料到了它可以出现这样的 ...

  6. H5新属性FileReader实现选择图片后立即显示在页面上

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. Linux记录-安装LAMP和R环境

    2.2 Apache httpd2.2.1 执行命令进行安装:yum install -y httpd2.2.2 开启服务:service httpd start2.2.3 设置开机自启动:chkco ...

  8. VMware Workstation Pro 14 虚拟机安装教程

    准备学习一下linxus,可不想双系统,那么只有虚拟机这条路了.故在此记录一下安装VMware的过程. 一.下载VMware 我用的是VMware Workstation Pro 14(其他版本也可以 ...

  9. Nginx 学习笔记(十)介绍HTTP / 2服务器推送(译)

    原文地址:https://www.nginx.com/blog/nginx-1-13-9-http2-server-push/ 我们很高兴地宣布,2018年2月20日发布的NGINX 1.13.9支持 ...

  10. 微信小程序入门教程(一)API接口数据记录

    今天测试用小程序调用API接口,发现有些数据打印都是对象,怎么全部打印详细点来 小程序代码: httpsearch: function (name, offset, type, cb) { wx.re ...