当前位置: 首页 > Linux

每天一个Linux命令(四):awk

时间:2023-04-07 01:21:30 Linux

推荐:每天一个Linux命令(三):sed命令介绍awk模式扫描和处理语言,处理文本和数据。awk是linux/unix下处理文本和数据的一种编程语言。数据可以来自标准输出(stdin)、一个或多个文件或其他命令的输出。它在命令行上使用,但更多时候作为脚本使用。awk有很多内置的函数,比如数组、函数等,这些和C语言是一样的,灵活性是awk最大的优势。语法格式awk[options]'scripts'var=valuefilename常用参数-F指定分隔符(可以是字符串或正则表达式)-f从脚本文件中读取awk命令-vvar=value赋值变量,将外部变量传递给awk脚本基本结构awk'BEGIN{print"start"}pattern{commands}END{print"end"}'filename一个awk脚本通常由三部分组成:BEGIN语句+模式匹配+END语句,这三部分是选修的。工作原理:第一步是执行BEGIN语句,第二步是从文件或标准输入中读取一行,然后执行pattern语句,逐行扫描文件,直到读取完所有文件。第三步执行END语句示例显示:echo"hello"|awk'BEGIN{print"welcome"}END{print"2017-08-08"}'welcome2017-08-08echo-e"hello"|awk'BEGIN{print"welcome"}{print}END{print"2017-08-08"}'welcomehello2017-08-08#不加打印参数时,默认只打印当前行echo|awk'{a="你好";b="你好";c="民工哥";打印a、b、c;}'hellonihaomingongge#打印时用逗号分隔,打印时用空格分隔echo|awk'{a="mgg";b=“明格”;c="民工哥";打印a"是"b"或"c;}'mgg是mingg或mingongge#awk的print语句中的双引号其实是一个拼接函数awk变量内置变量$0#当前记录$1~$n#当前记录的第N个字段FS#输入字段分隔符(the效果同-F)defaultspaceRS#输入记录分隔符,默认换行符NF#字段数为列NR#记录数为行号,默认从1开始OFS#输出字段分隔符,默认空格ORS#输出记录分隔符,默认换行外部变量[mingongge@~]#a=100[mingongge@~]#b=100[mingongge@~]#echo|awk'{printv1*v2}'v1=$av2=$b10000awk运算与判断算术运算符+-加减*/&乘除余数^*求幂++--增加或减少,作为前缀或后缀[mingongge@~]#awk'BEGIN{a="b";printa,a++,a--,++a;}'b011[mingongge@~]#awk'BEGIN{a="0";printa,a++,a--,++a;}'0011[mingongge@~]#awk'BEGIN{a="0";printa,a++,--a,++a;}'0001#和其他编程语言一样,所有运算都作为算术运算符,操作数自动转为值,所有非值转为0。赋值运算符=+=-=*=/=%=^=**=正则运算符~!~匹配正则表达式/不匹配正则表达式逻辑运算符||&&LogicalORLogicalAND关系运算符<<=>>=!==otheroperator$fieldreferencespacestringlinker?:三元运算符ln数组中是否有键值awk正则^行首定位符$行尾定位符.匹配任何单个字符*匹配0个或多个前导字符(包括回车)+匹配1个或多个前导字符?匹配0个或1个前导字符[]匹配指定字符组中的任意字符/^[ab][^]匹配不在指定字符组中的任意字符()子表达式|orescapecharacter~,!~匹配或不匹配条件语句x{m}x字符重复m次x{m,}x字符至少重复m次X{m,n}x字符至少重复m次但不重复n次以上(需指定参数-posix或--re-interval)awk实例介绍awk–F:'{print$2}'datafile#打印第二列分隔符:awk–F:'/^Dan/{print$2}'datafile#打印dan开头的行的第二列内容awk–F:'/^[CE]/{print$1}'datafile#打印以C或E开头的行的第一列awk–F:'{if(长度($1)==4)打印$1}'datafile#打印第一列的内容,分隔符:长度为4个字符awk–F:'/[916]/{print$1}'datafile#匹配916的行,分隔符:打印第一列awk-F:'/^Vinh/{print"a"$5}'2.txt#显示Dan开头的行,在第五列前加上aawk–F:'{print$2","$1}'datafile#Print第二列列出第一列,用awk-F:'($5==68900){print$1}'2.txt#Separatedby:打印第五列为68900的行第一列awk-F:'{if(length($1)==11)print$1}'2.txt#打印第一列的内容,由:分隔,长度为4个字符awk-F:'$1~/TommySavage/{print$5}'2.txtawk-F:'($1=="TommySavage"){print$5}'2.txt#打印第五列的内容,中间用:隔开,第一列是TommySavagell|awk'BEGIN{size=0;}{size=size+$5;}END{print"[end]sizeis",size}'#统计目录下文件的所有字节awk'BEGIN{size=0;}{size=size+$5;}END{print"[end]sizeis",size/1024/1024,"M"}'#显示M中目录下的所有字节awk'BEGIN{a=10;a+=10;printa}'20#a+10相当于a=a+10echo|awk'BEGIN{a="100testaaa"}a~/test/{print"ok"}'#正则匹配a是否有测试字符,成立printohawk'BEGIN{a="b";printa=="b"?"ok":"err"}'ohawk'BEGIN{a="b";printa=="c"?"ok":"err"}'err#Trinityoperator?:awk'/root/{print$0}'passwd#匹配所有包含根的行awk-F:'$5~/root/{print$0}'passwd#使用分号作为分隔符,匹配第一行的5个字段是根行ifconfigeth0|awk'BEGIN{FS="[[:space:]:]+"}NR==2{print$4}'#打印IP地址awk'{printtoupper($0)}'test.txt#toupper是awk的一个内置函数,它将所有小写字母转换为大写每天一个Linux命令(1):xargs每天一个Linux命令(2):od

最新推荐
猜你喜欢