awk 常被用於處理字段。所謂字段,就是文本文件中,每一行分成許多列,列與列之間用特定的字符隔開。
awk 命令分三部分: awk 本身 、 awk要執行的命令內容 、awk的輸入文件。 awk 執行命令時,依次讀取每一行,將命令應用到每一行。 - print 和 print $0 行為完全相同,都是打印一整行! -F 參數設置的是awk的初始化變量FS,FS控制著awk的字段分隔符,默認情況下是空白字符。 awk 支持設置多個字段分隔符,甚至用正則表達式來設置。 eg. awk -F"[\t ]+" // 表示此分隔符匹配一個或多個制表符或空格符 awk讀取標准輸入。 AWK的代碼結構: awk默認對每一個輸入行執行一段代碼塊。 awk的運行可看成3部分:處理輸入前的初始化(BEGIN{}代碼塊)、處理輸入過程({}代碼塊集合)、處理完所有輸入後的掃尾工作(END{}代碼塊)。 BEGIN代碼塊,主要完成awk部分參數的初始化操作! 核心處理輸入的過程:執行體 END代碼塊,是在所有輸入都處理完成後awk才去運行的代碼! - BEGIN 代碼塊 格式:BEGIN標簽加上{}。 在這個代碼塊中完成一些變量的初始化操作,只在初始化時被運行一次。 eg. awk定義FS變量為字段分隔符,在命令行 -F參數用於指定字段分割符,在BEGIN代碼段中這樣寫: fs.awk // awk 腳本,-f 參數引用腳本到awk命令中BEGIN{
FS=":" // 將冒號賦給FS變量,改變字段分隔符
}
{
print "USER: " $1 "\tSHELL: " $7
}
head -n10 /etc/passwd |awk -f fs.awk
awk 'BEGIN{FS=":"}{print "USER: " $1 "\tSHELL: " $7}'
BEGIN{ # 初始化信息,便於閱讀
print "How many prople with nologin?"
}
/nologin/{++adder} # 核心awk處理過程
END{ # 掃尾工作,打印結果
print "'nologin' appears " adder " times."
}
awk -f search.awk /etc/passwd
awk '/^$/{print "This is an empty line."}'/etc/inittab # 匹配空行一次執行一次輸出
BEGIN{
print "SHELL USAGE:"
}
/bash/{++bash} //
/nologin/{++nologin}
END{
print "We have " bash " bash users."
print "We have " nologin " nologin users."
}
awk -f shell_recorder.awk /etc/passwd
awk 'BEGIN {print "(3+2)*7=" (3+2)*7}'
(3+2)*7=35
awk 'BEGIN {print "3^10=" 3^10}'
3^10=59049
1936圖靈提出人類歷史上第一個人工智能的概念
1946世界上第一台計算機"埃尼阿克(ENIAC)"在美國賓西法尼亞大學誕生
1956第二代計算機產生
1969Ken.ThompsoDernis.Ritchie發布第一版Unix
1979 AT&T從各大學收回Unix版權,此後誕生了System V 和 BSD 兩個版本線的Unix操作系統
1983RichardStallman創建GNU(GNU is not Unix.),1983-1991年GNU三大軟件:Bash shell、gcc、emacs.
1991LinusTorvalds發布Linux內核
1994Lins加入GNU,GNU系列軟件與Linux內核結合,退出linus's minix,簡稱Linux.
# awk 腳本求閏年
BEGIN {
print "Pick leap years:"
}
{
# $1為記錄的第一個字段
year=$1
if(( year %4==0&& year %100!=0)||year %400==0)
print year "is a leap year."
else
print year "is not a leap year."
}
END {
print "Checking is over."
}
Pick leap years:
1936is a leap year.
1946is not a leap year.
1956is a leap year.
1969is not a leap year.
1979is not a leap year.
1983is not a leap year.
1991is not a leap year.
1994is not a leap year.
1995is not a leap year.
2016is a leap year.
Checking is over.
=+=-=*=/=^=**= 賦值 # **= 等價於^=
?: c條件表達式 # 三目運算符,用法:x
>y?x:y 若x>y,則返回x,否則,返回y || 邏輯或
&& 邏輯與
~ ~! 匹配正則表達式不匹配正則表達式
<<=>>=!=== 關系運算符
空格 連接
+- 加減
*/% 乘除求余
^ 求冪
++-- 自加自減
$ 引用字段
in 數組成員
+-! 一元加、減和邏輯非
Linux常用命令之awk http://www.linuxidc.com/Linux/2016-09/135046.htm
Linux系統之文本格式化工具awk http://www.linuxidc.com/Linux/2016-02/128150.htm
AWK簡介及使用實例 http://www.linuxidc.com/Linux/2013-12/93519.htm
Linux awk文本分析工具 http://www.linuxidc.com/Linux/2015-12/126217.htm
Linux文本處理工具之awk http://www.linuxidc.com/Linux/2015-01/111437.htm
如何在Linux中使用awk命令 http://www.linuxidc.com/Linux/2014-10/107542.htm
文本分析工具-awk http://www.linuxidc.com/Linux/2014-12/110939.htm
AWK入門基礎教程 http://www.linuxidc.com/Linux/2016-12/138138.htm
使用awk格式化輸出文本 http://www.linuxidc.com/Linux/2016-04/130193.htm