Linux shell基礎(六)awk命令 ver0.2

1、awk命令

awk是一種編程語言,用於在linux/unix下對文本和數據進行處理(gawk - pattern scanning and processing language)。centos7中的awk是gawk的連接。它支持用戶自定義函數和動態正則表達式等先進功能,是linux/unix下的一個強大編程工具。前面的grep、sed只是單純的工具,而awk已是一門語言了,可見awk的功能將比較強大linux

用法:
awk -F '分割記號' ‘script’ files
awk [options] 'script' var=value file(s)
awk [options] -f scriptfile var=value file(s)正則表達式

選項:
-F fs fs指定輸入分隔符,fs能夠是字符串或正則表達式,如-F:
-v var=value 賦值一個用戶定義變量,將外部變量傳遞給awk
-f scripfile 從腳本文件中讀取awk命令shell

2、對文本豎列的操做

awk命令可以方便的經過指定分隔記號將文本分紅特定的列,而後在針對分出來的豎列進行操做編程

一、顯示test.txt文檔的第一列前5行。centos

awk -F ':' '{print $1}' test.txt | head -n 5bash

命令解釋:-F ':' 就是說這個文件以:做爲分隔符,咱們作實驗的是passwd文件,它自己就被:分割成了7段,'{}'中就是操做的描述,命令中的print $1 就是顯示第1列。編程語言

Linux shell基礎(六)awk命令 ver0.2

二、顯示test.txt文件全部豎列的內容ide

awk -F ':' '{print $0}' test.txt
awk '{print $0}' test.txt函數

注意與上一條命令的區別,$1表示第一列,$0表示全部列。
Linux shell基礎(六)awk命令 ver0.2工具

效果上其實和cat同樣。

三、awk也能夠
awk命令在沒有指定-F 分割符號或分割字符串時,默認以空格或者空白段做爲分隔符

咱們先建立一個測試文檔,以空格做爲分隔符
Linux shell基礎(六)awk命令 ver0.2

後咱們輸入下列命令

awk '{print $1}'
awk '{print $1,$3}'
awk '{print $1,$2}'

Linux shell基礎(六)awk命令 ver0.2

能夠看出awk自動把空格做爲分段記號,無論是多少個空格。

四、指定#爲顯示分隔符顯示特定列(注意不會影響原始文件,只是影響顯示)

awk -F ':' '{print $1"#"$3"#"$7}' test.txt

Linux shell基礎(六)awk命令 ver0.2

3、awk匹配功能舉例

awk 搜索操做時與sed命令同樣,awk默認支持正則,不須要像grep -E , sed -r 同樣須要專門選項。
一、搜索含關鍵字root的行

awk '/root/' test.txt

Linux shell基礎(六)awk命令 ver0.2

二、搜索第一豎列中含有oo字符的行。

sed -F ':' '$1 ~/oo/' test.txt

Linux shell基礎(六)awk命令 ver0.2

注意這個波浪號~就是匹配的意思。

三、搜索root和test任意匹配其中一個所在的行的第一列和第三列

awk -F ':' '/root/{$1,$3} /test/{$1,$3}' test.txt
awk -F ':' '/root|test/ {print $0}' test.txt

Linux shell基礎(六)awk命令 ver0.2

Linux shell基礎(六)awk命令 ver0.2

四、搜索分割後第三段==0的行,也就是uid是零的行。

awk -F ':' '$3==0' test.txt

Linux shell基礎(六)awk命令 ver0.2

這一列也能夠拓展到其餘數學表達式

awk -F ':' '$3>=1000' test.txt

Linux shell基礎(六)awk命令 ver0.2

awk -F ':' '$3<=100' test.txt

Linux shell基礎(六)awk命令 ver0.2

五、搜索分割後最後不是/sbin/nologin的行

awk -F ':' '$7!="/sbin/nologin" {print $1}' test.txt

Linux shell基礎(六)awk命令 ver0.2

寫正則時兩個注意點:一是否是什麼的表達式爲!=,二是字符串匹配時要用雙引號

六、搜索第三列大於第四列或者第七列==/sbin/nologin的行

awk -F ':' '$3>$4||$7=="sbin/nologin"' test.txt

Linux shell基礎(六)awk命令 ver0.2

||表示或者,&&表示而且。

七、搜索第三列大於第四列和第七列==/sbin/nologin的行

awk -F ':' '$3>$4||$7&&"sbin/nologin"' test.txt

Linux shell基礎(六)awk命令 ver0.2

4、awk內置變量功能舉例

awk命令自帶了一些變量:
OFS:系統分隔符
NR:總行數變量
NF:分割後最大段數數值

一、列出第三列大於1000數字或者第七段包含/bash/的行,打印這些行的一、三、7段,而且用#作顯示分隔符。

awk -F ':' '{OFS="#"} $3>1000|| $7 ~ /bash/ {print $1,$3,$7}' test.txt
awk -F ':' '{OFS="#"} {if ($3>1000|| $7 ~ /bash/){print $1,$3,$7}}' test.txt

Linux shell基礎(六)awk命令 ver0.2

Linux shell基礎(六)awk命令 ver0.2
二、顯示分段的最後一行

awk -F ':' '{print $NF}' test |head -n3

Linux shell基礎(六)awk命令 ver0.2
$NF 表示末段 NF表示段數,是一個數字

三、顯示文件,並在每一行前加上行號==grep -n

awk -F ':' {print NR":"$0} test.txt
grep -n '' test.txt

Linux shell基礎(六)awk命令 ver0.2
Linux shell基礎(六)awk命令 ver0.2

四、顯示前10行,同時複習sed寫法。

awk -F':' 'NR<=10 {print $0}' test.txt
sed -n '1,10'p test.txt

Linux shell基礎(六)awk命令 ver0.2

Linux shell基礎(六)awk命令 ver0.2
同時複習sed寫法

五、利用awk命令給$1f賦值

head -n3 test.txt| awk -F ':' '{OFS=":"} $1="root"' test.txt

Linux shell基礎(六)awk命令 ver0.2

注意與head -n3 test.txt| awk -F ':' '{OFS=":"} $1=="root"' test.txt的區別
Linux shell基礎(六)awk命令 ver0.2

5、awk數學運算舉例

一、計算第三段的值的和

awk -F ':' '{(tot=tot+$3)}; END {print tot}' test.txt

Linux shell基礎(六)awk命令 ver0.2

相關文章
相關標籤/搜索