1. AWK
1. 基礎知識
print $0的含義是打印整行,輸出到stdout。
-F參數設置的是awk的初始化變量FS(我們在後面的章節將講到這個變量)。FS變量控制着awk的字段分隔符,默認情況下是空白字符。
在BEGIN代碼塊中,完成awk部分參數的初始化操作。END代碼塊,它是在所有的輸入都處理完後awk運行的代碼。
awk的變量在建立時的初始值都是空字符串,但是當需要數值時,它會被視爲0。
awk允許在數組名稱之後,以方括號將任意數字或字符串表達式括起來作爲索引。
數組也無需聲明就能使用。數組的存儲空間在引用新元素時會自動增長。
delete array[index]會從數組中刪除元素,而delete array會刪除array數組中的所有元素。
在awk中只能使用print;不能使用echo。
在awk中使用的變量,不需要,使用$var
引用變量。直接使用var
即可獲取到值。 、
awk核心代碼塊的執行次數和操作文件的行數一致; BEGIN和END只會執行一次
2. awk常見的內建變量
變量
描述
FILENAME
當前輸入文件的名稱
FNR
當前輸入文件的記錄數
FS
文件分隔符(默認爲空格,支持正則表達式)
NF
當前記錄的字段數
NR
在工作中的記錄數
OFS
輸出字段分割字符
ORS
輸出記錄分割字符(默認爲 “\n”)
RS
輸入記錄分割字符
ARGC
傳入的參數個數 eg: awk 'BEGIN{print "Args=", ARGC}' 1 2 343 4
ARGV
傳入的參數 eg: awk 'BEGIN{print "Argv1=", ARGV[1]}' 1 2 343 4
;ARGV[0]爲awk;從ARGV[1]開始,纔是參數。
3. awk標準選項
選項
描述
示例
-v
該選項將一個值賦予一個變量,它會在程序開始之前進行賦值
awk -v name1=alex 'BEGIN{printf "name=%s\n", name1}'
4. awk條件判斷(&& || !)
if ( condition1 && condition2) {
statement.. .
} else if ( condition1 || condition2) {
statement.. .
} else {
statement.. .
}
5. awk循環
while循環
BEGIN {
print "while is begin...."
}
{
item= 1
while( item < 10 ) {
item+= item
}
}
END {
print "while is end, item : " item
}
do…while循環
{
count= 1
do {
print "count: " count++
} while( count != 10)
}
for循環
BEGIN{
print "This is begin..."
}
{
for( i= 1; i<= 10; i++) {
print "item: " i
}
}
END {
print "This is end..."
}
6. awk執行流程
Created with Raphaël 2.2.0 awk-BEGIN代碼塊 讀取文件一行數據 執行awk代碼塊 是否讀取文件還有剩餘行? awk-END代碼塊 yes no
7. 小案列
設置文件分隔符。
awk –F ":" '{print "USER: "$1 "\t SHELL: "$7 }' /tmp/passwd.piece
設置的分隔符爲正則表達式
awk -F "[\t ]+" '{print "DEVICE: "$1 "\t FSTYPE: "$3 }' /etc/fstab
符合正則表達式時,執行腳本
awk '/nologin/ {++adder}' num1.txt
使用條件判斷
awk '{if ($1 >100){count++; print $1 } \
else{count--;print $2 }}' num2.txt
使用awk腳本來執行批量的awk指令,操作文件。
num1.awk
BEGIN{
FS= ":"
print "This is begin!"
}
{
if( $1 > 100 && $1 < 200) {
print $1 " is more than 100"
} else if( $1 > 200) {
print $1 " is more than 200"
} else {
less_than_100++
print $1 " is less than 100"
}
}
END{
print "Less than 100, count: " less_than_100
}
awk -f num1.awk num1.txt