Shell_AWK

一、awk簡介
awk 是一種編程語言,用于在linux/unix下對文本和數(shù)據(jù)進(jìn)行處理。

數(shù)據(jù)可以來自標(biāo)準(zhǔn)輸入、一個或多個文件,或其它命令的輸出。

支持用戶自定義函數(shù)和動態(tài)正則表達(dá)式等先進(jìn)功能,是linux/unix
下的一個強(qiáng)大編程工具。

在命令行中使用,但更多是作為腳本來使用。

awk的處理文本和數(shù)據(jù)的方式是這樣的,它逐行掃描文件,從第一行到最后一行,尋找匹配的特定模式的行,并在這些行上進(jìn)行你想要的操作。如果沒有指定處理動作,則把匹配的行顯示到標(biāo)準(zhǔn)輸出(屏幕),如果沒有指定模式,則所有被操作所指定的行都被處理。

awk分別代表其作者姓氏的第一個字母。因為它的作者是三個人,分別是Alfred Aho、Brian Kernighan、Peter Weinberger。

gawk是awk的GNU版本,它提供了Bell實驗室和GNU的一些擴(kuò)展。

二、awk的兩種形式語法格式

awk [options] 'commands' filenames
awk [options] -f awk-script-file filenames
options:
-F 對于每次處理的內(nèi)容,可以指定一個子定義的分隔符,默認(rèn)的分隔符是空白字符(空格或 tab 鍵 )

command:

BGIN{}                                           {}                              END{}
處理所有內(nèi)容之前的動作                   處理內(nèi)容中的動作                     處理所有內(nèi)容之后的動作

示例

awk 'BENIN{print "----開始處理----" } {print "ok"}END{print "----都處理完畢----"}' /etc/hosts
----開始處理了---
ok
ok
ok
----都處理完畢----

BEGIN{}通常用于定義一些變量,例如BEGIN{FS=":";ofs="---"}

三、awk工作原理

awk -F: '{print $1,$3}' /etc/passwd
(1)awk,會處理文件的每一個行,每次處理時,使用一行作為輸入,并將這一行賦給內(nèi)部變量$0,每一行也可稱為一個記錄,以換行符結(jié)束

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

(3)awk如何知道用空白字符來分割字段的呢?因為有一個內(nèi)部變量FS來確定字段分隔符。初始時,F(xiàn)S賦為空白字符

(4)awk打印字段時,將以內(nèi)置的方法使用print函數(shù)打印,awk在打印出的字段間加上空格。這個空格是內(nèi)部的一個變量OFS輸出字段的分隔符,逗號,會和OFS進(jìn)行映射,通過OFS可以控制這個分隔符的值。

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

四、記錄與字段相關(guān)內(nèi)部變量:

man awk

$0 : awk變量 $0 保存當(dāng)前正在處理的行內(nèi)容
NR : 當(dāng)前正在處理的行是 awk 總共處理的行號。
FNR: 當(dāng)前正在處理的行在其文件中的行號。
NF :每行被處理時的總字段數(shù)
FS : 輸入行時的字段分隔符,默認(rèn)空格

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

OFS: 輸出字段分隔符,默認(rèn)是一個 空格

awk 'BEGIN{FS=":"; OFS="+++"} /^root/{print $1,$2,$3,$4}' /etc/passwd

ORS 輸出記錄分隔符, 默認(rèn)是換行符.

示例

將文件每一行合并為一行

ORS默認(rèn)輸出一條記錄應(yīng)該回車,但是這里是加了一個空格

awk 'BEGIN{ORS="  "} {print $0}' /etc/passwd 

五、格式化輸出:

printf 函數(shù)

awk -F: '{printf "%-15s %-10s %-15s\n", $1,$2,$3}' /etc/passwd
awk -F: '{printf "|%-15s| %-10s| %-15s|\n", $1,$2,$3}' /etc/passwd
  • %s字符類型

  • %d 數(shù)值類型

  • %f浮點類型

  • %-15s占15字符 - 表示左對齊,默認(rèn)是右對齊

  • printf默認(rèn)不會在行尾自動換行,加\n

六、awk模式和動作

任何awk 語句都由 模式動作 組成。
模式部分 決定動作語句何時觸發(fā)及觸發(fā)事件。
如果省略模式部分,動作將時刻保持執(zhí)行狀態(tài)。
模式可以是任何條件語句或復(fù)合語句或正則表達(dá)式。

模式可以是

正則表達(dá)式:

  • 匹配記錄(整行的匹配):
awk '/^root/' /etc/passwd
awk '$0 ~ /^root/' /etc/passwd
awk '!/root/' passwd
awk '$0 !~ /^root/' /etc/passwd
  • 匹配字段:可以使用的匹配操作符(~!~
awk -F: '$1 ~ /^alice/' /etc/passwd
awk -F: '$NF !~ /bash$/' /etc/passwd
  • 比較表達(dá)式:

比較表達(dá)式采用對文本進(jìn)行比較,只有當(dāng)條件為真,才執(zhí)行指定的動作。
比較表達(dá)式使用關(guān)系運算符,用于比較數(shù)字與字符串。
關(guān)系運算符有
<小于 例如 x<y
>大于 x>y
<= 小于或等于 x<=y
== 等于 x==y
!= 不等于x!=y
>= 大于等于 x>=y

示例

awk -F: '$3 == 0' /etc/passwd
awk -F: '$3 < 10' /etc/passwd
awk -F: '$NF == "/bin/bash"' /etc/passwd
awk -F: '$1 == "root"' /etc/passwd
df -P | grep '/' |awk '$4 > 25000'

  • 條件表達(dá)式:
awk -F: '$3>300 {print $0}' /etc/passwd
awk -F: '{ if($3>300) print $0 }' /etc/passwd
awk -F: '{ if($3>300) {print $0} }' /etc/passwd
awk -F: '{ if($3>300) {print $3} else{print $1} }' /etc/passwd
  • 算術(shù)運算:+,-, *,/, %(模: 取余),^(冪:2^3)

可以在模式中執(zhí)行計算,awk都將按浮點數(shù)方式執(zhí)行算術(shù)運算

awk -F: '$3 * 10 > 500' /etc/passwd
awk -F: '{ if($3*10>500){print $0} }' /etc/passwd
  • 邏輯操作符和復(fù)合模式

&& 邏輯與, 相當(dāng)于 并且
||邏輯或,相當(dāng)于 或者
! 邏輯非 , 取反

awk -F: '$1~/root/ && $3<=15' /etc/passwd
awk -F: '$1~/root/ || $3<=15' /etc/passwd
awk -F: '!($1~/root/ || $3<=15)' /etc/passwd
  • 范圍模式,符號是逗號,
    使用語法是:起始表達(dá)式,終止表達(dá)式
awk -F: '/^bin/,/adm/ {print $0 }' /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin

awk正則示例:

awk -F: '/^(bin|root)/' /etc/passwd
root:x:0:0:root:/root:/bin/zsh
bin:x:1:1:bin:/bin:/sbin/nologin

指定多個分隔符

echo "a b|c d| ||||e | |" |awk -F'[ |]' '{print $10}'
e
echo "a b|c d| ||||e | |" |awk -F'[ |]+' '{print $5}'
e

AWK腳本編程

條件判斷

if語句

格式 { if (表達(dá)式) {語句; 語句; ...}}

awk -F: '{if($3==0){print $1} else {print $7}} ' /etc/passwd
awk -F: '{if($3==0) {count++} else{i++}}' /etc/passwd

if...else語句

格式 {if(表達(dá)式){語句;語句;...}else{語句;語句;...}}

awk -F: '{if($3==0){print $1} else {print $7}}' /etc/passwd
awk -F: '{if($3==0) {count++} else{i++} }' /etc/passwd
awk -F: '{ if($3==0){count++} else{i++} } END{print "管理員個數(shù): "count ; print  "系統(tǒng)用戶數(shù): "i}' /etc/passwd

if...else if...else語句

格式
{if(表達(dá)式1) {語句;語句;...} else if (表達(dá)式2) {語句;語句;...} else if(表達(dá)式3){語句;語句;...} else {語句;語句;...} }

awk -F: '{if($3==0){i++} else if($3>999){k++} else{j++}} END{print i; print k; print j}' /etc/passwd

awk -F: '{if($3==0){i++} else if($3>999){k++} else{j++}} END{print "管理員個數(shù): "i; print "普通用個數(shù): "k; print "系統(tǒng)用戶: "j}' /etc/passwd

循環(huán)

while

語法格式 awk '{ while(循環(huán)的條件){循環(huán)體}}'

awk 'BEGIN{ i=1; while(i<=10)   {print i; i++} }'
awk -F: '/^root/{i=1; while(i<=7){print $i; i++}}' passwd
awk '{i=1; while(i<=NF){print $i; i++}}' /etc/hosts
awk -F: '{i=1; while(i<=10) {print $0; i++}}' /etc/passwd //將每行打印10次

for

awk 'BEGIN{for(i=1;i<=5;i++){print i} }' //C風(fēng)格for
1
2
3
4
5

awk -F: '{ for(i=1;i<=10;i++) {print $0} }' /etc/passwd //將每行打印10次
awk -F: '{ for(i=1;i<=NF;i++) {print $i} }' passwd //分別打印每行的每列

數(shù)組

awk -F: '{username[++i]=$1} END{print username[1]}' /etc/passwd
輸出: root

awk -F: '{username[i++]=$1} END{print username[1]}' /etc/passwd
輸出: bin

awk -F: '{username[i++]=$1} END{print username[0]}' /etc/passwd
輸出: root

數(shù)組遍歷:

  1. 按索引遍歷
  2. 按元數(shù)個數(shù)遍歷
  • 按元數(shù)個數(shù)遍歷
awk -F: '{username[x++]=$1} END{for(i=0;i<x;i++) print i,username[i]}' /etc/passwd
awk -F: '{username[++x]=$1} END{for(i=1;i<=x;i++) print i,username[i]}' /etc/passwd
  • 按索引遍歷
 awk -F: '{username[x++]=$1} END{for(i in username) {print i,username[i]} }' /etc/passwd
 awk -F: '{username[++x]=$1} END{for(i in username) {print i,username[i]} }' /etc/passwd
注:變量i是索引
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、awk簡介 awk 是一種編程語言,用于在linux/unix下對文本和數(shù)據(jù)進(jìn)行處理。 數(shù)據(jù)可以來自標(biāo)準(zhǔn)輸入、...
    沙礫丶ye閱讀 202評論 0 0
  • 一、awk簡介 awk 是一種編程語言,用于在linux/unix下對文本和數(shù)據(jù)進(jìn)行處理。 數(shù)據(jù)可以來自標(biāo)準(zhǔn)輸入、...
    運維開發(fā)_西瓜甜閱讀 2,494評論 0 8
  • shell-awk awk簡介 awk是一種編程語言,用于在linux下對文本和數(shù)據(jù)處理數(shù)據(jù)可以來自標(biāo)準(zhǔn)輸入、一個...
    _str_閱讀 188評論 0 1
  • 一、awk簡介 awk是一種編程語言,用在linux/unix下對文本和數(shù)據(jù)進(jìn)行出路。數(shù)據(jù)可以來自標(biāo)準(zhǔn)輸入、一個或...
    鳳鳳思密達(dá)萌萌噠閱讀 225評論 0 0
  • 一、awk簡介 awk 是一種編程語言,用于在linux/unix下對文本和數(shù)據(jù)進(jìn)行處理。 數(shù)據(jù)可以來自標(biāo)準(zhǔn)輸入、...
    休止符的嘆息閱讀 160評論 0 0

友情鏈接更多精彩內(nèi)容