自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

提升效率必備!學(xué)習(xí) awk 命令,輕松搞定數(shù)據(jù)

開(kāi)發(fā)
AWK是一款功能強(qiáng)大的數(shù)據(jù)處理工具,它能夠高效地處理復(fù)雜的文本文件和數(shù)據(jù)集。

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

awk選項(xiàng)

awk 命令的使用方式如下:

awk options program file

awk 可以采用以下選項(xiàng):

  • -F:fs指定文件分隔符。
  • -f:文件指定包含 awk 腳本的文件。
  • -v:var=值聲明變量。

我們將了解如何使用awk處理文件和打印結(jié)果。

讀取AWK腳本

要定義awk腳本,請(qǐng)使用用單引號(hào)括起來(lái)的大括號(hào),如下所示:

awk '{print "Welcome to awk command tutorial "}'

如果您鍵入任何內(nèi)容,它將返回我們提供的相同歡迎字符串。如下圖所示:

要終止程序,請(qǐng)按Ctrl+D??雌饋?lái)很棘手,不要驚慌,最好的還沒(méi)有到來(lái)。

使用變量

使用awk,可以處理文本文件。Awk為找到的每個(gè)數(shù)據(jù)字段分配一些變量:

  • $0:是輸出整行的內(nèi)容。
  • $1:是輸出第一個(gè)字段。
  • $2:是輸出第二個(gè)字段。
  • $n:表示第n個(gè)字段。

在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文件使用它。

使用多個(gè)命令

要運(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 " $6
print t

awk預(yù)處理

如果您需要為結(jié)果創(chuàng)建標(biāo)題或表頭等。您可以使用BEGIN關(guān)鍵字來(lái)實(shí)現(xiàn)此目的。它在處理數(shù)據(jù)之前運(yùn)行:

awk 'BEGIN {print "this Title"} {print $0}' myfile

執(zhí)行上述代碼輸入如下圖的結(jié)果:

awk后處理

要在處理數(shù)據(jù)后運(yùn)行腳本,請(qǐng)使用END關(guān)鍵字:

awk 'BEGIN {print "this Title"} {print $0} END {print "this footer"}' myfile

執(zhí)行上述代碼輸出如下圖的結(jié)果:

這很有用,例如,您可以使用它來(lái)添加頁(yè)腳。讓我們將它們組合到一個(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并在末尾打印頁(yè)腳。

 awk -f myscript  /etc/passwd

內(nèi)置變量

我們看到數(shù)據(jù)字段變量$1,$2,$3等用于提取數(shù)據(jù)字段,我們還處理字段分隔符FS。

但這些并不是唯一的變量,還有更多的內(nèi)置變量。

下面列出了一些內(nèi)置變量:

  • FIELDWIDTHS:指定字段寬度。
  • RS:指定記錄分隔符。
  • FS:指定字段分隔符。
  • OFS:輸出分隔符。
  • ORS:輸出分隔符。

默認(rèn)情況下,OFS變量是空格,你可以設(shè)置OFS變量來(lái)指定你需要的分隔符:

awk 'BEGIN {FS=":";OFS="---"} {print $1,$6,$7}' /etc/passwd

有時(shí),字段的分布沒(méi)有固定的分隔符。在這些情況下,F(xiàn)IELDWIDTHS 變量可以解決問(wèn)題。

假設(shè)我們有以下內(nèi)容:

1235.96521
927-8.3652
36257.8157
awk 'BEGIN{FIELDWIDTHS="3 4 3"}{print $1,$2,$3}' testfile

查看輸出。輸出字段為每行3個(gè),每個(gè)字段長(zhǎng)度都基于我們由FIELDWIDTH分配的字段。

更多的變量

還有一些其他變量可以幫助你獲取更多信息:

  • ARGC:獲取傳遞的參數(shù)數(shù)量。
  • ARGV:獲取命令行參數(shù)。
  • ENVIRON :shell環(huán)境變量及其對(duì)應(yīng)值的數(shù)組
  • FILENAME:awk處理的文件名。
  • NF :Fields正在處理的行數(shù)。
  • NR:檢索處理過(guò)的記錄總數(shù)。
  • FNR:被處理的記錄。

IGNORECASE:忽略字符的大小寫。

讓我們測(cè)試一下。

root@didiplus:~#  awk 'BEGIN{print ARGC,ARGV[1]}' myfile
2 myfile

ENVIRON變量檢索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/root

NF變量指定記錄中的最后一個(gè)字段,但不知道其位置:

awk 'BEGIN{FS=":"; OFS=":"} {print $1,$NF}' /etc/passwd

如果像這樣鍵入NF變量,則可以將其用作數(shù)據(jù)字段變量:$NF。

讓我們看一下這兩個(gè)例子來(lái)了解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ù)字開(kāi)頭。您可以像在shell腳本中一樣分配變量,如下所示:

awk '
BEGIN{
test="Welcome to LikeGeeks website"
print test
}'

執(zhí)行上述命令后,輸出如下結(jié)果:

結(jié)構(gòu)化命令

1.if循環(huán)

awk腳本語(yǔ)言支持if條件語(yǔ)句。testfile包含以下內(nèi)容:

10
15
6
33
45
root@didiplus:~# awk '{if ($1 > 30) print $1}' testfile
33
45

如果要運(yùn)行多個(gè)語(yǔ)句,則應(yīng)使用大括號(hào):

root@didiplus:~# awk '{
if ($1 > 30)
{
x = $1 * 3
print x
}
}' testfile
99

您可以使用如下所示的else語(yǔ)句:

root@didiplus:~# awk '{
if ($1 > 30)
{
x = $1 * 3
print x
} else
{
x = $1 / 2
print x
}}' testfile
5
7.5
3
99
135

或者在同一行中鍵入它們,并用分號(hào)分隔 if 語(yǔ)句,如下所示:

root@didiplus:~# awk '{ if ($1>20) print $1*2;else print $1/2}' testfile
5
7.5
3
66
90

2.while循環(huán)

您可以使用while循環(huán)遍歷具有條件的數(shù)據(jù)。

awk '{
sum = 0
i = 1
while (i < 5)
{
sum += $i
i++
}

average = sum / 3
print "Average:",average
}' testfile
  • $i:是取到testfile的每一列的值
  • while循環(huán)運(yùn)行,每次它都會(huì)向sum變量加$i的值,直到 i 變量變?yōu)?4。

您可以使用break命令退出循環(huán),如下所示:

awk '{
sum = 0
i = 1
while (i < 5)
{
sum += $i
if (i == 3) 
break
i++
}
average = sum / 3
print "Average:",average
}' testfile

結(jié)果還是和上面的輸出的一樣。

3.for循環(huán)

awk腳本語(yǔ)言支持for循環(huán):

awk '{
total = 0
for (var = 1; var < 5; var++)
{
total += $var
}
avg = total / 3
print "Average:",avg

}' testfile

格式化打印

awk中的printf命令允許你使用格式說(shuō)明符打印出格式化的輸出。

格式說(shuō)明符如下所示:

%[modifier]control-letter

下面列出了可用于printf的格式說(shuō)明符:

  • c:以字符串的形式打印數(shù)值輸出。
  • d:打印一個(gè)整數(shù)值。
  • e:打印科學(xué)數(shù)字。
  • f:打印浮點(diǎn)數(shù)。
  • o:打印一個(gè)八進(jìn)制值。
  • s:打印文本字符串。

這里我們使用printf來(lái)格式化輸出:

awk 'BEGIN{
x = 100 * 100
printf "The result is: %e\n", x
}'

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

Awk提供了幾個(gè)內(nèi)置函數(shù),例如:

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

如果你喜歡數(shù)學(xué),你可以在awk腳本中使用這些函數(shù):

  • sin(x)
  • cos(x)
  • sqrt(x)
  • exp(x)
  • log(x)
  • rand()

而且它們可以正常使用:

root@didiplus:~# awk 'BEGIN{x=exp(5); print x}'
148.413

2.字符串函數(shù)

有很多字符串函數(shù),你可以查看列表,但我們將其中一個(gè)作為示例來(lái)研究,其余的都是一樣的:

root@didiplus:~# awk 'BEGIN{x = "likegeeks"; print toupper(x)}'
LIKEGEEKS

函數(shù) toupper將傳遞的字符串的字符大小寫轉(zhuǎn)換為大寫。

3.用戶自定義函數(shù)

您可以定義您的函數(shù)并像這樣使用它們:

awk '
function myfunc()
{
printf "The user %s has home path at %s\n", $1,$6
}

BEGIN{FS=":"}
{
myfunc()
}' /etc/passwd

在這里,我們定義了一個(gè)名為myprint的函數(shù),然后在腳本中使用它通過(guò)printf函數(shù)打印輸出。

總結(jié)

AWK是一款功能強(qiáng)大的數(shù)據(jù)處理工具,它能夠高效地處理復(fù)雜的文本文件和數(shù)據(jù)集。無(wú)論你是需要處理日志、統(tǒng)計(jì)數(shù)據(jù),還是生成格式化的報(bào)表,AWK都能輕松勝任。通過(guò)熟練掌握AWK命令,你可以極大提升工作效率,輕松應(yīng)對(duì)各種數(shù)據(jù)處理任務(wù)。

責(zé)任編輯:趙寧寧 來(lái)源: 攻城獅成長(zhǎng)日記
相關(guān)推薦

2023-11-13 08:16:08

MySQL數(shù)據(jù)數(shù)據(jù)庫(kù)

2019-07-09 08:23:07

數(shù)據(jù)安全旅游網(wǎng)絡(luò)安全

2024-12-27 08:39:10

2016-04-29 10:02:39

2024-08-29 08:58:30

JPA編寫數(shù)據(jù)操

2024-07-17 08:29:20

2016-09-09 01:07:06

數(shù)據(jù)中心容量規(guī)劃數(shù)據(jù)中心

2021-04-29 08:13:49

Mac 工具軟件

2021-06-21 11:05:30

CSS前端代碼

2025-03-11 14:09:04

2025-03-11 08:34:22

2021-04-07 13:43:07

PythonDash數(shù)據(jù)庫(kù)

2022-09-29 10:51:18

ShellLinux命令審計(jì)

2016-04-13 11:31:32

數(shù)據(jù)分析數(shù)據(jù)獲取大數(shù)據(jù)應(yīng)用

2021-06-10 09:53:04

數(shù)據(jù)統(tǒng)計(jì)統(tǒng)計(jì)分析數(shù)據(jù)

2021-08-31 07:02:34

數(shù)據(jù)響應(yīng)Vue偵測(cè)數(shù)據(jù)變化

2010-05-27 15:50:39

2020-10-22 15:05:43

開(kāi)發(fā)者技能工具

2024-01-15 00:08:51

插件Code效率
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)