cat t.txt
a b c d
这里分别是一个空格两个空格和三个空格
awk '{print $1$2$3$4}' t.txt #abcd
awk -F[[:space:]] '{print $1$2$3$4}' t.txt #a b c d
看出规律了吧,既然是一种模式匹配的语言,那这个跟正则表达式其实一样,每行默认是空格分隔符来进行隔开,然后就是进行分组,可以对每个分组进行各自获取与输出
当然也可以通过-F来指定分隔符,比如下面是通过"-",来对每行文本进行分隔:
awk -F"-" '{ print $1 }' test
awk -F"-" '{ print $2 }' test
awk -F"-" '{ print $3 }' test
awk -F"-" '{ print $4 }' test
指定多个分隔符
比如下面这个正则表达式,表示的是1个或多个的空格或"-“或”,"来隔开,其中[]后面的+号熟悉正则表达式知道,表示1个或多个
awk -F '[ -,]+' '{print $1" "$3}' test
'''
aaaa ccc
Tony-ChyiChin-GoodMan-Nice
你好-中国
VERY
123456789
I you
'''
其中这里的内容我修改了,增加了aaaa,bbb,ccc,ddd,eeee这样一行,尤其注意观察第一行和最后一行,可以看到第一行是逗号隔开了,最后一行是空格隔开,然后取第一个和第三个。
if条件
如果文本内容行数很多,我们可以选择性打印想要查看的行数内容
大于1行小于等于4行的所有内容,这里的NR就表示读取记录的行数
awk '{if(NR>1 && NR<=4) print $0}' test
'''
你好-中国
VERY GOOD
123456789
'''
BEGIN END
BEGIN END可以做一些统计,比如说统计账户数:
awk 'BEGIN {count=0;print "[start] user count is ",count}{count++;print $0;} END{print "user count is ",count}' /etc/passwd
'''
[start] user count is 0
root:x:0:0:root:/root:/bin/bash
......
user count is 41
'''
当然一行比较长的话,可以在一行的后面使用""反斜杠符号,这样就可以将其余部分写到下面一行来,比如统计上面test文件里的内容有多少行:
awk 'BEGIN{count=0;print "[start] line count is ",count} \
{count+=1;print $0} \
END{print "[end] line count is ",count}' test
关系运算符
布尔运算,逗号隔开是一个表达式,真为1,假为0
awk 'BEGIN{a=2;b=3;print (a+b>4,a*b==6,a-b>0||a>1,a-b>0&&a>1)}' #1 1 1 0
赋值运算
awk 'BEGIN{a=1;a+=2;b=-8;print a+b}'
正则表达式
awk 'BEGIN{a="23hello";if(a~/23[h]/) {print "Yes"}}' #Yes
awk 'BEGIN{a="23hello";if(a~/d*[h]/) {print "Yes"}}' #Yes
gsub替换,将数字替换成"**"
awk 'BEGIN{info="Godfather 1 released on March 24, 1972";gsub(/[0-9]+/,"**",info);print info}'
#Godfather ** released on March **, **
查找字符串是否存在
awk 'BEGIN{info="Godfather 1 released on March 24, 1972";print index(info,"father")?"ok":"not found";}'
#ok
查找是否包含数字
awk 'BEGIN{info="Godfather 1 released on March 24, 1972";print match(info,/[0-9]+/)?"ok":"not found";}'
#ok
截取字符串
awk 'BEGIN{info="Godfather 1 released on March 24, 1972";print substr(info,5,10);}'