awk命令

awk是一個強大的文本分析工具,相對于grep的查找,sed的編輯,awk在其對數據分析并生成報告時,顯得尤為強大。簡單來說awk就是把文件逐行的讀入,以空格為默認分隔符將每行切片,切開的部分再進行各種分析處理。

awk有3個不同版本: awk、nawk和gawk,未作特別說明,一般指gawk,gawk 是 AWK 的 GNU 版本。

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

代碼塊

awk的所有代碼(目前這么認為)都是寫在語句塊中的。

語句塊可分為3類:

BEGIN語句塊、END語句塊和main語句塊。

其中BEGIN語句塊和END語句塊都是的格式分別為BEGIN{...}和END{...},而main語句塊是一種統稱,它的pattern部分沒有固定格式,也可以省略,main代碼塊是在讀取文件的每一行的時候都執行的代碼塊。

BEGIN代碼塊:

在讀取文件之前執行,且執行一次
在BEGIN代碼塊中,無法使用$0或其它一些特殊變量
main代碼塊:

讀取文件時循環執行,(默認情況)每讀取一行,就執行一次main代碼塊
main代碼塊可有多個
END代碼塊:

在讀取文件完成之后執行,且執行一次
有END代碼塊,必有要讀取的數據(可以是標準輸入)
END代碼塊中可以使用$0等一些特殊變量,只不過這些特殊變量保存的是最后一輪awk循環的數據

語法

awk [options] 'pattern{action}'? ?file1 fiel1

awk的語法:

多個pattern{action}可以直接連接連用
action中多個語句如果寫在同一行,則需使用分號分隔
pattern部分用于篩選行,action表示在篩選通過后執行的操作
pattern和action都可以省略
省略pattern,等價于對每一行數據都執行action
例如:awk '{print $0}' a.txt
省略代碼塊{action},等價于{print}即輸出所有行
例如:awk '/Alice/' a.txt等價于awk '/Alice/{print $0}' a.txt
省略代碼塊中的action,表示對篩選的行什么都不做
例如:awk '/Alice/{}' a.txt
pattern{action}任何一部分都可以省略
例如:awk '' a.txt

pattern{action}語句結構(都稱之為語句塊),其中的pattern部分可以使用下面列出的模式:

# 特殊pattern
BEGIN
END

# 布爾代碼塊
/regular expression/ ? ?# 正則匹配成功與否 /a.*ef/{action}
relational expression ? # 即等值比較、大小比較 3>2{action}
pattern && pattern ? ? ?# 邏輯與 3>2 && 3>1 {action}
pattern || pattern ? ? ?# 邏輯或 3>2 || 3<1 {action}
! pattern ? ? ? ? ? ? ? # 邏輯取反 !/a.*ef/{action}
(pattern) ? ? ? ? ? ? ? # 改變優先級
pattern ? pattern : pattern ?# 三目運算符決定的布爾值

# 范圍pattern,非布爾代碼塊
pattern1, pattern2 ? ? ?# 范圍,pat1打開、pat2關閉,即flip,flop模式

工作原理

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

(1)awk使用一行作為輸入,并將這一行賦給內部變量$0,每一行也可稱為一一個記錄,以換行符結束

(2)然后,行被: (默認為空格或制表符)分解成字段(或域),每個字段存儲在已編號的變量中,從$1開始,最多達100個字段

(3)awk如何知道用空格來分隔字段的呢?因為有一個內部變量FS來確定字段分隔符。初始時,FS賦為空格

(4)awk打印字段時,將以設置的方法使用print西數打印,awk在打印的字段間加上空格,因為$1,$3之間有一個逗號。逗號比較特殊,它映射為另一個內部變量,稱為輸出字段分隔符OFS, OFS默認為空格

(5)awk輸出之后,將從文件中獲取另行,并將其存儲在$0中,覆蓋原來的內容,然后將新的字符串分隔成字段并進行處理。該過程將持續到所有行處理完畢

變量RS

可設置表示輸入記錄分隔符的預定義(Record Separator)來改變每次讀取的記錄模式。

RS通常設置在BEGIN代碼塊中,因為要先于讀取文件就確定好RS分隔符。

RS指定輸入記錄分隔符時,所讀取的記錄中是不包含分隔符字符的。例如RS="a",則$0中一定不可能出現字符a

特殊的RS值用來解決特殊讀取需求:

RS="":按段落讀取
RS="\0":一次性讀取所有數據,但有些特殊文件中包含了空字符\0
RS="^$":真正的一次性讀取所有數據,因為非空文件不可能匹配成功
RS="\n+":按行讀取,但忽略所有空行

RS兩種可能情況:
·RS為單個字符:直接使用該字符來分割記錄
·RS為多個字符:將其當做正則表達式,只要匹配正則表達式的符號,都用來分割記錄
。設置預定義變量IGNORECASE為非索,正匹配時表示忽略大小寫
。兼容模式下,只有首字符才生效,不會使用正則模式去分割記錄

RT

在讀取每條記錄之后,將其賦值給$0,同時還會設置NR、FNR、RT。

在awk每次讀完一條記錄時,會設置一個稱為RT的預定義變量,表示Record Termination。

當RS為單個字符時,RT的值和RS的值是相同的。

當RS為多個字符(正則表達式)時,則RT設置為正則匹配到記錄分隔符之后,真正用于劃分記錄時的字符。

當無法匹配到記錄分隔符時,RT設置為控制空字符串(即默認的初始值)。

NR

在讀取每條記錄之后,將其賦值給$0,同時還會設置NR、FNR、RT。

所有文件的行號計數器

FNR

在讀取每條記錄之后,將其賦值給$0,同時還會設置NR、FNR、RT。

是各個文件的行號計數器

字段分割

awk讀取每一條記錄之后,會將其賦值給$0,同時還會對這條記錄按照預定義變量FS劃分字段,將劃分好的各個字段分別賦值給$1 $2 $3 $4...$N,同時將劃分的字段數量賦值給預定義變量NF

$N引用字段:

N=0:即$0,引用記錄本身
0<N<=NF:引用對應字段
N>NF:表示引用不存在的字段,返回空字符串
N<0:報錯

方式:

讀取record之后,將使用預定義變量FS、FIELDWIDTHS或FPAT中的一種來分割字段。分割完成之后,再進入main代碼段(所以,在main中設置FS對本次已經讀取的record是沒有影響的,但會影響下次讀取)。

FS或-F

FS或者-F:字段分隔符

FS為單個字符時,該字符即為字段分隔符
FS為多個字符時,則采用正則表達式模式作為字段分隔符
特殊的,也是FS默認的情況,FS為單個空格時,將以連續的空白(空格、制表符、換行符)作為字段分隔符
特殊的,FS為空字符串””時,將對每個字符都進行分隔,即每個字符都作為一個字段
設置預定義變量IGNORECASE為非零值,正則匹配時表示忽略大小寫(只影響正則,所以FS為單字時無影響)
如果record中無法找到FS指定的分隔符(例如將FS設置為”\n”),則整個記錄作為一個字段,即$1和$0相等。

FIELDWIDTHS

指定預定義變量FIELDWIDTHS按字符寬度分割字段,這是gawk提供的高級功能。在處理某字段缺失時非常好用。

·FIELDWIDTHS="3569"表示第一個字段3字符,第二字段5字符.…
·FIELDWIDTHS="81:562:33"表示:
。第一個字段讀8個字符
。然后跳過1個字符再讀5個字符作為第二個字段
。然后讀6個字符作為第三個字段
。然后跳過2公字符在讀33個字符作為第四個字段(如果不足33個字符,師讀到結尾)
·FIELDWIDTHS="23*":
。第一個字段2個字符。第二個字段3個字符
。第三個字段剩余所有字符
。星號只能放在最后,且只能單獨使用,表示剩余所有

FPAT

FS是指定字段分隔符,來取得除分隔符外的部分作為字段。

FPAT是取得匹配的字符部分作為字段。它是gawk提供的一個高級功能。

FPAT根據指定的正則來全局匹配record,然后將所有匹配成功的部分組成$1、$2...,不會修改$0。

awk 'BEGIN{FPAT="[0-9]+"}{print $3"-"}' a.txt
之后再設置FS或FPAT,該變量將失效

OFS

分割表示使用FS(field Separator),計算表示使用預定義變量OFS(Output Field Separator)。

修改$0,將使用FS重新分割字段,所以會影響$1、$2...
修改$1、$2,將根據$1到$NF等各字段來重新計算$0
即使是$1 = $1這樣的原值不變的修改,也一樣會重新計算$0
為不存在的字段賦值,將新增字段并按需使用空字符串填充中間的字段,并使用OFS重新計算$0
awk 'BEGIN{OFS="-"}{$(NF+2)=5;print $0}' a.txt
增加NF值,將使用空字符串新增字段,并使用OFS重新計算$0
awk 'BEGIN{OFS="-"}{NF+=3;print $0}' a.txt
減小NF值,將丟棄一定數量的尾部字段,并使用OFS重新計算$0
awk 'BEGIN{OFS="-"}{NF-=3;print $0}' a.txt

沒有導致$0重建,$0就一直是原原本本的數據,所以指定OFS也無效。

當$0重建后,將自動使用OFS重建,所以即使沒有指定OFS,它也會采用默認值(空格)進行重建。

如果重建$0之后,再去修改OFS,將對當前行無效,但對之后的行有效。所以如果也要對當前行生效,需要再次重建。

有FS、FIELDWIDTHS、FPAT三種獲取字段的方式,可使用PROCINFO數組來確定本次使用何種方式獲得字段。

PROCINFO是一個數組,記錄了awk進程工作時的狀態信息。

如果:

PROCINFO["FS"]=="FS",表示使用FS分割獲取字段
PROCINFO["FPAT"]=="FPAT",表示使用FPAT匹配獲取字段
PROCINFO["FIELDWIDTHS"]=="FIELDWIDTHS",表示使用FIELDWIDTHS分割獲取字段

ARGV? 數組,保存命令行本身這個字符串,如awk '(print 50)'? a.txt,這個命令中,ARGV[0]保存awk ARGV[1]保存a.txt:

ARGC? awk命令的參數的個數? ? ? ? ?FILENAME? awk命令所處理的文件的名稱

ENVIRON:當前環境變量及其值的關聯數組

自定義變量test :? awk -v test="test" 'begin{print test}'? ?awk ? 'begin{ test="test";print test}'?

-----------格式化輸出printf

format格式的指示符都以開頭,后跟一個字符:

%c:顯示字符的ASCII碼? ? ?%d, %i點十進制整數? ? ? ? ?%e,%E:科學計數法顯示數值? ? ? ? ? ? %f:顯示浮點數
%g,%G:以科學計數法的格式或浮點數的格式顯示數值? ? ? ?%s:顯示字符串? ? %u:無符號整數? ? ? ? %%顯示%自身

修飾符
N:顯示寬度? ? ? ? ? ? ? ? ?-:? 左對齊? ? ? ? ? ? ?+:顯示數值符號

awk -F :'{printf "%-15s %i\n",$1,$3}'? ? ? ? /etc/passwd

--------------內置函數

length? ?返回string字符 キ中字符的個數

awk? ?-F : ‘{i1,while(i<NF){if(length)}}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/535628.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/535628.shtml
英文地址,請注明出處:http://en.pswp.cn/news/535628.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ubuntu安裝字符集

sudo locale-gen zh_CN.GBK sudo locale-gen zh_CN

正則表達式和grep

正則表達式(regular expression, RE)是一種字符模式&#xff0c;用于在查找過程中匹配指定的字符。 在大多數程序里&#xff0c;正則表達式都被置于兩個正斜杠之間;例如/lv[o0]e/就是由正斜杠界定的正則表達式&#xff0c;它將匹配被查找的行中任何位置出現的相同模式。在正則表…

GC 垃圾回收

垃圾回收機制是由垃圾收集器Garbage Collection GC來實現的&#xff0c;GC是后臺的守護進程。它的特別之處是它是一個低優先級進程&#xff0c;但是可以根據內存的使用情況動態的調整他的優先級。因此&#xff0c;它是在內存中低到一定限度時才會自動運行&#xff0c;從而實現對…

如何讓你變得魅力十足

我們每個人都希望自己在某些方面對他人來說是有用的。我們渴望那種被人需要的感覺&#xff0c;覺得自己是有能力的&#xff0c;就像我們在某方面很與眾不同&#xff0c;很獨特一樣。 有些人非常有吸引力。他們是那些每當需要幫助便會被想起的人。他們是那些另你覺得非常有幫助…

日志linux

syslog日志系統&#xff1a; syslogd 系統&#xff0c;非內核產生的信息 man 2 syslog klogd 內核&#xff0c;專門負責內核產生的信息 man 3 syslog /var/log/messages 系統標準錯誤日志信息&#xff0c;非內核 syslogd /var/log/dmesg klogd 共同配置文件etc/…

sysbench的安裝和做性能測試

sysbench是一個模塊化的、跨平臺、多線程基準測試工具&#xff0c;主要用于評估測試各種不同系統參數下的數據庫負載情況。關于這個項目的詳細介紹請看&#xff1a;http://sysbench.sourceforge.net。它主要包括以下幾種方式的測試&#xff1a;1、cpu性能2、磁盤io性能3、調度程…

加密解密

PKI public key Infrastructure 公鑰基礎設施 CRl 證書吊銷列表 CA證書頒發機構 Certificate Authority x509 證書 包括公鑰、過期時間、證書的合法擁有者、證書如何被使用 CA的信息 CA的校驗碼等等 Pki實現方式 TLS/ssl:x509 opengpg ssl安全的套接字層…

高性能MySQL(1)——MYSQL架構

MySQL最重要、最與眾不同的特性是它的存儲引擎架構&#xff0c;這種架構將查詢處理與數據的存儲/提取相分離&#xff0c;使得可以在使用時根據不同的需求來選擇數據存儲的方式。 一、Mysql邏輯架構 如果能在頭腦中構建出一幅MySQL各組件之間如何協同工作的架構圖&#xff0c;就…

數據庫設計中的14個關鍵技巧

1. 原始單據與實體之間的關系  可以是一對一、一對多、多對多的關系。在一般情況下&#xff0c;它們是一對一的關系&#xff1a;即一張原始單據對應且只對應一個實體。在特殊情況下&#xff0c;它們可能是一對多或多對一的關系&#xff0c;即一張原始單證對應多個實體&#xf…

高性能MySQL(2)——Schema與數據類型的優化

良好的邏輯設計和物理設計是高性能的基石&#xff0c;應該根據系統將要執行的查詢語句來設計 schema,這往往需要權衡各種因素。 一、選擇優化的數據類型 MySQL支持的數據類型非常多&#xff0c;選擇正確的數據類型對于獲得高性能至關重要。不管 存儲哪種類型的數據&#xff0c…

用戶權限sudo、suid、sgid以及facl等

su 切換用戶或以指定用戶運行命令。 使用su可以指定運行命令的身份(user/group/uid/gid)。 為了向后兼容&#xff0c;su默認不會改變當前目錄&#xff0c;且僅設置HOME和SHELL這兩個環境變量(若目標用戶非root&#xff0c;則還設置USER和LOGNAME環境變量)。推薦使用--login選項…

MySQL 服務器調優

關于 MySQL 調優 有 3 種方法可以加快 MySQL 服務器的運行速度&#xff0c;效率從低到高依次為&#xff1a; 替換有問題的硬件。 對 MySQL 進程的設置進行調優。 對查詢進行優化。 替換有問題的硬件通常是我們的第一考慮&#xff0c;主要原因是數據庫會占用大量資源。不過這…

通過腳本啟動批量服務

/app/all_start_script/wwyt/此目錄服務如下&#xff1a;apigateway.sh auth.sh config.sh register.sh zipkin.sh /app/all_start_script/other/此目錄服務如下&#xff1a; tomcat.sh wwyt_base.sh wwyt_cache.sh wwyt_flow.sh wwyt_risk_login.sh ww…

高性能MySQL(3)——創建高性能索引

索引對于良好的性能非常關鍵。尤其是當表中的數據量越來越大時&#xff0c;索引對性能的影響愈發重要。 一、索引的類型 在MySQL中&#xff0c;索引是在存儲引擎層而不是服務器層實現的。所以沒用統一的索引標準&#xff0c;不同存儲引擎的索引工作方式并不相同。 1.1、B-Tre…

linux 調優系列

Linux系統內核:修改TCP/IP調優參數 所有的TCP/IP調優參數都位于/proc/sys/net/目錄。例如, 下面是最重要的一些調優參數, 后面是它們的含義: 1. /proc/sys/net/core/rmem_max — 最大的TCP數據接收緩沖。 2. /proc/sys/net/core/wmem_max — 最大的TCP數據發送緩沖。 3.…

java中的構造方法與代碼塊

一、構造方法 1.1、java中的構造方法跟普通方法有很大的區別&#xff1a; 構造方法的方法名跟類名相同構造方法沒有返回值類型,連void也沒有,也不能用return返回值每次創建一個對象,都會調用構造方法,如果沒有寫構造方法,系統會默認加上一個空參的構造,如果已經寫了構造方法,…

bash shell是如何識別特殊符號的

一 、 shell命令解析以及識別通配符 Shell是系統的用戶界面,提供了用戶與內核進行交互操作的一種接口。它接收用戶輸入的命令并把它送入內核去執行 。 實際上Shell是一個命令解釋器,它解釋由用戶輸入的命令并且把它們送到內核。不僅如此,Shell有自己的編程語言用于對命令的編…

linux 調優系列(續)

linux 的各大發行版&#xff0c;都有些不必要的服務被默認開啟了&#xff0c;針對ubuntu&#xff0c;我們 可以采用選擇性關閉的方法加速起動&#xff0c;提高系統性能。 這里我們安裝一個軟件&#xff1a; sudo apt-get install sysv-rc-conf 然后這樣起動&#xff1a; 在這個…

配置文件bashrc與profile的區別

1、當登入系統時候獲得-個shell進程時&#xff0c;其讀取環境設定檔有三步 首先讀入的是全局環境變量設定檔/ete/profile,然后根據其內容讀取額外的設定的文檔&#xff0c;如/etc/profile. d和/ etc/ inputre 然后根據不同使用者帳號&#xff0c;去其家目錄讀取, bash, pr…

高性能MySQL(4)——查詢性能優化

査詢優化、索引優化、庫表結構優化需要齊頭并進&#xff0c;一個不落。 一、為什么查詢速度為變慢 在嘗試編寫快速的查詢之前,需要清楚一點,真正重要是響應時間。如果把查詢看作是一個任務&#xff0c;那么他由一系列子任務組成&#xff0c;每個子任務都會消耗一定的時間。如果…