Awk是壹種用於在linux/unix下處理文本和數據的編程語言。數據可以來自標準輸入(stdin)、壹個或多個文件,或者其他命令的輸出。支持用戶自定義函數、動態正則表達式等高級功能,是linux/unix下功能強大的編程工具。它在命令行中使用,但更多時候是作為腳本使用。Awk有很多內置函數,比如數組和函數,這和C語言是壹樣的。靈活性是awk最大的優勢。
Awk命令格式和選項
語法格式
Awk =1這樣的訪問是允許的。Awk使用壹個特殊的字符串子集作為分段字段。類似於壹維數組的成員測試,多維數組可以使用if ((i,j) in array)的語法,但是下標必須放在括號內。與壹維數組的循環訪問類似,多維數組使用for(數組中的項)等語法來遍歷數組。與壹維數組不同,多維數組必須使用split()函數來訪問各個下標組件。
awk 'BEGIN{
for(I = 1;我& lt=9;i++){
for(j = 1;j & lt=9;j++){
tarr[i,j]= I * j;
打印I," * ",j," = ",tarr[i,j];
}
}
}'
awk 'BEGIN{
for(I = 1;我& lt=9;i++){
for(j = 1;j & lt=9;j++){
tarr[i,j]= I * j;} }
對於(米在塔爾){
split(m,tarr2,SUBSEP);
打印tarr2[1]," * ",tarr2[2]," = ",tarr[m];} }'
內置函數
算術函數
格式描述
Atan2( y,x)得出y/x的反正切值。
Cos( x)返回x的余弦值;x是弧度。
Sin( x)返回x的正弦值;x是弧度。
Exp( x)返回x的冪函數。
Log( x)返回x的自然對數。
Sqrt( x)返回x的平方根。
Int( x)返回x的截斷整數值。
Rand()返回任意數字n,其中0
Srand( [Expr])將rand函數的種子值設置為Expr參數的值,如果省略Expr參數,則使用壹天中的時間。返回上壹個種子值。
awk 'BEGIN{
OFMT = " % .3f#OFMT將輸出數據格式設置為保留3位小數。
fs = sin(1);
Fe = exp(10);
fl = log(10);
fi = int(3.1415);
打印fs,fe,fl,fi;
}'
輸出結果為:0.841 22026.466 2.303 3。
awk 'BEGIN{
srand();
fr = int(100 * rand());
打印fr;
}'
產量:78
字符串處理功能
格式描述
Gsub( Ere,Repl,[In])的執行與sub函數完全相同,只是替換了正則表達式的所有具體值。
Sub( Ere,repl,[In])在Repl參數指定的字符串中替換Ere參數指定的擴展正則表達式的第壹個具體值。sub函數返回替換的次數。&;它出現在Repl參數指定的字符串中;(和符號)由in參數指定的字符串替換,該字符串與Ere參數指定的擴展正則表達式相匹配。如果沒有指定In參數,默認值是整個記錄($0記錄變量)。
Index (String1,String2)返回由參數String1指定的字符串中的位置(其中出現了由String2指定的參數),數字從1開始。如果String2參數沒有出現在String1參數中,則返回0(零)。
Length [(String)]返回由String參數指定的字符串的長度(以字符形式)。如果沒有給定字符串參數,則返回整個記錄的長度($0記錄變量)。
Blendth [(String)]返回由String參數指定的字符串長度(以字節為單位)。如果沒有給定字符串參數,則返回整個記錄的長度($0記錄變量)。
Substr( String,M,[N])返回由N參數指定的字符數的子字符串。子字符串是從String參數指定的字符串中獲取的,它的字符從m參數指定的位置開始。m參數是用字符串參數中的第壹個字符作為數字1來指定的。如果沒有指定n參數,子字符串的長度將是從m參數指定的位置到字符串參數結尾的長度。
Match( String,Ere)返回由String參數指定的字符串中Ere參數指定的擴展正則表達式出現的位置(字符形式),從1開始計數,如果Ere參數沒有出現,則返回0(零)。RSTART特殊變量被設置為返回值。RLENGTH特殊變量設置為匹配字符串的長度,如果沒有找到匹配項,則設置為-1(減壹)。
Tolower( String)返回由String參數指定的字符串,字符串中的每個大寫字符都將被改為小寫。大寫和小寫之間的映射是由當前語言環境的LC_CTYPE類別定義的。
Toupper( String)返回由String參數指定的字符串,字符串中的每個小寫字符都將變為大寫。大寫和小寫之間的映射是由當前語言環境的LC_CTYPE類別定義的。
Sprintf(格式,表達式,表達式,...)根據format參數指定的printf子例程格式字符串格式化expr參數指定的表達式,並返回最終生成的字符串。
註意:Ere可以是正則表達式。
時間函數
格式描述
Mktime (yyyymm DD hh mm ss [dst])生成時間格式
Strftime ([format [,timestamp]])格式化時間輸出,並將時間戳轉換為時間字符串的特定格式,如下表所示。
SYSTIME()獲取時間戳並返回從1970 65438+10月1到當前時間的整數秒(不包括閏年)。
Strftime日期和時間格式說明符:
格式描述
%壹周中某壹天的縮寫(Sun)
壹周中的某壹天(星期日)的完整拼寫
% b月份名稱的縮寫(十月)
% b月份名稱的完整拼寫(十月)
% c本地日期和時間
% d十進制日期
% d日期08/20/99
% e日期,如果只有壹位數字,將添加壹個空格。
% h以十進制的24小時格式表示小時。
% I以12小時的十進制格式表示小時。
% j 65438+10月1是壹年中的哪壹天?
% m十進制月份
十進制的% m分鐘
% p12小時制(上午/下午)
十進制的% s秒。
% u壹年中的第幾周用十進制表示(星期日是壹周的開始)
% w十進制星期幾(星期日為0)
% w壹年中的第幾周用十進制表示(星期壹是壹周的開始)
% x重置本地日期(1999年8月20日)
% x重置本地時間(12: 00: 00)
% y兩位數年份(99)
% y當前月份
% z時區(PDT)
%%百分號(%)
#mktime使用
awk ' BEGIN { t stamp = mktime(" 2001 01 01 12 12 12 ");打印strftime("%c ",t stamp);}'
輸出:2001 01 01周壹12小時12分鐘12秒。
awk ' BEGIN { tstamp 1 = mktime(" 2001 01 01 12 12 12 ");tstamp 2 = mktime(" 2001 02 01 0 0 ");打印ts tamp 2-ts tamp 1;}'
輸出:2634468
#求兩個時間段的時間差,介紹strftime的使用方法。
awk ' BEGIN { tstamp 1 = mktime(" 2001 01 01 12 12 12 ");tstamp 2 = systime();打印ts tamp 2-ts tamp 1;}'
輸出:308201392
其他壹般功能
格式描述
Close( Expression)使用帶有字符串值的相同表達式參數來關閉由print或printf語句或通過調用getline函數打開的文件或管道。如果文件或管道成功關閉,則返回0;否則,將返回壹個非零值。如果您計劃編寫壹個文件,然後在同壹個程序中讀取它,那麽close語句是必要的。
System(Command)執行Command參數指定的命令,並返回到退出狀態。相當於系統子程序。
Expression | getline [Variable ]從由Expression參數指定的命令的輸出中讀取輸入記錄並通過管道傳輸它,然後將記錄的值賦給由Variable參數指定的變量。如果以Expression參數的值作為其命令名的流當前未打開,則創建壹個流。創建的流相當於調用popen子例程,其中Command參數采用Expression參數的值,Mode參數的值設置為r。只要流保持打開並且Expression參數的計算結果為相同的字符串,getline函數的每個後續調用都會讀取另壹條記錄。如果未指定Variable參數,則將$0記錄變量和NF特殊變量設置為從流中讀取的記錄。
getline[Variable]& lt;Expression從由expression參數指定的文件中讀取下壹條輸入記錄,並將由Variable參數指定的變量設置為記錄的值。只要流保持打開,並且Expression參數計算為相同的字符串,就為getline函數的每個後續調用讀取另壹個記錄。如果未指定Variable參數,則將$0記錄變量和NF特殊變量設置為從流中讀取的記錄。
Getline [Variable ]將由Variable參數指定的變量設置為從當前輸入文件中讀取的下壹個輸入記錄。如果沒有指定Variable參數,則$0記錄變量被設置為記錄的值,並且還設置了NF、NR和FNR特殊變量。
#打開外部文件(關閉使用)
awk ' BEGIN { while(" cat/etc/passwd " | getline){ print $ 0;};close("/etc/passwd ");}'
輸出:root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nolog in daemon:x:2:2:daemon:/sbin:/sbin。
#逐行讀取外部文件(如何使用getline)
awk ' BEGIN { while(getline & lt;"/etc/passwd "){ print $ 0;};close("/etc/passwd ");}'
輸出:root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nolog in daemon:x:2:2:daemon:/sbin:/sbin。
awk 'BEGIN{print "輸入您的姓名:";getline名稱;打印姓名;}'
輸入您的姓名:
程默
程默
#調用外部應用程序(系統使用方法)b返回值,就是執行結果。
awk ' BEGIN { b = system(" ls-al ");打印b;}'
輸出:總計42092 drwxr-xr-x14程默程默4096 09-30 17:47 . drwxr-xr-x95根4096 10-08 14:01。..