1. 程式人生 > >Linux——awk命令解析

Linux——awk命令解析

awk簡介

awk其名稱得自於它的創始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首個字母。實際上 AWK 的確擁有自己的語言: AWK 程式設計語言 , 三位建立者已將它正式定義為“樣式掃描和處理語言”。它允許您建立簡短的程式,這些程式讀取輸入檔案、為資料排序、處理資料、對輸入執行計算以及生成報表,還有無數其他的功能。

awk 是一種很棒的語言,它適合文字處理和報表生成,其語法較為常見,借鑑了某些語言的一些精華,如 語言等。在 linux 系統日常處理工作中,發揮很重要的作用,掌握了 awk將會使你的工作變的高大上。 awk 是三劍客的老大,利劍出鞘,必會不同凡響。

使用方法

1 awk  '{pattern + action}'  {filenames}

儘管操作可能會很複雜,但語法總是這樣,其中 pattern 表示 AWK 在資料中查詢的內容,而 action 是在找到匹配內容時所執行的一系列命令。花括號({})不需要在程式中始終出現,但它們用於根據特定的模式對一系列指令進行分組。 pattern就是要表示的正則表示式,用斜槓括起來。

awk語言的最基本功能是在檔案或者字串中基於指定規則瀏覽和抽取資訊,awk抽取資訊後,才能進行其他文字操作。完整的awk指令碼通常用來格式化文字檔案中的資訊。

通常,awk是以檔案的一行為處理單位的。awk每接收檔案的一行,然後執行相應的命令,來處理文字。

awk 的原理

通過一個簡短的命令,我們來了解其工作原理。 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 [[email protected] scripts] # awk '{print $0}' /etc/passwd root:x:0:0:root: /root : /bin/bash bin:x:1:1:bin: /bin : /sbin/nologin .....................................................   [[email protected] scripts] # echo hhh|awk '{print "hello,world"}' hello,world   [[email protected] scripts] # awk '{print "hiya"}' /etc/passwd hiya hiya hiya hiya ...............................................

你將會見到/etc/passwd 檔案的內容出現在眼前。現在,解釋 awk 做了些什麼。呼叫 awk時,我們指定/etc/passwd 作為輸入檔案。執行 awk 時,它依次對/etc/passwd 中的每一行執行 print 命令。

所有輸出都發送到 stdout,所得到的結果與執行 cat /etc/passwd 完全相同。
現在,解釋{ print }程式碼塊。在 awk 中,花括號用於將幾塊程式碼組合到一起,這一點類似於 語言。在程式碼塊中只有一條 print 命令。在 awk 中,如果只出現 print 命令,那麼將列印當前行的全部內容。
再次說明, awk 對輸入檔案中的每一行都執行這個指令碼。


1 2 3 4 awk  -F ":"  '{ print $1 }'  /etc/passwd awk  -F ":"  '{ print $1 $3 }'  /etc/passwd awk  -F ":"  '{ print $1 " " $3 }'  /etc/passwd awk  -F ":"  '{ print "username: " $1 "\t\tuid:" $3" }'  /etc/passwd

-F引數:指定分隔符,可指定一個或多個

print 後面做字串的拼接

下面通過幾例項來了解下awk的工作原理:

例項一:只檢視test.txt檔案(100行)內第20到第30行的內容(企業面試)

 

1 2 3 4 5 6 7 8 9 10 11 12 [[email protected] scripts] # awk '{if(NR>=20 && NR<=30) print $1}' test.txt    20 21 22 23 24 25 26 27 28 29 30

 

例項二:已知test.txt檔案內容為:

1 2 [[email protected] scripts] # cat test.txt I am Poe,my qq is 33794712

請從該檔案中過濾出'Poe'字串與33794712,最後輸出的結果為:Poe 33794712

1 2 [[email protected] scripts] # awk -F '[ ,]+' '{print $3" "$7}' test.txt Poe 33794712

BEGIN 和 END 模組

通常,對於每個輸入行, awk 都會執行每個指令碼程式碼塊一次。然而,在許多程式設計情況中,可能需要在 awk 開始處理輸入檔案中的文字之前執行初始化程式碼。對於這種情況, awk 允許您定義一個 BEGIN 塊。

因為 awk 在開始處理輸入檔案之前會執行 BEGIN 塊,因此它是初始化 FS(欄位分隔符)變數、列印頁首或初始化其它在程式中以後會引用的全域性變數的極佳位置。
awk 還提供了另一個特殊塊,叫作 END 塊。 awk 在處理了輸入檔案中的所有行之後執行這個塊。通常, END 塊用於執行最終計算或列印應該出現在輸出流結尾的摘要資訊。

例項一:統計/etc/passwd的賬戶人數

1 2 3 4 [[email protected] scripts] # awk '{count++;print $0;} END{print "user count is ",count}' passwd root:x:0:0:root: /root : /bin/bash .............................................. user count is  27

count是自定義變數。之前的action{}裡都是隻有一個print,其實print只是一個語句,而action{}可以有多個語句,以;號隔開。這裡沒有初始化count,雖然預設是0,但是妥當的做法還是初始化為0:

1 2 3 4 5 [[email protected] scripts] # awk 'BEGIN {count=0;print "[start] user count is ",count} {count=count+1;print $0} END{print "[end] user count is ",count}' passwd [start] user count is  0 root:x:0:0:root: /root : /bin/bash ................................................................... [end] user count is  27

例項二:統計某個資料夾下的檔案佔用的位元組數

1 2 [[email protected] scripts] # ll |awk 'BEGIN {size=0;} {size=size+$5;} END{print "[end]size is ",size}' [end]size is  1489

如果以M為單位顯示:

1 2 [[email protected] scripts] # ll |awk 'BEGIN{size=0;} {size=size+$5;} END{print "[end]size is ",size/1024/1024,"M"}'    [end]size is  0.00142002 M

 

awk運算子

awk 賦值運算子:a+5;等價於: a=a+5;其他同類

1 2 [[email protected] scripts] # awk 'BEGIN{a=5;a+=5;print a}' 10

awk邏輯運算子:

1 2 [[email protected] scripts] # awk 'BEGIN{a=1;b=2;print (a>2&&b>1,a=1||b>1)}' 0 1

判斷表示式 a>2&&b>1為真還是為假,後面的表示式同理

awk正則運算子:

1 2 [[email protected] scripts] # awk 'BEGIN{a="100testaa";if(a~/100/) {print "ok"}}' ok
1 2 [[email protected] scripts] # echo|awk 'BEGIN{a="100testaaa"}a~/test/{print "ok"}' ok

關係運算符:

如: > < 可以作為字串比較,也可以用作數值比較,關鍵看運算元如果是字串就會轉換為字串比較。兩個都為數字 才轉為數值比較。字串比較:按照ascii碼順序比較

1 2 3 4 5 [[email protected] scripts] # awk 'BEGIN{a="11";if(a>=9){print "ok"}}' #無輸出 [[email protected] scripts] # awk 'BEGIN{a=11;if(a>=9){print "ok"}}'  ok [[email protected] scripts] # awk 'BEGIN{a;if(a>=b){print "ok"}}' ok

awk 算術運算子:

說明,所有用作算術運算子進行操作,運算元自動轉為數值,所有非數值都變為0

1 2 3 4 [[email protected] scripts] # awk 'BEGIN{a="b";print a++,++a}' 0 2 [[email protected] scripts] # awk 'BEGIN{a="20b4";print a++,++a}' 20 22

這裡的a++ , ++a與javascript語言一樣:a++是先賦值加++;++a是先++再賦值

三目運算子 ?:

1 2 3 4 [[email protected] scripts] # awk 'BEGIN{a="b";print a=="b"?"ok":"err"}' ok [[email protected] scripts] # awk 'BEGIN{a="b";print a=="c"?"ok":"err"}' err

 常用 awk 內建變數 

 注:內建變數很多,參閱相關資料

欄位分隔符 FS

FS="\t" 一個或多個 Tab 分隔

1 2 3 4 [[email protected] scripts] # cat tab.txt ww   CC        IDD [[email protected] scripts] # awk 'BEGIN{FS="\t+"}{print $1,$2,$3}' tab.txt ww   CC        IDD

FS="[[:space:]+]" 一個或多個空白空格,預設的 

1 2 3 4 5 6 [[email protected] scripts] # cat space.txt we are    studing  awk  now! [[email protected] scripts] # awk -F [[:space:]+] '{print $1,$2,$3,$4,$5}' space.txt we are   [[email protected] scripts] # awk -F [[:space:]+] '{print $1,$2}' space.txt we are

FS="[" ":]+" 以一個或多個空格或:分隔 

1 2 3 4 [[email protected] scripts] # cat hello.txt root:x:0:0:root: /root : /bin/bash [[email protected] scripts] # awk -F [" ":]+ '{print $1,$2,$3}' hello.txt root x 0

欄位數量 NF 

1 2 3 4 5 [[email protected] scripts] # cat hello.txt root:x:0:0:root: /root : /bin/bash bin:x:1:1:bin: /bin : /sbin/nologin :888 [[email protected] scripts] # awk -F ":" 'NF==8{print $0}' hello.txt bin:x:1:1:bin: /bin : /sbin/nologin :888

記錄數量 NR

1 2 [[email protected] scripts] # ifconfig eth0|awk -F [" ":]+ 'NR==2{print $4}'  ## NR==2也就是取第2行 192.168.17.129

RS 記錄分隔符變數
將 FS 設定成"\n"告訴 awk 每個欄位都佔據一行。通過將 RS 設定成"",還會告訴 awk每個地址記錄都由空白行分隔

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 [[email protected] scripts] # cat recode.txt Jimmy the Weasel 100 Pleasant Drive San Francisco,CA 123456   Big Tony 200 Incognito Ave. Suburbia,WA 64890 [[email protected] scripts] # cat awk.txt #!/bin/awk BEGIN {          FS= "\n"          RS= "" } {          print $1 "," $2 "," $3 } [[email protected] scripts] # awk -f awk.txt recode.txt Jimmy the Weasel,100 Pleasant Drive,San Francisco,CA 123456 Big Tony,200 Incognito Ave.,Suburbia,WA 64890

OFS 輸出欄位分隔符 

1 2 3 4 5 6 7 8 9 [[email protected] scripts] # cat hello.txt root:x:0:0:root: /root : /bin/bash bin:x:1:1:bin: /bin : /sbin/nologin :888 [[email protected] scripts] # awk 'BEGIN{FS=":"}{print $1","$2","$3}' hello.txt root,x,0 bin,x,1 [[email protected] scripts] # awk 'BEGIN{FS=":";OFS="#"}{print $1,$2,$3}' hello.txt root #x#0 bin #x#1

ORS 輸出記錄分隔符 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 [[email protected] scripts] # cat recode.txt Jimmy the Weasel 100 Pleasant Drive San Francisco,CA 123456   Big Tony 200 Incognito Ave. Suburbia,WA 64890 [[email protected] scripts] # cat awk.txt #!/bin/awk BEGIN {          FS= "\n"          RS= ""          ORS= "\n\n" } {          print $1 "," $2 "," $3 } [[email protected] scripts] # awk -f awk.txt recode.txt Jimmy the Weasel,100 Pleasant Drive,San Francisco,CA 123456   Big Tony,200 Incognito Ave.,Suburbia,WA 64890

 awk 正則 

 正則應用

規則表示式

awk '/REG/{action} ' file,/REG/為正則表示式,可以將$0 中,滿足條件的記錄送入到:action 進行處理

1 2 3 4 5 6 7 8 9 [[email protected] scripts] # awk '/root/{print $0}' passwd ##匹配所有包含root的行 root:x:0:0:root: /root : /bin/bash operator:x:11:0:operator: /root : /sbin/nologin   [[email protected] scripts] # awk -F: '$5~/root/{print $0}' passwd  ## 以分號作為分隔符,匹配第5個欄位是root的行 root:x:0:0:root: /root : /bin/bash   [[email protected] scripts] # ifconfig eth0|awk 'BEGIN{FS="[[:space:]:]+"} NR==2{print $4}' 192.168.17.129

布林表示式
awk '

相關推薦

Linux——awk命令解析

awk簡介 awk其名稱得自於它的創始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首個字母。實際上 AWK 的確擁有自己的語言: AWK 程式設計語言 , 三位建立者已將它正式定義為“樣式掃描和處理語言”。它允許您建立簡短的程式,這些程式讀取輸入檔

【轉】linux awk命令詳解

column 環境變量 最後一行 工作流程 初始 文本文件 for循環 其中 cti 簡介 awk是一個強大的文本分析工具,相對於grep的查找,sed的編輯,awk在其對數據分析並生成報告時,顯得尤為強大。簡單來說awk就是把文件逐行的讀入,以空格為默認分隔符將每行切

linux awk命令批量關閉系統開機自啟動服務

awk命令 批量關閉系統開機自啟動服務安裝好一個新的系統之後,為了簡化系統需要關閉一些開機自啟動的服務。蝸牛使用了grep和awk的基礎命令進行操作。作為服務器使用,新系統中需要啟動的服務大概就以下幾個crond network sshd rsyslog 查看運行級別3開機自啟動的服務chkconfig --

[轉載]linux awk命令詳解

基本 特定 收集 comm rip 解釋 文本 工作流程 復制代碼 簡介 awk是一個強大的文本分析工具,相對於grep的查找,sed的編輯,awk在其對數據分析並生成報告時,顯得尤為強大。簡單來說awk就是把文件逐行的讀入,以空格為默認分隔符將每行切片,切開的部分再進行各

linux awk命令詳解

列數 才會 遍歷數組 文本文件 信息 shell腳本 == game 入門 簡介 awk是一個強大的文本分析工具,相對於grep的查找,sed的編輯,awk在其對數據分析並生成報告時,顯得尤為強大。簡單來說awk就是把文件逐行的讀入,以空格為默認分隔符將每行切片,切開的部分

Linux awk命令

awk awk是一種處理文本文件的語言,是一個強大的文本分析工具,awk是三位創始人的首字母的縮寫。 語法: awk [選項參數] ‘script’ var=value file(s)或 awk [選項參數] -f scriptfile var=value file(s) 選

[轉]linux awk命令詳解

分享 相同 list 等於 connected lis gin 顯示 大於等於 awk是行處理器: 相比較屏幕處理的優點,在處理龐大文件時不會出現內存溢出或是處理緩慢的問題,通常用來格式化文本信息 awk處理過程: 依次對每一行進行處理,然後輸出 awk命令形式:

Linux awk命令(一)基礎

awk 是一種程式語言,用於在linux/unix下對文字和資料進行處理,它能提供一個類程式設計環境來修改和組織檔案中的資料。它比sed功能更為強大,可以看看sed的使用: Linux sed命令(一)基礎 Linux sed命令(二)進階 awk分別代表其作者姓氏的第一個字母,它

Linux常用命令解析(圖解ls)

Linux常用命令解析(圖解ls) (作者:Baron_wu) ls :顯示當前目錄下的檔案 Ls -a:顯示當前目錄下的所有檔案(包括隱藏檔案) Ls -l:以單獨一列顯示內容列表(列出許可權,所有者及其他資訊) Ls -ls:按檔案大小排序檔案內容 Ls -lar:以相反

Linux shell命令解析器(二),命令

環境: Ubuntu14-4   核心 4.4.0-135 vim編輯器 7.4  gcc  4.8.4  1.1 知識點 Shell 的基本概念 檔案相關函式,記憶體相關函式 &nb

linux awk命令深入淺出的解釋

本文轉自:https://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858470.html 簡介 awk是一個強大的文字分析工具,相對於grep的查詢,sed的編輯,awk在其對資料分析並生成報告時,顯得尤為強大。簡單來說awk就是把

Linux AWK 命令介紹

Awk是一種便於使用且表達能力強的程式設計語言,可應用於各種計算和資料處理任務,每個Awk命令的格式都相同,由以下幾個部分組成: pattern { action } 舉例子: 假設你有一個名為 emp.data 的檔案,其中包含員工的姓名、薪資(美元/小時)以及小時數

linux ping 命令解析

不管在windows平臺,還是在linux平臺,ping都是非常常用的網路命令;ping命令通過ICMP(Internet控制訊息協議)工作;ping可以用來測試本機與目標主機是否聯通、聯通速度如何、穩定性如何。  一 、ping 用法   ping命令執行在命令提示符終端,用法為:“ping 引數 目標

Linux shell命令解析器(一),bash終端

環境: Ubuntu14-4   核心 4.4.0-135 vim編輯器 7.4  gcc  4.8.4  1.1 知識點 Shell 的基本概念 程序控制相關的系統呼叫的使用(如 fork,exec函式族) 整理框架: 1.命令直譯器首先是一個死迴圈。 2.

linux awk 命令筆記

推薦awk學習系列 https://www.ibm.com/developerworks/cn/linux/shell/awk/awk-1/index.html https://www.ibm.com/developerworks/cn/linux/shell/awk/awk-2/i

linux awk命令詳解(一) awk語法 awk運算 awk陣列

如何把一行豎排的資料轉換成橫排? awk '{printf("%s,",$1)}' filename awk中使用NR和FNR的一些例子 http://blog.sina.com.cn/s/blog_5a3640220100b7c8.html http://www.linuxidc.com/Linux

linux awk 命令詳解

簡介 awk是一個強大的文字分析工具,相對於grep的查詢,sed的編輯,awk在其對資料分析並生成報告時,顯得尤為強大。簡單來說awk就是把檔案逐行的讀入,以空格為預設分隔符將每行切片,切開的部分再進行各種分析處理。 awk有3個不同版本: awk、nawk和ga

Linux awk命令詳解

awk命令作用: 文字處理 輸出格式化的文字報表 執行算數運算 執行字串操作 執行系統命令 等等 AWK的程式結構: BEGIN 語句塊 BEGIN語句塊的語法 BEGIN {awk-commands} BEGIN語句塊在程式開始的使用執行,它

linux mknod命令解析

      個人覺得linux的軟體設計思想異常強大,比如把所有的裝置都當做檔案來處理,大大簡化了程式設計師的負擔,向提出這個思想的大神s致敬!!先來看看linux系統中裝置管理的基本知識:      我們的linux作業系統跟外部裝置(如磁碟、光碟等)的通訊都是通過裝置檔案

讀書筆記---arm-linux-objdump命令解析

arm-linux-objdump命令用於顯示二進位制檔案的資訊,也可以用來檢視反彙編程式碼,使用格式如下: arm-linux-objdump [-a] [-b bfdname | –target=bfdname]