內(nèi)建函數(shù)
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()
將字符串按分隔符分隔,并保存至數(shù)組
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
從輸入(可以是管道、另一個文件或當前文件的下一行)中獲得記錄,賦值給變量或重置某些環(huán)境變量
從shell命令date中通過管道獲得當前的小時數(shù)
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),此時表示只對偶數(shù)行進行處理,如果最后一行是偶數(shù)行,也對最后一行處理
cat n.txt
1
2
3
4
5
awk '{getline;total+=$0}END{print total}' n.txt
11
next
作用和getline類似,也是讀取下一行并覆蓋$0,區(qū)別是next執(zhí)行后,其后的命令不再執(zhí)行,而是讀取下一行從頭再執(zhí)行
跳過以a-s開頭的行,統(tǒng)計行數(shù),打印最終結(jié)果
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成立,執(zhí)行a[$1]=$2,然后next忽略后面的。讀取第二個文件時,NR==FNR不成立,執(zhí)行后面的打印命令
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)中首個出現(xiàn)匹配正則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省略,則到結(jié)尾
echo "hello,世界!"|awk '{print substr($0,8,1)}'
界
tolower(str)和toupper(str)
表示大小寫轉(zhuǎn)換
echo "hello,世界!"|awk '{print toupper($0)}'
HELLO,世界!
system(cmd)
執(zhí)行shell命令cmd,返回執(zhí)行結(jié)果,執(zhí)行成功為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