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文件
阅读(796) | 评论(0) | 转发(0) |