linux awk命令怎么用

linux中,awk命令是文本數據處理工具,適合格式化文本文件,對文本文件進行更復雜的加工處理、分析,語法“awk ?[option] ?‘pattern[action]’ ?file …”。awk具備強大的文本格式化能力,比如對一堆看起來沒有什么規律的日志文件,文本文件等,通過awk命令之后,格式化輸出為專業的可以做為應用級數據分析的樣式。

linux awk命令怎么用

本教程操作環境:linux7.3系統、Dell G3電腦。

Linux 系統中有一個功能更加強大的文本數據處理工具,就是 awk。它誕生于 20 世紀 70 年代末期,這也許是它影響了眾多 Linux 用戶的原因之一。

曾有人推測 awk 命令的名字來源于 awkward 這個單詞。其實不然,此命令的設計者有 3 位,他們的姓分別是 Aho、Weingberger 和 Kernighan,awk 就取自這 3 為大師姓的首字母。

awk具備強大的文本格式化能力,比如對一堆看起來沒有什么規律的日志文件,文本文件等,通過awk命令之后,格式化輸出為專業的可以做為應用級數據分析的樣式;

awk像是一門編程語言,支持條件判斷,數組,循環等諸多的功能;

linux三劍客

  • grep,擅長單純的查找或匹配文本內容;

  • sed,擅長文本編輯,處理匹配到的文本內容;

  • awk,適合格式化文本文件,對文本文件進行更復雜的加工處理、分析;

awk理論基礎

1、awk語法

awk??[option]??'pattern[action]'??file?...  awk???參數???????條件動作???????????文件

linux awk命令怎么用

action 是指動作,awk擅長文本格式化,且能輸出格式化后的結果,因此最常用的動作就是 print 和 printf

2、awk處理文本內容模式

  • awk默認以空格為分隔符,且多個空格也識別為一個空格,作為分隔符;
  • awk按行處理文件,一行處理完畢之后,再處理下一行;
  • awk可以根據用戶指定的分隔符去工作,沒有指定,則默認為空格;

一、awk內置變量

內置變量 說明
$n 指定分隔符后,當前的第n個列所在的字段
$0 完整的一行記錄
FS 字段分隔符,默認是空格
NF(Number of fields) 字段分隔后,當前一共多少個字段
NR(Number of records) 當前記錄數,行數

更多的內置變量,可通過 man awk命令進行查看

簡單案例展示

提前準備一個文本,內容如下

linux awk命令怎么用

1、輸出第二列內容

awk?'{print?$2}'?alx.txt

linux awk命令怎么用

2、輸出多列內容

直接在第一步后面的基礎上追加,中間用 “,” 分割

awk?'{print?$2,$3}'?alx.txt

linux awk命令怎么用

3、查看第三行內容

考察對NR的使用,NR表示第N行記錄的模式匹配

awk?'NR==3{print?$0}'?alx.txt

linux awk命令怎么用

輸出多行

awk?'NR==5,NR==6{print?$0}'?alx.txt

linux awk命令怎么用

4、輸出從第3到第五行,并顯示行號

awk?'NR==3,NR==5?{print?NR,$0}'?alx.txt

linux awk命令怎么用

5、自定義輸出內容

某些情況下,需要給每一列添加類似于excel的表頭信息,就可以考慮使用awk的自定義輸出;

awk?'{print?"第一列:?"$1,"第二列:?"$2}'?alx.txt

linux awk命令怎么用

需要注意的是大括號外面的使用 ’ 單引號,括號里面的使用雙引號

二、awk參數

參數 說明
-F 指定分隔字段符
-v 定義或修改一個awk內部變量
-f 從腳本文件中讀取awk命令

上文談到,awk默認的字段分隔符為空格,但是像下面這樣的文本,以 # 為分隔符,就需要用到自定義分隔符;

linux awk命令怎么用

1、顯示第一列和第二列內容

awk?-F?"#"?'{print?$1,$2}'?zcy2.txt

linux awk命令怎么用

2、顯示文件第一列,倒是第一列,和倒數第二列的內容

awk?'{print?$1,$(NF-1),$(NF-2)}'?alx.txt

linux awk命令怎么用

3、取出本機的IP地址

linux awk命令怎么用

使用awk的方式獲取的話,如果以空格為分隔符,我們發現目標字段在第二行的第二列,使用下面的命令即可,看起來,比起sed和grep命令似乎更簡單;

ifconfig?eth0?|?awk?'NR==2{print?$2}'

linux awk命令怎么用

4、取出密碼文件中的第一列和最后一列

考察對自定義輸入分隔符的使用,可以看到,下面的文本文件中,可以考慮使用 : 進行分割;

linux awk命令怎么用

awk?-F?':'?'{print?$1,$NF}'?pwd2.txt

linux awk命令怎么用

三、OFS輸出分隔符

通過上文的學習,我們知道awk命令執行后,默認采用空格分割字段,而這個空格就是默認的輸出分割符,

單在某些情況下,為了將數據展示的效果更加醒目一些,就可以使用OFS的自定義輸出分隔符;

仍然以上面的密碼文本為例,輸出第一列和最后一列的字段;

awk?-F?':'?-v?OFS='?***?'?'{print?$1,$NF}'?pwd2.txt

該表默認輸出分隔符,直接在awk后面使用: -v OFS=‘自定義輸出分隔符’

linux awk命令怎么用

四、awk變量

awk參數

參數 說明
-F 指定分隔字段符
-v 定義或修改一個awk內部變量
-f 從腳本文件中讀取awk命令

對于awk來講,變量分為:內置變量和自定義變量

awk內置變量

參數 說明
FS 輸入字段分隔符,默認為空白字符
OFS 輸出字段分隔符,默認為空白字符
RS 輸入記錄分隔符,指定輸入時的換行符
ORS 輸出記錄分隔符,輸出時用指定符號替換換行符
NF 當前行的字段個數,字段數量
NR 行號,當前處理文本行的行號
FNR 各文件分別計數的行號
FILENAME 當前文件名
ARGC 命令行參數個數
ARGV 數組,保存的是命令行所給定的各個參數

比較常用的內置變量包括: NR,NF,FNR

FILENAME 使用

FILENAME 為awk的內置變量,通過下面這個命令,可以看到在每行記錄之前,輸出了當前文件名稱;

awk?'NR==1,NR==3{print?FILENAME,$0}'?alx.txt

linux awk命令怎么用

ARGV使用

先來看下面這條命令的執行結果

awk?'NR==1,NR==3{print?ARGV[0],ARGV[1],$0}'?alx.txt

linux awk命令怎么用

可以發現,在輸出的每一行記錄前面,拼上了 awk 和 alx.txt這兩個字段,這兩個字段就是這行命令整體解析出來的2個內置參數;

自定義變量

看下面這條命令輸出效果,通過-v參數,可以自定義變量進行參數傳遞;

awk?-v?myname="zcy"?'BEGIN{print?"我的名字是?"?,myname}'

linux awk命令怎么用

五、awk格式化輸出

在上文,我們接觸的是awk的輸出功能,主要使用了 print 這個進行輸出,它只能對文本進行簡單的輸出,但是并不能美化或者修改輸出格式;

printf 格式化輸出

如果對C語言有過了解的同學,對printf 并不陌生,使用這個命令(函數)可以對文本進行格式化輸出;

printf與print的幾點區別

  • printf 需要指定format;
  • format 用于指定后面的每個 item輸出格式;
  • printf 語句不會自動打印換行符; n ; print 默認添加換行符;

如下,假如我們直接使用 printf 這樣操作,看下效果

awk?'{printf?$0}'?alx.txt

linux awk命令怎么用

明顯來說,把所有內容都輸出到同一行了,這時候,就需要使用 printf的格式化輸出來控制;

awk?'{printf?"%sn",?$0}'?alx.txt

linux awk命令怎么用

再看一個案例,使用 printf 將文本中的每一列添加前置輸出

awk?'{printf?"第一列:%s???第二列:%s???第三列:%sn"?,$1,$2,$3}'?alx.txt

linux awk命令怎么用

六、awk模式pattern

上文了解到,awk的語法如下 :

awk [option] ‘pattern[action]’ file …

而且我們了解到,awk是按行處理文本,以上都是關于 print 相關,接下來,聊聊pattern相關的內容;

在pattern中,有個比較常見的pattern,BEGIN和END;

  • BEGIN 模式是處理文本之前需要執行的動作;
  • END模式是處理完成所有的行之后執行的操作;
awk?'BEGIN{print?"小明在學linux"}'

linux awk命令怎么用

或者下面這樣

awk?'BEGIN{print?"小明在學linux"}?{print?$0}END{print?"處理結束"}'?alx.txt

linux awk命令怎么用

注意:BEGIN 和 END分別放到處理文本內容前后即可

awk如果不指定模式是按行處理,如果指定了模式,只有符合模式的才會被處理

awk常用模式

關系運算符 說明
小于
小于等于
== 等于
!= 不等于
>= 大于等于
~ 匹配正則
!~ 不匹配正則

1、打印前三行的文本內容

awk?'NR<p><img src="https://img.php.cn/upload/image/562/241/147/1675248091946349.png" title="1675248091946349.png" alt="25.png"></p><p><strong>2、匹配密碼文本中含有 zcy 的行</strong></p><pre class="prettyprint" data-index="21">awk?'/^zcy/{print?$0}'?pwd.txt

linux awk命令怎么用

3、格式化輸出 /etc/passwd 的部分字段

awk?-F?":"?'BEGIN{print"用戶名ttt字段1tt?????字段2tt?????權限"}?{printf?"user:%-20s%-20s%-20s%-20sn",?$1,$4,$5,$7}'?pwd.txt

linux awk命令怎么用

4、找出pwd文件中nologin的用戶

linux awk命令怎么用

awk?'//sbin/nologin$/{print?NR,$0}'?pwd.txt

linux awk命令怎么用

5、找出 下面這個區間的文本行

linux awk命令怎么用

awk?'/^daemon/,/^operator/{print?NR,$0}'?pwd.txt

linux awk命令怎么用

相關推薦:《Linux視頻教程

以上就是

? 版權聲明
THE END
喜歡就支持一下吧
點贊8 分享