unix的AWK命令介紹(轉)
awk語言的最基本功能是在檔案或字串中基於指定規則瀏覽和抽取資訊,awk抽取資訊後,才能進行其他文字操作,完整的awk指令碼通常用來格式化文字檔案中的資訊
呼叫awk:
第一種,命令列方式,如:awk [-F
field-separator] 'commands' input-file(s)
這裡commands是真正的awk命令,[-F域分隔符]是可選的,awk預設使用空格分隔,因此如果要瀏覽域間有空格的文字,不必指定這個選項,但如果瀏覽如passwd檔案,此檔案各域使用冒號作為分隔符,則必須使用-F選項:
awk -F : 'commands' input-file
第二種,將所有awk命令插入一個檔案,並使awk程式可執行,然後用awk命令直譯器作為指令碼的首行,以便透過鍵入指令碼名稱來呼叫它
第三種,將所有awk命令插入一個單獨檔案,然後呼叫: awk -f awk-script-file input-file
-f選項指明在檔案awk-script-file的awk指令碼,input-file是使用awk進行瀏覽的檔名
awk指令碼:
awk指令碼由各種操作和模式組成,根據分隔符(-F選項),預設為空格,讀取的內容依次放置到對應的域中,一行一行記錄讀取,直到檔案尾
模式和動作:任何awk語句都是由模式和動作組成,在一個awk指令碼中可能有許多語句。模式部分決定動作語句何時觸發及觸發事件。動作即對資料進行的操作,如果省去模式部分,動作將時刻保持執行狀態
模式可以是任何條件語句或複合語句或正規表示式,模式包含兩個特殊欄位BEGIN和END,使用BEGIN語句設定計數和列印頭,BEGIN語句使用在任何文字瀏覽動作之前,之後文字瀏覽動作依據輸入檔案開始執行;END語句用來在awk完成文字瀏覽動作後列印輸出文字總數和結尾狀態標誌,有動作必須使用{}括起來
實際動作在大括號{}內指明,常用來做列印動作,但是還有更長的程式碼如if和迴圈looping語句及迴圈退出等,如果不指明採取什麼動作,awk預設列印出所有瀏覽出的記錄
域和記錄:
awk執行時,其瀏覽標記為$1,$2...$n,這種方法稱為域標記.使用$1,$3表示參照第1和第3域,注意這裡使用逗號分隔域,使用$0表示使用所有域
例:awk
'{print $0}' temp.txt > sav.txt 表示列印所有域並把結果重定向到sav.txt中
awk
'{print $0}' temp.txt|tee sav.txt 和上例相似,不同的是將在螢幕上顯示出來
awk '{print
$1,$4}' temp.txt 只列印出第1和第4域
awk 'BEGIN {print "NAME
GRADEn-------------"} {print $1"t"$4}'
temp.txt
表示打資訊頭,即輸入的內容的第一行前加上"NAME
GRADEn-------------",同時內容以tab分開
awk 'BEGIN {print "being"} {print $1}
END {print "end"}' temp 同時列印資訊頭和資訊尾
條件運算子:
=、~匹配正規表示式、!~不匹配正規表示式
匹配:awk '{if ($4~/ASIMA/) print $0}' temp
表示如果第四個域包含ASIMA,就列印整條
awk '$0 ~ /ASIMA/' temp
表示只要整條包含ASIMA就列印出來
精確匹配:awk '$3=="48" {print
$0}' temp 只列印第3域等於"48"的記錄
不匹配: awk '$0 !~
/ASIMA/' temp 列印整條不包含ASIMA的記錄
不等於: awk
'$1 != "asima"' temp
小於: awk '{if
($1 設定大小寫:
awk '/[Gg]reen/' temp 列印整條包含Green,或者green的記錄
任意字元: awk '$1 ~/^...a/'
temp 列印第1域中第四個字元是a的記錄,^行首,.任意字元
或關係匹配: awk
'$0~/(abc)|(efg)/' temp 使用|時,語句需要括起來
AND與關係: awk '{if ( $1=="a" && $2=="b" ) print $0}'
temp
OR或關係: awk '{if ($1=="a" || $1=="b")
print $0}' temp
awk內建變數:
ARGC 命令列引數個數 AGRV 命令列引數排列 ENVIRON 支援佇列中系統環境變數的使用
FILENAME
awk瀏覽的檔名 FNR 瀏覽檔案的記錄數 FS 設定輸入域分隔符,同- F選項
NF 瀏覽記錄的域個數 NR
已讀的記錄數 OFS 輸出域分隔符
ORS 輸出記錄分隔符 RS 控制記錄分隔符
例:
awk 'END {print NR}' temp 在最後列印已讀記錄條數
awk '{print NF,NR,$0} END
{print FILENAME}' temp
awk '{if (NR>0 && $4~/Brown/)
print $0}' temp 至少存在一條記錄且包含Brown
NF的另一用法:
echo $PWD | awk -F/ '{print $NF}' 顯示當前目錄名
awk運算子:
在awk中使用運算子,基本表示式可以劃分成數字型、字串型、變數型、域及陣列元素
設定輸入域到變數名:
awk '{name=$1;six=$3; if (six=="man")
print name " is " six}' temp
域值比較操作:
awk 'BEGIN {BASE="27"} {if ($4
awk '{if ($1=="asima")
$6=$6-1;print $1,$6,$7}' temp
修改文字域:
awk '{if ($1=="asima) ($1=="desc");print $1}' temp
只顯示修改記錄:(只顯示所需要的,區別上一條命令,注意{})
awk '{if ($1=="asima) {$1=="desc";print$1}}'
temp
建立新的輸出域:
awk '{$4=$3-$2; print
$4}' temp
統計列值:
awk '(tot+=$3);END
{print tot}' temp 會顯示每列的內容
awk '{(tot+=$3)};END {print tot}'
temp 只顯示最後的結果
檔案長度相加:
ls
-l|awk '/^[^d]/ {print $9"t"$5} {tot+=$5} END{print "totKB:" tot}'
只列出檔名:
ls -l|awk '{print $9}'
常規情況檔名是第9域
awk內建字串函式:
gsub(r,s) 在整個$0中用s替代r
awk
'gsub(/name/,"xingming") {print $0}' temp
gsub(r,s,t) 在整個t中用s替代r
index(s,t) 返回s中字串t的第一位置
awk 'BEGIN
{print index("Sunny","ny")}' temp 返回4
length(s) 返回s的長度
match(s,r) 測試s是否包含匹配r的字串
awk
'$1=="J.Lulu" {print match($1,"u")}' temp 返回4
split(s,a,fs) 在fs上將s分成序列a
awk 'BEGIN {print
split("12#345#6789",myarray,"#")"'
返回3,同時myarray[1]="12",
myarray[2]="345", myarray[3]="6789"
sprint(fmt,exp) 返回經fmt格式化後的exp
sub(r,s) 從$0中最左邊最長的子串中用s代替r(只更換第一遇到的匹配字串)
substr(s,p) 返回字串s中從p開始的字尾部分
substr(s,p,n) 返回字串s中從p開始長度為n的字尾部分
printf函式的使用:
字元轉換: echo "65" |awk '{printf "%cn",$0}'
輸出A
awk 'BEGIN {printf "%fn",999}'
輸出999.000000
格式化輸出:awk '{printf "%-15s
%sn",$1,$3}' temp 將第一個域全部左對齊顯示
其他awk用法:
向一行awk命令傳值:
awk '{if ($5
awk指令碼命令:
開頭使用
!/bin/awk -f ,如果沒有這句話自含指令碼將不能執行,例子:
- !/bin/awk -f
- # all comment lines must start with a hash '#'
- # name: student_tot.awk
- # to call: student_tot.awk grade.txt
- # prints total and average of club student points
- # print a header first
- BEGIN
- {
- print "Student Date Member No. Grade Age Points Max"
- print "Name Joined Gained Point Available"
- print "================================================================="
- }
- # let's add the scores of points gained
- (tot+=$6);
- # finished processing now let's print the total and average point
- END
- {
- print "Club student total points :" tot
- print "Average Club Student points :" tot/N
- }
awk陣列:
awk的迴圈基本結構 For (element in array) print array[element]
awk 'BEGIN
{record="123#456#789";split(record,myarray,"#")}
END { for (i in
myarray) {print myarray[i]} }
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/74808/viewspace-1037214/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- AWK 陣列介紹陣列
- linux的awk命令Linux
- awk命令
- installer 命令介紹
- Linux:“awk”命令的妙用Linux
- Linux命令之grep/sed/awk等行轉列Linux
- Linux xargs命令介紹Linux
- Linux useradd 命令介紹Linux
- Shell echo命令介紹
- 【UNIX】DBA常用的linux命令Linux
- Linux重啟命令介紹Linux
- SVN命令列使用介紹命令列
- 簡單介紹 ldd 命令
- 『學了就忘』Linux基礎 — 1、UNIX系統介紹Linux
- Linux awk 命令詳解Linux
- awk命令使用例項
- Linux系統中的管道命令、grep命令、sed命令和awk命令Linux
- UNIX 常用命令
- Tmux 終端命令列介紹UX命令列
- 【Redis】常用命令介紹Redis
- netcat 命令介紹及使用示例
- 【Linux】jq 命令介紹和使用Linux
- Linux常用命令介紹Linux
- RPM常用命令介紹
- Hadoop進階命令使用介紹Hadoop
- Linux 關機命令介紹shutdownLinux
- linux基本命令介紹(二)Linux
- linux基本命令介紹(一)Linux
- Zookeeper 四字命令介紹
- sftp常用命令介紹FTP
- 【轉】恢復archivelog介紹Hive
- 『忘了再學』Shell基礎 — 27、AWK程式設計的介紹和基本使用程式設計
- 進行Linux效能監控的命令介紹Linux
- 介紹一些有趣的MySQL pager命令MySql
- weex-toolkit工具的相關命令介紹
- powermt 命令簡介(轉載)
- 使用 awk 命令統計文字
- 技能篇:awk教程-linux命令Linux
- Linux中awk命令詳解Linux