Chinaunix首页 | 论坛 | 博客
  • 博客访问: 16448
  • 博文数量: 8
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 10
  • 用 户 组: 普通用户
  • 注册时间: 2017-07-04 09:49
文章分类
文章存档

2018年(7)

2017年(1)

我的朋友

分类: LINUX

2018-04-01 14:17:41

原文地址:awk essential trainning 笔记 作者:caoxwei

03_01:  
awk '{print $2, $1}' names.txt    //以空格作默认分隔符
awk '{print $2 $1}' names.txt      //直接拼接没有分隔符
awk '{print $2 ", " $1}' names.txt  //显式地以逗号作分隔符
03_02
NF:Number of filed
NR:Number of Record


awk 命令的一般形式: awk 'pattern{action}'  filename
未指定模式则对所有行操作,指定了模式则对匹配了模式的行执行操作
awk '/up/{print NF,$0}'  a.txt   打印包含up的行
awk 'NF==6{print NF,$0}'  a.txt   打印域为6的行
awk 'NF==6'  a.txt         只有模式没有命令,则打印匹配模式的行
awk '/up/{print "UP:" ,NF,$0}  /down/{print "DOWN:",NF,$0}'  a.txt   打印包含up的行,以及包含down的行


03_03:  -f开关,表示从文件读取awk命令,并执行(当命令较长时用的较多)
awk -f swap names.txt
swap文件的内容为{print $2,$1},awk文件的内容无需用'',但在命令行中必须使用
若要使用模式,比如正则表达式,则修改如下:/th/{print $2,$1}


-F指定分隔符,默认为空格或者tab键盘
awk -F, '{print $2}'    
awk -F , '{print $2}'  //二者等价,-F后的空格可有可无
awk -F t '{print $2}'     //指定tab键为分隔符




-v可指定一个变量
awk -v hi=hello '{print $1,hi}'


结束输入:ctrl +d(unix)或ctrl+z(windows)
可以直接指定文件或者用“<”输入重定向,也可用管道向awk传递数据,或者将awk数据传递给其他程序 uptime|awk 'print NF,$0'
awk '{print NF,$0}' a.txt |sort -n


">"输出重定向


04_01:当用-F制定","作分隔符时,空格将被当作文字的一部分被处理
   awk -F abc  '{print $2}'  //abc作分隔符
   awk -F ‘[,!]’ '{print $2}'  //用正则做分隔符


04_02:除了在命令行中用-F指定分隔符还可以在awk程序中用FS指定分隔符
awk '{FS=",";print $2}'   //不能识别第一行
awk 'BEGIN{FS=","}{print $2}'  
 
awk 'BEGIN{RS="!";FS=“,”}{print $2}' onebigline.txt



awk 'BEGIN{RS="";FS="\n"}{name=$1;addr=$2;city=$3;print name","addr"," city}'  multiaddress.txt   //空行做记录分隔符,换行做域分隔符



默认OFS是空格 ,ORS默认是换行符  
awk 'BEGIN{ORS="!";OFS=", "}{print $2,$1}' names.txt




awk -F, '{print $1,"\t" $2 "\t" $3} '
awk 'BEGIN{FS=",";FS="\t"}{print $1,$2,$3}'   //$1,$2,$3之间必须加“,”否则无分隔符而且不能用$0代替
awk 'BEGIN{FS=",";FS="\t"}{print }'   //打印所有行的所有内容


05_01:内置变量可用在pattern中,也可用于command中
NR:记录号 
NF:域号
FILENAME:文件名
FNR:在相应文件中的记录号
$0:整行
$i:第i个域
NF和$NF的区别:前者是数字,后者是相应数字对应的域的值





awk '{print $NF}'  dukeofyork.txt     //打印最后一个域
awk '{print $(NF-1)}'  dukeofyork.txt    //打印倒数第二个域
awk '{print $NF-1}'  dukeofyork.txt    //打印最后一个域的值并减1,若为字符,则字符对应的数字为0,0-1得-1


awk '{print  $($1)}'     
awk '{$2="TWO";print}'  dukeofyork.txt     //这个需要用BEGIN模式吗? //当有8个域时,可以赋值给第12个域
awk '{$0="one two three"; print NF,$2}' dukeofyork
-
05_02:自定义变量(大小写敏感)
awk根据上下文确定变量是数字类型还是字符串(字符串的数值为0)
awk '{a=1;b=2;c=3;print a b*c}'   //1(2*3)=16
awk '{a=1;b=2;c=3;print (a b)*c}'   //12*3
awk '{print "\""$1"\"+0="$1+0}'      //"$1"+0=


66abccd=66
acbcd66=0
awk变量均为全局变量




05_03:操作符和数组


+,-,*,/,%,^
++,--
==,!=,<,<=,>,>=

~,!~
[]




06_01:正则表达式
/abc/  匹配abc


awk '/up/{print $0}'   //打印匹配所有匹配up的行
awk '$4 ~ /up/{print $0}'  //打印第4字段匹配up的行,~为比较是否匹配正则
/a.c/   match    .为占位字符 
/a\.c/  match a.c     \为转义字符
/^abc/   ^表示开头
/abc$/   $表示结尾
/a[xyz]c/   []内的字符任选一个
/a[a-z]c/
/a[a-zA-Z]c/
/a[^a-z]c/    ^在此处意义不同,表示取反,只要不是[]内的字符即可
*    0或任意个字符
+   1或1个以上任意内容
?    0或一个
{n} 确定个数的字符   /ab{3}c/   abbbc
{n,}   n个或n个以上的字符   /ab{3,}c/ 
{n,m}  n到m个字符

() 表示重复的字符,可为多个


/ab+c/   abbbbbc
/(ab)+c/   ababababc


贪婪定理:总是选择匹配最多字符的匹配项


/<.+>/     italic text
/<[^>]+>/ 匹配  








07_01:控制结构
awk '{if(NF<8){print "Short:",$0} else {print "long line:",$0}}' duok.txt
可将上面的语句写入一个shell脚本中




08_01:格式化输出
awk -F, '{printf("%s\t%s\t%d\n",$1,$2,$3)}' nameemaiavg.csv
09_01:操作字符串
length([string])   
index(string,target)   返回匹配的起始位置,没匹配则返回0
match(string,target)   返回起始的位置,并设置RSTART,RLENGTH
substr(string,start[,length]),从起始位置开始截取,如果截取长度省略,则截取到最后一个字符






sub(regexp,newval[,string])   //替换函数,若最后字符串省略,则默认为$0
gsub(regexp,newval[,string]) //sub只替换一次,gsub替换所有
split(string,array,[,regexp]   //用正则做分隔符,若省略则为FS,将字符串分隔成数组,不修改字符串
awk -F 'BEGIN{OFS="\t"}{split($1,a,/ /);print a[2]", "a[1], $2,$3}' nameemail.csv








09_02:关联数组
awk '{a["first"]=$1;a["second"]=$2;a["third"]=$3; print a["third"],a["second"]}'


//特殊的循环
for(index in array){
body
}
用关联数组模拟多维数组










09_03:数学函数
int(x)
rand()   int(rand() *6)+1   //1-6
sran([x])   x省略时则用当前时间
sqrt(x)
sin(x)
cos(x)
atan2(y,x)
log(x)
exp(x)








10_01:管道
10_02:解析Excel CSV文件

























阅读(802) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~