在日常的工作中,無論是數(shù)據(jù)處理、日志分析,還是格式化輸出,AWK命令都是不可或缺的利器。AWK是一種強(qiáng)大的文本處理工具,能讓你輕松處理復(fù)雜的數(shù)據(jù),提升工作效率。本文將為你介紹AWK的基本功能及一些實(shí)用場(chǎng)景,幫助你快速掌握這門工具。

awk 命令的使用方式如下:
awk options program fileawk 可以采用以下選項(xiàng):
我們將了解如何使用awk處理文件和打印結(jié)果。
要定義awk腳本,請(qǐng)使用用單引號(hào)括起來的大括號(hào),如下所示:
awk '{print "Welcome to awk command tutorial "}'如果您鍵入任何內(nèi)容,它將返回我們提供的相同歡迎字符串。如下圖所示:

要終止程序,請(qǐng)按Ctrl+D。看起來很棘手,不要驚慌,最好的還沒有到來。
使用awk,可以處理文本文件。Awk為找到的每個(gè)數(shù)據(jù)字段分配一些變量:
在awk中,空格或制表符等空白字符是字段之間的默認(rèn)分隔符??纯催@個(gè)例子,看看awk是如何處理它的:

上面的示例打印了每行的第一個(gè)單詞。
有時(shí)某些文件中的分隔符不是空格或tab,而是其他內(nèi)容。您可以使用–F選項(xiàng)指定它:
awk -F ':' '{print $1}' /etc/passwd
此命令將打印passwd文件中的第一個(gè)字段。我們使用冒號(hào)作為分隔符,因?yàn)閜asswd文件使用它。
要運(yùn)行多個(gè)命令,請(qǐng)用分號(hào)分隔它們,如下所示:
root@didiplus:~# echo "Hello Tom" | awk '{$2="Adam"; print $0}'Hello Adam第一個(gè)命令使 $2字段等于Adam。第二個(gè)命令打印整行。
您可以在文件中鍵入awk腳本,并使用 -f 選項(xiàng)指定該文件。我們的文件包含以下腳本:
{print $1 " home at " $6} awk -F: -f testfile /etc/passwd
在這里,我們從 /etc/passwd打印用戶名和他的主路徑,當(dāng)然分隔符是用大寫的-F指定的,即冒號(hào)。
你可以像這樣awk腳本文件:
{text = $1 " home at " $6print t如果您需要為結(jié)果創(chuàng)建標(biāo)題或表頭等。您可以使用BEGIN關(guān)鍵字來實(shí)現(xiàn)此目的。它在處理數(shù)據(jù)之前運(yùn)行:
awk 'BEGIN {print "this Title"} {print $0}' myfile執(zhí)行上述代碼輸入如下圖的結(jié)果:

要在處理數(shù)據(jù)后運(yùn)行腳本,請(qǐng)使用END關(guān)鍵字:
awk 'BEGIN {print "this Title"} {print $0} END {print "this footer"}' myfile執(zhí)行上述代碼輸出如下圖的結(jié)果:

這很有用,例如,您可以使用它來添加頁腳。讓我們將它們組合到一個(gè)腳本文件中:
BEGIN {print "Users and thier corresponding home"print " UserName /t HomePath"print "___________ /t __________"FS=":"}{print $1 " /t " $6}END {print "The end"首先,使用BEGIN關(guān)鍵字創(chuàng)建頂部部分。然后我們定義FS并在末尾打印頁腳。
awk -f myscript /etc/passwd
我們看到數(shù)據(jù)字段變量$1,$2,$3等用于提取數(shù)據(jù)字段,我們還處理字段分隔符FS。
但這些并不是唯一的變量,還有更多的內(nèi)置變量。
下面列出了一些內(nèi)置變量:
默認(rèn)情況下,OFS變量是空格,你可以設(shè)置OFS變量來指定你需要的分隔符:
awk 'BEGIN {FS=":";OFS="---"} {print $1,$6,$7}' /etc/passwd
有時(shí),字段的分布沒有固定的分隔符。在這些情況下,F(xiàn)IELDWIDTHS 變量可以解決問題。
假設(shè)我們有以下內(nèi)容:
1235.96521927-8.365236257.8157awk 'BEGIN{FIELDWIDTHS="3 4 3"}{print $1,$2,$3}' testfile查看輸出。輸出字段為每行3個(gè),每個(gè)字段長度都基于我們由FIELDWIDTH分配的字段。

還有一些其他變量可以幫助你獲取更多信息:
IGNORECASE:忽略字符的大小寫。
讓我們測(cè)試一下。
root@didiplus:~# awk 'BEGIN{print ARGC,ARGV[1]}' myfile2 myfileENVIRON變量檢索shell環(huán)境變量,如下所示:
root@didiplus:~# awk 'BEGIN {print ENVIRON["PATH"]}'/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin您可以使用不帶ENVIRON變量的 bash 變量,如下所示:
root@didiplus:~# echo | awk -v home=$HOME '{print "My home is" home}'My home is/rootNF變量指定記錄中的最后一個(gè)字段,但不知道其位置:
awk 'BEGIN{FS=":"; OFS=":"} {print $1,$NF}' /etc/passwd
如果像這樣鍵入NF變量,則可以將其用作數(shù)據(jù)字段變量:$NF。
讓我們看一下這兩個(gè)例子來了解FNR和NR變量之間的區(qū)別:
awk 'BEGIN{FS=","}{print $1,"FNR="FNR}' myfile myfile
在此示例中,awk命令定義兩個(gè)輸入文件。相同的文件,但處理了兩次。輸出是第一個(gè)字段值和FNR變量。
現(xiàn)在,檢查NR變量并查看差異:
$ awk 'BEGIN {FS=","}{print $1,"FNR="FNR,"NR="NR}END{print "Total",NR,"processed lines"}' myfile myfile
當(dāng)涉及到第二個(gè)文件時(shí),F(xiàn)NR變量變?yōu)?,但NR變量保留其值。
變量名稱可以是任何內(nèi)容,但不能以數(shù)字開頭。您可以像在shell腳本中一樣分配變量,如下所示:
awk 'BEGIN{test="Welcome to LikeGeeks website"print test}'執(zhí)行上述命令后,輸出如下結(jié)果:

awk腳本語言支持if條件語句。testfile包含以下內(nèi)容:
101563345root@didiplus:~# awk '{if ($1 > 30) print $1}' testfile3345如果要運(yùn)行多個(gè)語句,則應(yīng)使用大括號(hào):
root@didiplus:~# awk '{if ($1 > 30){x = $1 * 3print x}}' testfile99您可以使用如下所示的else語句:
root@didiplus:~# awk '{if ($1 > 30){x = $1 * 3print x} else{x = $1 / 2print x}}' testfile57.5399135或者在同一行中鍵入它們,并用分號(hào)分隔 if 語句,如下所示:
root@didiplus:~# awk '{ if ($1>20) print $1*2;else print $1/2}' testfile57.536690您可以使用while循環(huán)遍歷具有條件的數(shù)據(jù)。
awk '{sum = 0i = 1while (i < 5){sum += $ii++}average = sum / 3print "Average:",average}' testfile
您可以使用break命令退出循環(huán),如下所示:
awk '{sum = 0i = 1while (i < 5){sum += $iif (i == 3) breaki++}average = sum / 3print "Average:",average}' testfile結(jié)果還是和上面的輸出的一樣。
awk腳本語言支持for循環(huán):
awk '{total = 0for (var = 1; var < 5; var++){total += $var}avg = total / 3print "Average:",avg}' testfileawk中的printf命令允許你使用格式說明符打印出格式化的輸出。
格式說明符如下所示:
%[modifier]control-letter下面列出了可用于printf的格式說明符:
這里我們使用printf來格式化輸出:
awk 'BEGIN{x = 100 * 100printf "The result is: %e/n", x}'
Awk提供了幾個(gè)內(nèi)置函數(shù),例如:
如果你喜歡數(shù)學(xué),你可以在awk腳本中使用這些函數(shù):
而且它們可以正常使用:
root@didiplus:~# awk 'BEGIN{x=exp(5); print x}'148.413有很多字符串函數(shù),你可以查看列表,但我們將其中一個(gè)作為示例來研究,其余的都是一樣的:
root@didiplus:~# awk 'BEGIN{x = "likegeeks"; print toupper(x)}'LIKEGEEKS函數(shù) toupper將傳遞的字符串的字符大小寫轉(zhuǎn)換為大寫。
您可以定義您的函數(shù)并像這樣使用它們:
awk 'function myfunc(){printf "The user %s has home path at %s/n", $1,$6}BEGIN{FS=":"}{myfunc()}' /etc/passwd在這里,我們定義了一個(gè)名為myprint的函數(shù),然后在腳本中使用它通過printf函數(shù)打印輸出。

AWK是一款功能強(qiáng)大的數(shù)據(jù)處理工具,它能夠高效地處理復(fù)雜的文本文件和數(shù)據(jù)集。無論你是需要處理日志、統(tǒng)計(jì)數(shù)據(jù),還是生成格式化的報(bào)表,AWK都能輕松勝任。通過熟練掌握AWK命令,你可以極大提升工作效率,輕松應(yīng)對(duì)各種數(shù)據(jù)處理任務(wù)。
本文鏈接:http://m.www897cc.com/showinfo-26-112708-0.html提升效率必備!學(xué)習(xí) awk 命令,輕松搞定數(shù)據(jù)
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com
下一篇: 將目標(biāo)檢測(cè)模型導(dǎo)出到C++|RT-DETR、YOLO-NAS、YOLOv10、YOLOv9、YOLOv8