awk内建函数

内建函数

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

参考

linux基础命令介绍八:文本分析 awk

原文地址:https://www.cnblogs.com/okokabcd/p/8610113.html