一、awk介紹
awk、sed&grep都可以匹配文本,但sed和awk可以對文本進行編輯,grep則不具有此功能;sed是非交互式的流編輯器,而awk則是一門模式匹配的編程語言。awk主要用于處理匹配的文本,同時awk還支持編程語言的一些特性,如變量、函數、循環語句等。
二、基本用法
1)awk [options] 'program' File1,File2…
program:Pattern{Action Statements}
program通常位于單引號中,多個action語句之間用逗號分隔。
2)awk [options] 'BEGIN{ action;… } pattern{ action;… } END{action;… }' file …
常用action:print printf
常用options:
-F:指明輸入時用到的字段分隔符
-v var=value:聲明變量
三、awk的工作原理
1)在處理文本之前,若存在BEGIN語句塊,則先執行此語句塊中的語句。
2)將輸入的文本或標準輸入按回車(\n)分割,解析為多個記錄(record,默認以\n分隔,記錄的分割符可以同過awk的內置變量RS來更改)。
3)記錄會被切割成多個字段(filed,默認情況下,以空白字符切割不同的字段,包括空格和制表符,字段的分隔符可以通過-F選項及awk內置變量FS來指定),并將第一個字段存放在$1中,第二個字段存放在$2中,倒數第二個字段存放在$(NF-1),最后一個字段存放在$NF中。$0則表示匹配到的整條記錄。
4)如果讀取到的記錄與pattern想匹配,則執行器指定的action;若不匹配,則跳過action,直到完成所有的語句。
5)當以條輸入記錄處理完成之后,繼續讀取下一條記錄,重復上面的動作,直到處理完全部的輸入。若果輸入的是文件列表,awk將按順序處理列表中的文件。
6)awk處理完所有的輸入之后,若存在END語句塊,則執行END語句塊中的語句。
BEGIN、END語句都是可選的。
四、awk調用方式
主要有三種調用方式,分別為:
1) awk命令行
可以在命令行中使用awk 程序設計語言,也可以在shell script 程序中引用awk 命令行甚至awk 程序腳本。
2) 使用-f 選項調用awk 程序
awk 允許將一段awk 程序寫入一個文本文件,然后在awk 命令行中用-f 選項調用并執行這段程序。
3) 利用命令解釋器調用awk 程序
利用命令解釋器功能,我們可以將一段awk 程序寫入文本文件,然后在它的第一行加上#!/bin/awk –f.
五、awk使用詳解
1、print:用于輸出指定的內容
print item,item2,…
要點:
1)逗號分隔多個item
2)輸出的各item可以為字符串,也可以是數值、當前記錄的字段、變量、awk表達式
3)如省略item,相當于print $0,即輸出被pattern匹配的記錄。
例:在系統上每個用戶名之前加上hello
例:
2、printf命令
用于格式化輸出:printf Format,item1,item2,….
1)Format 必須給出
2)不會自動換行,需要給出換行控制符,\n
3)Format中需要分別為后面的每個item指定一個格式化符號。
格式符:
%c:不現實字符本身,而是顯示字符的ASCII碼
%d,%i:顯示十進制整數
%e,%E:以科學記數法數值顯示
%f:顯示為浮點數
%g,%G:以科學記數法或浮點數形式顯示數值。
%u:無符號整數
%s:顯示為字符串
%%:顯示%自身
例:顯示用戶名及其ID
修飾符:對格式符進行修飾
#[.#]:第一個數字控制顯示的寬度(度量值:字符數),第二個表示小數點后的精度
%3.1f
–:左對齊
+:右對齊。默認為右對齊
例:在上例中,由于用戶名的長度長短不一,在輸出時不夠清晰。使用修飾符能讓輸出更具易讀性。
左對齊:
]#awk -F: '{printf "username is: %-15s;userid is %i\n",$1,$3}' /etc/passwd
右對齊:
]#awk -F: '{printf "Your name is %+15s,your id is %i\n",$1,$3}' /etc/passwd
3、變量
3.1 內建變量
FS:input field separator,指定輸入時的字段分隔符;默認為空白字符
OFS:output field separator:指定輸出時的字段分隔符;默認為空白字符
RS:input record separator:指定輸入時的換行符;默認為空白
ORS:output record separator:指定輸出時的換行符,默認為空白
NF:number of field,每行的字段數量
{print NF}
$NF 標識最后一個字段
NR:number of record,文件的行的數量
FNR:若awk處理多個文件,則每個文件分別統計行數。若不指定,所有文件累計行數。
FILENAME:當前文件名
ARGC:命令行參數的
ARGV:數組,保存的是命令行所給定的各參數
例:用FS指定字段分隔符,注意,在awk中,每個變量之前需要用-v來指定。
例:指定輸出的字段分隔符。
3.2 自定義變量
(1)-v var=value
注意:變量名區分大小寫
(2)在program中直接定義
4、操作符
算術操作符:+ ,- ,* ,/ ,%, ^
-n::轉換為負數
+n:將字符串轉換為數值
字符串操作符:沒有符號的操作符,表示連接字符串
賦值操作符:= ,+= ,-= ,*= ,/= ,^= ,%= ,++ ,–
比較操作符:< ,> ,<= ,>= ,==, !=
模式操作符:
~:左側的字符串是否被右側的模式所匹配
!~:左側的字符串是否被右側的模式不匹配
邏輯操作符: && || !
函數調用:function_name(argu1,argu2…)
條件表達式:selector?if-true-expression:if-false-expression
例:使用條件表達式判斷用戶是普通用戶還是系統用戶或管理員
awk -F: '{$3>1000?usertype="Common user":usertype="System or Sysadmin";printf "%15s:%s\n",$1,usertype}' /etc/passwd
5、PATTERN
5.1)empty:空模式,匹配每一行
5.2)/Regular Expression/:僅處理被模式匹配的每一行
例:輸出/etc/fstab文件中不是以UUID開頭的行的第一個字段。
輸出/etc/fstab文件中以UUID開頭的行的第一個字段。
5.3)relational expression:關系表達式;結果有“真”有“假”;結果為真的才被處理。
真:結果為非0值表示為真,非空字符串也表示為真
假:0表示為假,空字符串也表示為假
例:
1)輸出uid大于1000的用戶的用戶名
2)輸出小于等于1000的用戶的用戶名
3)輸出shell為/bin/bash的用戶的用戶名及其shell
5.4)line ranges:指定行范圍
startline,endline:/part1/,/part2/
注意:不支持直接給出數字的格式。
例:查找/etc/passwd文件中root到shutdown用戶之間個用戶的用戶名及uid。
]#awk -F: '/^root\>/,/^shutdown\>/{print $1,$3}' /etc/passwd
例:輸出/etc/passwd中從第2行(不包括第2行)到第10行(包括第10行)的用戶名及其UID
5.5)BEGIN/END模式
BEGIN{}:BEGIN 語句塊在awk 開始從輸入流中讀取行之前被執行,這是一個可選的語句塊,比如變量初始化、打印輸出表格的表頭等語句通??梢詫懺贐EGIN語句塊。 END{}:END 語句塊在awk 從輸入流中讀取完所有的行之后即被執行,比如打印所有行的分析結果這類信息匯總都是在END 語句塊中完成,它也是一個可選語句。
例:
]#awk -F: 'BEGIN{print " usernameuid\n--------------------"}{print $1,$3}END{print "-----------------\n end " }' /etc/passwd
原創文章,作者:M20-1鐘明波,如若轉載,請注明出處:http://www.www58058.com/48228