awk是什么?awk工作原理是什么?怎么用awk?

一、awk介紹?
1. awk概述awk是一種==編程語言==,主要用于在linux/unix下對==文本和數(shù)據(jù)==進行處理,是linux/unix下的一個工具。數(shù)據(jù)可以來自標準輸入、一個或多個文件,或其它命令的輸出。awk的處理文本和數(shù)據(jù)的方式:==逐行掃描==文件,默認從第一行到最后一行,尋找匹配的==特定模式==的行,并在這些行上進行你想要的操作。awk分別代表其作者姓氏的第一個字母。因為它的作者是三個人,分別是Alfred Aho、Brian Kernighan、Peter Weinberger。gawk是awk的GNU版本,它提供了Bell實驗室和GNU的一些擴展。?
下面介紹的awk是以GNU的gawk為例的,在linux系統(tǒng)中已把awk鏈接到gawk,所以下面全部以awk進行介紹。2. awk能干啥?awk==用來處理文件和數(shù)據(jù)==的,是類unix下的一個工具,也是一種編程語言可以用來==統(tǒng)計數(shù)據(jù)==,比如網(wǎng)站的訪問量,訪問的IP量等等支持條件判斷,支持for和while循環(huán)二、awk使用方式1. ==命令行模式使用==1)語法結(jié)構(gòu)awk?選項?'命令部分'?文件名特別說明:引用shell變量需用雙引號引起2)常用選項介紹==-F==?定義字段分割符號,默認的分隔符是==空格==-v?定義變量并賦值3)=='==命名部分說明=='==正則表達式,地址定位'/root/{awk語句}' ??????sed中:?'/root/p''NR==1,NR==5{awk語句}' ?????sed中:?'1,5p''/^root/,/^ftp/{awk語句}' ??sed中:'/^root/,/^ftp/p'{awk語句1==;==awk語句2==;==...}'{print $0;print $1}' ???sed中:'p''NR==5{print $0}' ???????sed中:'5p'注:awk命令語句間用分號間隔BEGIN...END....'BEGIN{awk語句};{處理中};END{awk語句}''BEGIN{awk語句};{處理中}''{處理中};END{awk語句}'2.?腳本模式使用1)腳本編寫#!/bin/awk -f ???定義魔法字符以下是awk引號里的命令清單,不要用引號保護命令,多個命令用分號間隔BEGIN{FS=":"}NR==1,NR==3{print $1"\t"$NF}...2)腳本執(zhí)行方法1:awk?選項?-f awk的腳本文件 要處理的文本文件awk -f awk.sh filenamesed -f sed.sh -i filename方法2:./awk的腳本文件(或者絕對路徑)?要處理的文本文件./awk.sh filename./sed.sh filename三、?awk內(nèi)部相關變量變量變量說明備注==$0==當前處理行的所有記錄==\$1,\$2,\$3...\$n==文件中每行以==間隔符號==分割的不同字段awk -F: '{print \$1,\$3}'==NF==當前記錄的字段數(shù)(列數(shù))awk -F: '{print NF}'==$NF==最后一列$(NF-1)表示倒數(shù)第二列==FNR/NR==行號==FS==定義間隔符'BEGIN{FS=":"};{print \$1,$3}'==OFS==定義輸出字段分隔符,==默認空格=='BEGIN{OFS="\t"};print \$1,$3}'RS輸入記錄分割符,默認換行'BEGIN{RS="\t"};{print $0}'ORS輸出記錄分割符,默認換行'BEGIN{ORS="\n\n"};{print \$1,$3}'FILENAME當前輸入的文件名1、==常用內(nèi)置變量舉例==# awk -F: '{print $1,$(NF-1)}' 1.txt# awk -F: '{print $1,$(NF-1),$NF,NF}' 1.txt# awk '/root/{print $0}' 1.txt# awk '/root/' 1.txt# awk -F: '/root/{print $1,$NF}' 1.txt root /bin/bash# awk -F: '/root/{print $0}' 1.txt ??root:x:0:0:root:/root:/bin/bash# awk 'NR==1,NR==5' 1.txt # awk 'NR==1,NR==5{print $0}' 1.txt# awk 'NR==1,NR==5;/^root/{print $0}' 1.txt root:x:0:0:root:/root:/bin/bashroot:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologinadm:x:3:4:adm:/var/adm:/sbin/nologinlp:x:4:7:lp:/var/spool/lpd:/sbin/nologin2、內(nèi)置變量分隔符舉例FS和OFS:# awk 'BEGIN{FS=":"};/^root/,/^lp/{print $1,$NF}' 1.txt# awk -F: 'BEGIN{OFS="\t\t"};/^root/,/^lp/{print $1,$NF}' 1.txt ???root ?????/bin/bashbin ??????/sbin/nologindaemon ????/sbin/nologinadm ??????/sbin/nologinlp ??????/sbin/nologin# awk -F: 'BEGIN{OFS="@@@"};/^root/,/^lp/{print $1,$NF}' 1.txt ??root@@@/bin/bashbin@@@/sbin/nologindaemon@@@/sbin/nologinadm@@@/sbin/nologinlp@@@/sbin/nologin[root@server shell07]# RS和ORS:修改源文件前2行增加制表符和內(nèi)容:vim 1.txtroot:x:0:0:root:/root:/bin/bash hello ?worldbin:x:1:1:bin:/bin:/sbin/nologin ???test1 ?test2# awk 'BEGIN{RS="\t"};{print $0}' 1.txt# awk 'BEGIN{ORS="\t"};{print $0}' 1.txt四、?awk工作原理awk -F: '{print $1,$3}' /etc/passwd?
awk使用一行作為輸入,并將這一行賦給內(nèi)部變量$0,每一行也可稱為一個記錄,以換行符(RS)結(jié)束?
每行被間隔符==:==(默認為空格或制表符)分解成字段(或域),每個字段存儲在已編號的變量中,從$1開始?
問:awk如何知道用空格來分隔字段的呢??
答:因為有一個內(nèi)部變量==FS==來確定字段分隔符。初始時,F(xiàn)S賦為空格?
awk使用print函數(shù)打印字段,打印出來的字段會以==空格分隔==,因為\$1,\$3之間有一個逗號。逗號比較特殊,它映射為另一個內(nèi)部變量,稱為==輸出字段分隔符==OFS,OFS默認為空格?
awk處理完一行后,將從文件中獲取另一行,并將其存儲在$0中,覆蓋原來的內(nèi)容,然后將新的字符串分隔成字段并進行處理。該過程將持續(xù)到所有行處理完畢
了解更多網(wǎng)絡知識關注:http://www.vecloud.com/