awk內(nèi)建函數(shù)

內(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

參考

linux基礎(chǔ)命令介紹八:文本分析 awk

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容