日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

提升效率必備!學習 awk 命令,輕松搞定數據

來源: 責編: 時間:2024-09-10 09:45:05 113觀看
導讀在日常的工作中,無論是數據處理、日志分析,還是格式化輸出,AWK命令都是不可或缺的利器。AWK是一種強大的文本處理工具,能讓你輕松處理復雜的數據,提升工作效率。本文將為你介紹AWK的基本功能及一些實用場景,幫助你快速掌握

在日常的工作中,無論是數據處理、日志分析,還是格式化輸出,AWK命令都是不可或缺的利器。AWK是一種強大的文本處理工具,能讓你輕松處理復雜的數據,提升工作效率。本文將為你介紹AWK的基本功能及一些實用場景,幫助你快速掌握這門工具。L7P28資訊網——每日最新資訊28at.com

L7P28資訊網——每日最新資訊28at.com

awk選項

awk 命令的使用方式如下:L7P28資訊網——每日最新資訊28at.com

awk options program file

awk 可以采用以下選項:L7P28資訊網——每日最新資訊28at.com

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

我們將了解如何使用awk處理文件和打印結果。L7P28資訊網——每日最新資訊28at.com

讀取AWK腳本

要定義awk腳本,請使用用單引號括起來的大括號,如下所示:L7P28資訊網——每日最新資訊28at.com

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

如果您鍵入任何內容,它將返回我們提供的相同歡迎字符串。如下圖所示:L7P28資訊網——每日最新資訊28at.com

L7P28資訊網——每日最新資訊28at.com

要終止程序,請按Ctrl+D。看起來很棘手,不要驚慌,最好的還沒有到來。L7P28資訊網——每日最新資訊28at.com

使用變量

使用awk,可以處理文本文件。Awk為找到的每個數據字段分配一些變量:L7P28資訊網——每日最新資訊28at.com

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

在awk中,空格或制表符等空白字符是字段之間的默認分隔符。看看這個例子,看看awk是如何處理它的:L7P28資訊網——每日最新資訊28at.com

L7P28資訊網——每日最新資訊28at.com

上面的示例打印了每行的第一個單詞。L7P28資訊網——每日最新資訊28at.com

有時某些文件中的分隔符不是空格或tab,而是其他內容。您可以使用–F選項指定它:L7P28資訊網——每日最新資訊28at.com

awk -F ':' '{print $1}' /etc/passwd

L7P28資訊網——每日最新資訊28at.com

此命令將打印passwd文件中的第一個字段。我們使用冒號作為分隔符,因為passwd文件使用它。L7P28資訊網——每日最新資訊28at.com

使用多個命令

要運行多個命令,請用分號分隔它們,如下所示:L7P28資訊網——每日最新資訊28at.com

root@didiplus:~# echo "Hello Tom" | awk '{$2="Adam"; print $0}'Hello Adam

第一個命令使 $2字段等于Adam。第二個命令打印整行。L7P28資訊網——每日最新資訊28at.com

L7P28資訊網——每日最新資訊28at.com

從文件中讀取腳本

您可以在文件中鍵入awk腳本,并使用 -f 選項指定該文件。我們的文件包含以下腳本:L7P28資訊網——每日最新資訊28at.com

{print $1 " home at " $6}
 awk -F: -f testfile /etc/passwd

L7P28資訊網——每日最新資訊28at.com

在這里,我們從 /etc/passwd打印用戶名和他的主路徑,當然分隔符是用大寫的-F指定的,即冒號。L7P28資訊網——每日最新資訊28at.com

你可以像這樣awk腳本文件:L7P28資訊網——每日最新資訊28at.com

{text = $1 " home at " $6print t

awk預處理

如果您需要為結果創建標題或表頭等。您可以使用BEGIN關鍵字來實現此目的。它在處理數據之前運行:L7P28資訊網——每日最新資訊28at.com

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

執行上述代碼輸入如下圖的結果:L7P28資訊網——每日最新資訊28at.com

L7P28資訊網——每日最新資訊28at.com

awk后處理

要在處理數據后運行腳本,請使用END關鍵字:L7P28資訊網——每日最新資訊28at.com

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

執行上述代碼輸出如下圖的結果:L7P28資訊網——每日最新資訊28at.com

L7P28資訊網——每日最新資訊28at.com

這很有用,例如,您可以使用它來添加頁腳。讓我們將它們組合到一個腳本文件中:L7P28資訊網——每日最新資訊28at.com

BEGIN {print "Users and thier corresponding home"print " UserName /t HomePath"print "___________ /t __________"FS=":"}{print $1 "  /t  " $6}END {print "The end"

首先,使用BEGIN關鍵字創建頂部部分。然后我們定義FS并在末尾打印頁腳。L7P28資訊網——每日最新資訊28at.com

 awk -f myscript  /etc/passwd

L7P28資訊網——每日最新資訊28at.com

內置變量

我們看到數據字段變量$1,$2,$3等用于提取數據字段,我們還處理字段分隔符FS。L7P28資訊網——每日最新資訊28at.com

但這些并不是唯一的變量,還有更多的內置變量。L7P28資訊網——每日最新資訊28at.com

下面列出了一些內置變量:L7P28資訊網——每日最新資訊28at.com

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

默認情況下,OFS變量是空格,你可以設置OFS變量來指定你需要的分隔符:L7P28資訊網——每日最新資訊28at.com

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

L7P28資訊網——每日最新資訊28at.com

有時,字段的分布沒有固定的分隔符。在這些情況下,FIELDWIDTHS 變量可以解決問題。L7P28資訊網——每日最新資訊28at.com

假設我們有以下內容:L7P28資訊網——每日最新資訊28at.com

1235.96521927-8.365236257.8157
awk 'BEGIN{FIELDWIDTHS="3 4 3"}{print $1,$2,$3}' testfile

查看輸出。輸出字段為每行3個,每個字段長度都基于我們由FIELDWIDTH分配的字段。L7P28資訊網——每日最新資訊28at.com

L7P28資訊網——每日最新資訊28at.com

更多的變量

還有一些其他變量可以幫助你獲取更多信息:L7P28資訊網——每日最新資訊28at.com

  • ARGC:獲取傳遞的參數數量。
  • ARGV:獲取命令行參數。
  • ENVIRON :shell環境變量及其對應值的數組
  • FILENAME:awk處理的文件名。
  • NF :Fields正在處理的行數。
  • NR:檢索處理過的記錄總數。
  • FNR:被處理的記錄。

IGNORECASE:忽略字符的大小寫。L7P28資訊網——每日最新資訊28at.com

讓我們測試一下。L7P28資訊網——每日最新資訊28at.com

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

ENVIRON變量檢索shell環境變量,如下所示:L7P28資訊網——每日最新資訊28at.com

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 變量,如下所示:L7P28資訊網——每日最新資訊28at.com

root@didiplus:~# echo | awk -v home=$HOME '{print "My home is" home}'My home is/root

NF變量指定記錄中的最后一個字段,但不知道其位置:L7P28資訊網——每日最新資訊28at.com

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

L7P28資訊網——每日最新資訊28at.com

如果像這樣鍵入NF變量,則可以將其用作數據字段變量:$NF。L7P28資訊網——每日最新資訊28at.com

L7P28資訊網——每日最新資訊28at.com

讓我們看一下這兩個例子來了解FNR和NR變量之間的區別:L7P28資訊網——每日最新資訊28at.com

awk 'BEGIN{FS=","}{print $1,"FNR="FNR}' myfile myfile

L7P28資訊網——每日最新資訊28at.com

在此示例中,awk命令定義兩個輸入文件。相同的文件,但處理了兩次。輸出是第一個字段值和FNR變量。L7P28資訊網——每日最新資訊28at.com

現在,檢查NR變量并查看差異:L7P28資訊網——每日最新資訊28at.com

$ awk 'BEGIN {FS=","}{print $1,"FNR="FNR,"NR="NR}END{print "Total",NR,"processed lines"}' myfile myfile

L7P28資訊網——每日最新資訊28at.com

當涉及到第二個文件時,FNR變量變為1,但NR變量保留其值。L7P28資訊網——每日最新資訊28at.com

L7P28資訊網——每日最新資訊28at.com

用戶自定義變量

變量名稱可以是任何內容,但不能以數字開頭。您可以像在shell腳本中一樣分配變量,如下所示:L7P28資訊網——每日最新資訊28at.com

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

執行上述命令后,輸出如下結果:L7P28資訊網——每日最新資訊28at.com

L7P28資訊網——每日最新資訊28at.com

結構化命令

1.if循環

awk腳本語言支持if條件語句。testfile包含以下內容:L7P28資訊網——每日最新資訊28at.com

101563345
root@didiplus:~# awk '{if ($1 > 30) print $1}' testfile3345

如果要運行多個語句,則應使用大括號:L7P28資訊網——每日最新資訊28at.com

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

您可以使用如下所示的else語句:L7P28資訊網——每日最新資訊28at.com

root@didiplus:~# awk '{if ($1 > 30){x = $1 * 3print x} else{x = $1 / 2print x}}' testfile57.5399135

或者在同一行中鍵入它們,并用分號分隔 if 語句,如下所示:L7P28資訊網——每日最新資訊28at.com

root@didiplus:~# awk '{ if ($1>20) print $1*2;else print $1/2}' testfile57.536690

2.while循環

您可以使用while循環遍歷具有條件的數據。L7P28資訊網——每日最新資訊28at.com

awk '{sum = 0i = 1while (i < 5){sum += $ii++}average = sum / 3print "Average:",average}' testfile
  • $i:是取到testfile的每一列的值
  • while循環運行,每次它都會向sum變量加$i的值,直到 i 變量變為 4。

L7P28資訊網——每日最新資訊28at.com

您可以使用break命令退出循環,如下所示:L7P28資訊網——每日最新資訊28at.com

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

結果還是和上面的輸出的一樣。L7P28資訊網——每日最新資訊28at.com

L7P28資訊網——每日最新資訊28at.com

3.for循環

awk腳本語言支持for循環:L7P28資訊網——每日最新資訊28at.com

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

格式化打印

awk中的printf命令允許你使用格式說明符打印出格式化的輸出。L7P28資訊網——每日最新資訊28at.com

格式說明符如下所示:L7P28資訊網——每日最新資訊28at.com

%[modifier]control-letter

下面列出了可用于printf的格式說明符:L7P28資訊網——每日最新資訊28at.com

  • c:以字符串的形式打印數值輸出。
  • d:打印一個整數值。
  • e:打印科學數字。
  • f:打印浮點數。
  • o:打印一個八進制值。
  • s:打印文本字符串。

這里我們使用printf來格式化輸出:L7P28資訊網——每日最新資訊28at.com

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

L7P28資訊網——每日最新資訊28at.com

內置函數

Awk提供了幾個內置函數,例如:L7P28資訊網——每日最新資訊28at.com

1.數學函數

如果你喜歡數學,你可以在awk腳本中使用這些函數:L7P28資訊網——每日最新資訊28at.com

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

而且它們可以正常使用:L7P28資訊網——每日最新資訊28at.com

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

2.字符串函數

有很多字符串函數,你可以查看列表,但我們將其中一個作為示例來研究,其余的都是一樣的:L7P28資訊網——每日最新資訊28at.com

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

函數 toupper將傳遞的字符串的字符大小寫轉換為大寫。L7P28資訊網——每日最新資訊28at.com

L7P28資訊網——每日最新資訊28at.com

3.用戶自定義函數

您可以定義您的函數并像這樣使用它們:L7P28資訊網——每日最新資訊28at.com

awk 'function myfunc(){printf "The user %s has home path at %s/n", $1,$6}BEGIN{FS=":"}{myfunc()}' /etc/passwd

在這里,我們定義了一個名為myprint的函數,然后在腳本中使用它通過printf函數打印輸出。L7P28資訊網——每日最新資訊28at.com

L7P28資訊網——每日最新資訊28at.com

總結

AWK是一款功能強大的數據處理工具,它能夠高效地處理復雜的文本文件和數據集。無論你是需要處理日志、統計數據,還是生成格式化的報表,AWK都能輕松勝任。通過熟練掌握AWK命令,你可以極大提升工作效率,輕松應對各種數據處理任務。L7P28資訊網——每日最新資訊28at.com

L7P28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-112708-0.html提升效率必備!學習 awk 命令,輕松搞定數據

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: WPF 入門知識:XAML 詳解

下一篇: 將目標檢測模型導出到C++|RT-DETR、YOLO-NAS、YOLOv10、YOLOv9、YOLOv8

標簽:
  • 熱門焦點
Top 主站蜘蛛池模板: 铅山县| 灌云县| 焉耆| 中江县| 互助| 道真| 彭阳县| 栾城县| 江油市| 兴化市| 三河市| 大冶市| 开鲁县| 武陟县| 大荔县| 抚顺县| 湘潭市| 长宁县| 乐东| 屏东市| 阜康市| 抚顺县| 东丰县| 东乌珠穆沁旗| 金塔县| 黄浦区| 云和县| 茌平县| 渑池县| 福建省| 梓潼县| 随州市| 垦利县| 齐齐哈尔市| 阿拉善右旗| 托里县| 邵武市| 若尔盖县| 辽中县| 新兴县| 手机|