awk手冊(cè)

使用方法

awk [options] 'script' var=value file(s)
awk [options] -f scriptfile var=value file(s)

例:

awk 'BEGIN{
  print "start" 
}
pattern{ 
  commands 
} 
END{
  print "end"
 }' file(s) > output.txt

基本語(yǔ)法

模式與操作

  • 模式
    可以是以下任意一個(gè):
    1. /正則表達(dá)式/:使用通配符的擴(kuò)展集。
    2. 關(guān)系表達(dá)式:使用運(yùn)算符進(jìn)行操作,可以是字符串或數(shù)字的比較測(cè)試。
    3. 模式匹配表達(dá)式:用運(yùn)算符(匹配)和!(不匹配)。
    4. BEGIN語(yǔ)句塊、pattern語(yǔ)句塊、END語(yǔ)句塊:參見awk的工作原理
  • 操作
    操作由一個(gè)或多個(gè)命令、函數(shù)、表達(dá)式組成,之間由換行符分號(hào)隔開,并位于大括號(hào)內(nèi),主要部分是:
    1. 變量或數(shù)組賦值
    2. 輸出命令
    3. 內(nèi)置函數(shù)
    4. 控制流語(yǔ)句

流程控制

內(nèi)置變量

變 量 描述
$n 當(dāng)前記錄的第n個(gè)字段,字段間由 FS分隔。
$0 完整的輸入記錄。
ARGC 命令行參數(shù)的數(shù)目(argument count)。
ARGIND 命令行中當(dāng)前文件的位置(從0開始算)。
ARGV 包含命令行參數(shù)的數(shù)組。(argument variable)
FILENAME 當(dāng)前文件名。
NF 當(dāng)前記錄中的字段數(shù)。(number of fields)
NR 當(dāng)前記錄數(shù)。(number of record)
FNR 同 NR,但相對(duì)于當(dāng)前文件。(file number of record)
FS 字段分隔符(默認(rèn)是任何空格)。(field seperator)
OFS 輸出字段分隔符(默認(rèn)值是一個(gè)空格)。(output field seperator)
RS 記錄分隔符(默認(rèn)是一個(gè)換行符)。(record seperator)
ORS 輸出記錄分隔符(默認(rèn)值是一個(gè)換行符)。(output record seperator)
OFMT 數(shù)字的輸出格式(默認(rèn)值是%.6g)。(output format)
CONVFMT 數(shù)字轉(zhuǎn)換格式(默認(rèn)值為%.6g)
ENVIRON 環(huán)境變量關(guān)聯(lián)數(shù)組。
ERRNO 最后一個(gè)系統(tǒng)錯(cuò)誤的描述。
FIELDWIDTHS 字 段寬度列表(用空格鍵分隔)。
IGNORECASE 如 果為真,則進(jìn)行忽略大小寫的匹配。
RSTART 由 match函數(shù)所匹配的字符串的第一個(gè)位置。
RLENGTH 由 match函數(shù)所匹配的字符串的長(zhǎng)度。
SUBSEP 數(shù)組下標(biāo)分隔符(默認(rèn)值是\034)。

內(nèi)置函數(shù)

字符串函數(shù)

函數(shù)名 描述
sub 匹配記錄中最大、最靠左邊的子字符串的正則表達(dá)式,并用替換字符串替換這些字符串。如果沒有指定目標(biāo)字符串就默認(rèn)使用整個(gè)記錄。替換只發(fā)生在第一次匹配的 時(shí)候
gsub 整個(gè)文檔中進(jìn)行匹配
index 返回子字符串第一次被匹配的位置,偏移量從位置1開始
substr 返回從位置1開始的子字符串,如果指定長(zhǎng)度超過實(shí)際長(zhǎng)度,就返回整個(gè)字符串
split 可按給定的分隔符把字符串分割為一個(gè)數(shù)組。如果分隔符沒提供,則按當(dāng)前FS值進(jìn)行分割
length 返回記錄的字符數(shù)
match 返回在字符串中正則表達(dá)式位置的索引,如果找不到指定的正則表達(dá)式則返回0。match函數(shù)會(huì)設(shè)置內(nèi)建變量RSTART為字符串中子字符串的開始位 置,RLENGTH為到子字符串末尾的字符個(gè)數(shù)。substr可利于這些變量來截取字符串
toupper和tolower 可用于字符串大小間的轉(zhuǎn)換,該功能只在gawk中有效

數(shù)學(xué)函數(shù)

函數(shù)名 返回值
atan2(x,y) y,x 范圍內(nèi)的余切
cos(x) 余弦函數(shù)
exp(x) 求 冪
int(x) 取整
log(x) 自然對(duì) 數(shù)
rand() 隨機(jī)數(shù)
sin(x) 正弦
sqrt(x) 平 方根
srand(x) x是rand()函數(shù)的種子
int(x) 取 整,過程沒有舍入
rand() 產(chǎn)生一個(gè)大于等于0而小于1的隨機(jī)數(shù)

其他函數(shù)

函數(shù)名 描述
print 普通打印,使用規(guī)定的分割符
printf 格式化打印
system 執(zhí)行系統(tǒng)命令

關(guān)鍵字

關(guān)鍵字 描述
print 普通輸出,使用規(guī)定的分割符
printf 格式化輸出
system 調(diào)用系統(tǒng)命令,傳入字符串(雙引號(hào))

與系統(tǒng)交互

打印系統(tǒng)命令執(zhí)行結(jié)果

awk '{
a = system("ls");
"ls"; # 效果與system("ls")相同
print a;
}' test.txt 
# 打印ls命令的標(biāo)準(zhǔn)輸出,返回命令的執(zhí)行結(jié)果(0或非0),賦值給變量a

獲取系統(tǒng)命令標(biāo)準(zhǔn)輸出

如果希望用變量接住系統(tǒng)命令的標(biāo)準(zhǔn)輸出,則需要使用getline關(guān)鍵字

awk '{
    "ls -l" | getline line ; # 多行的情況下,指獲取一行
    print line; 
    getline line
    print line; 
}' test.txt 
# 打印ls命令的標(biāo)準(zhǔn)輸出,返回命令的執(zhí)行結(jié)果(0或非0),賦值給變量a

關(guān)于getline

  1. 當(dāng)getline左右沒有重定向符|或<時(shí),getline讀去當(dāng)前文件的第一行并將數(shù)據(jù)保存到變量中,如果沒有變量,則數(shù)據(jù)保存到$0中;
    由于awk在處理getline之前已經(jīng)讀入了一行,所以getline得到的返回結(jié)果是隔行的。

  2. 當(dāng)getline左右有重定向符|或<時(shí),getline作用于定向輸入文件,由于該文件是剛打開,awk并沒有讀入一行數(shù)據(jù),而getline讀入了一行數(shù)據(jù),那么getline返回的是該文件的第一行,而不是隔行。

  3. awk和getline是分別取數(shù)據(jù)文件中的行數(shù)據(jù),而且是awk首先從數(shù)據(jù)文件中取數(shù)據(jù),后getline取下一行數(shù)據(jù)。

getline的影響值

形式 影響值
getline $0,NF,NR,FNR
getline var var,NR,FNR
getline<file 0,1…$NF,NF
getline var<file var
cmd | getline $0,NF
cmd | getline var var

參考

awk

awk命令詳解

Unix awk使用手冊(cè)

awk的getline命令

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

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

  • Linux指令中文說明傳送入口 整理自Linux指令中文說明 文本和數(shù)據(jù)進(jìn)行處理的編程語(yǔ)言awk 是一種編程語(yǔ)言,...
    釋閑人閱讀 2,380評(píng)論 1 6
  • 轉(zhuǎn)載 原文的排版和內(nèi)容都更加友好,并且詳細(xì),我只是在這里貼出了一部分留作自己以后參考和學(xué)習(xí),如希望更詳細(xì)了解AWK...
    XKirk閱讀 3,365評(píng)論 2 25
  • awk命令 awk是一種編程語(yǔ)言,用于在linux/unix下對(duì)文本和數(shù)據(jù)進(jìn)行處理。數(shù)據(jù)可以來自標(biāo)準(zhǔn)輸入(stdi...
    Chris_Zheng閱讀 4,442評(píng)論 0 0
  • awk: grep,sed,awk grep:文本過濾 sed:文本編輯 awk:文本格式化工具; 1 什么是aw...
    木林森閱讀 1,906評(píng)論 0 16
  • 本文大部分內(nèi)容翻譯自我開始學(xué)習(xí)AWK時(shí)看到的一篇英文文章 AWK Tutorial ,覺得對(duì)AWK入門非常有幫助,...
    mylxsw閱讀 1,246評(píng)論 0 12

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