内建函数
length()
获得字符串长度
cat score.txt
Marry 2143 78 84 77
Jack 2321 66 78 45
Tom 2122 48 77 71
Mike 2537 87 97 95
Bob 2415 40 57 62
awk '{print $1, length($1)}' score.txt
Marry 5
Jack 4
Tom 3
Mike 4
Bob 3
split()
将字符串按分隔符分隔,并保存至数组
head -1 /etc/passwd
root:x:0:0:root:/root:/bin/bash
head -1 /etc/passwd|awk '{split($0,arr,/:/);for(i=1;i<=length(arr);i++) print arr[i]}'
root
x
0
0
root
/root
/bin/bash
getline
从输入(可以是管道、另一个文件或当前文件的下一行)中获得记录,赋值给变量或重置某些环境变量
从shell命令date中通过管道获得当前的小时数
date
Tue Mar 20 16:15:52 CST 2018
awk 'BEGIN{"date"|getline;split($4,arr,/:/);print arr[1]}'
16
从文件中获取,此时会覆盖当前的$0。
cat a.txt
a1
a2
cat b.txt
b1
awk '{getline <"a.txt";print $0}' b.txt
a1
awk '{getline <"b.txt";print $0}' a.txt
b1
a2
赋值给变量
awk '{getline a <"a.txt";print $0"---"a}' b.txt
b1---a1
读取下一行(也会覆盖当前$0),此时表示只对偶数行进行处理,如果最后一行是偶数行,也对最后一行处理
cat n.txt
1
2
3
4
5
awk '{getline;total+=$0}END{print total}' n.txt
11
next
作用和getline类似,也是读取下一行并覆盖$0,区别是next执行后,其后的命令不再执行,而是读取下一行从头再执行
跳过以a-s开头的行,统计行数,打印最终结果
awk '/^[a-s]/{next}{count++}END{print count}' /etc/passwd
合并相同列的两个文件
cat e.txt
姓名 学号
张三 00001
李四 00002
王五 00003
cat f.txt
学号 分值
00003 90
00002 75
00001 80
# 这里当读第一个文件时NR==FNR成立,执行a[$1]=$2,然后next忽略后面的。读取第二个文件时,NR==FNR不成立,执行后面的打印命令
awk 'NR==FNR{a[$1]=$2;next}{print $0,a[$2]}' f.txt e.txt
姓名 学号 分值
张三 00001 80
李四 00002 75
王五 00003 90
sub(regex,substr,string)
替换字符串string(省略时为$0)中首个出现匹配正则regex的子串substr
echo 178278 world|awk 'sub(/[0-9]+/,"hello")'
hello world
gsub(regex,substr,string)
与sub()类似,但不止替换第一个,而是全局替换
head -n5 /etc/passwd|awk '{gsub(/[0-9]+/,"----");print $0}'
root:x:----:----:root:/root:/bin/bash
bin:x:----:----:bin:/bin:/sbin/nologin
daemon:x:----:----:daemon:/sbin:/sbin/nologin
adm:x:----:----:adm:/var/adm:/sbin/nologin
lp:x:----:----:lp:/var/spool/lpd:/sbin/nologin
substr(str,n,m)
切割字符串str,从第n个字符开始,切割m个。如果m省略,则到结尾
echo "hello,世界!"|awk '{print substr($0,8,1)}'
界
tolower(str)和toupper(str)
表示大小写转换
echo "hello,世界!"|awk '{print toupper($0)}'
HELLO,世界!
system(cmd)
执行shell命令cmd,返回执行结果,执行成功为0,失败为非0
awk 'BEGIN{if(!system("date>/dev/null"))print "success"}'
success
match(str,regex)
返回字符串str中匹配正则regex的位置
awk 'BEGIN{A=match("abc.f.11.12.1.98",/[0-9]{1,3}./);print A}'
7