1. 程式人生 > >Linux Shell指令碼程式設計--awk命令詳解

Linux Shell指令碼程式設計--awk命令詳解

簡單使用:

awk :對於檔案中一行行的獨處來執行操作 。

awk -F :'{print $1,$4}'   :使用‘:’來分割這一行,把這一行的第一第四個域打印出來 。

詳細介紹:

AWK命令介紹

awk語言的最基本功能是在檔案或字串中基於指定規則瀏覽和抽取資訊,awk抽取資訊後,才能進行其他文字操作,完整的awk指令碼通常用來格式化文字檔案中的資訊

1.   呼叫awk:

第一種命令列方式,:

awk [-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進行瀏覽的檔名

2.   awk指令碼:

    awk指令碼由各種操作和模式組成,根據分隔符(-F選項),預設為空格,讀取的內容依次放置到對應的域中,一行一行記錄讀取,直到檔案尾

2.1.      模式和動作   

任何awk語句都是由模式和動作組成,在一個awk指令碼中可能有許多語句。模式部分決定動作語句何時觸發及觸發事件。動作即對資料進行的操作,如果省去模式部分,動作將時刻保持執行狀態

    模式可以是任何條件語句或複合語句或正則表示式,模式包含兩個特殊欄位BEGIN和END,使用BEGIN語句設定計數和列印頭,BEGIN語句使用在任何文字瀏覽動作之前,之後文字瀏覽動作依據輸入檔案開始執行;END語句用來在awk完成文字瀏覽動作後列印輸出文字總數和結尾狀態標誌,有動作必須使用{}括起來

    實際動作在大括號{}內指明,常用來做列印動作,但是還有更長的程式碼如if和迴圈looping語句及迴圈退出等,如果不指明採取什麼動作,awk預設打印出所有瀏覽出的記錄

2.2.     域和記錄:

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  GRADE\n----"} {print $1"\t"$4}' temp.txt 

表示打資訊頭,即輸入的內容的第一行前加上"NAME  GRADE\n-------------",同時內容以tab分開

awk 'BEGIN {print "being"} {print $1} END {print "end"}' temp 

同時列印資訊頭和資訊尾

2.3.     條件操作符:

    <、<=、==、!=、>=、~匹配正則表示式、!~不匹配正則表示式

    匹配:awk '{if ($4~/ASIMA/) print $0}' temp 表示如果第四個域包含ASIMA,就列印整條

    精確匹配:awk '$3=="48" {print $0}' temp    只打印第3域等於"48"的記錄

    不匹配:  awk '$0 !~ /ASIMA/' temp      列印整條不包含ASIMA的記錄

    不等於:  awk '$1 != "asima"' temp

    小於:    awk '{if ($1<$2) print $1 "is smaller"}' temp

    設定大小寫: 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

2.4.     awk內建變數:

ARGC  

命令列引數個數

NF    

 瀏覽記錄的域個數

AGRV  

命令列引數排列

NR  

已讀的記錄數   

ENVIRON  

支援佇列中系統環境變數的使用

OFS  

輸出域分隔符

FILENAME  

awk瀏覽的檔名  

ORS 

輸出記錄分隔符

FNR  

瀏覽檔案的記錄數  

RS  

控制記錄分隔符

FS  

設定輸入域分隔符,同- F選項

NF    

 瀏覽記錄的域個數

例: 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}'   顯示當前目錄名

2.5.     awk操作符:

在awk中使用操作符,基本表示式可以劃分成數字型、字串型、變數型、域及陣列元素

設定輸入域到變數名:

    awk '{name=$1;six=$3; if (six=="man") print name " is " six}' temp

    域值比較操作:

awk 'BEGIN {BASE="27"} {if ($4<BASE) print $0}' temp

    修改數值域取值:(原輸入檔案不會被改變)

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域

2.6.     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的字尾部分

2.7.     printf函式的使用:

字元轉換: echo "65" |awk '{printf "%c\n",$0}'    輸出A

            awk 'BEGIN {printf "%f\n",999}'        輸出999.000000

格式化輸出:awk '{printf "%-15s %s\n",$1,$3}' temp 將第一個域全部左對齊顯示

2.8.     其他awk用法:

    向一行awk命令傳值:

awk '{if ($5<AGE) print $0}' AGE=10 temp

who | awk '{if ($1==user) print $1 " are in " $2 ' user=$LOGNAME 使用環境變數

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

}

2.9.     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]} }

3.0  awk中自定義語句

一.條件判斷語句(if)

if(表示式) #if ( Variable in Array )
語句1
else
語句2

格式中"語句1"可以是多個語句,如果你為了方便Unix awk判斷也方便你自已閱讀,你最好將多個語句用{}括起來。Unix awk分枝結構允許巢狀,其格式為:

if(表示式)

{語句1}

else if(表示式)
{語句2}
else
{語句3}

[[email protected] nginx]# awk 'BEGIN{
test=100;
if(test>90)
{
    print "very good";
}
else if(test>60)
{
    print "good";
}
else
{
    print "no pass";
}
}'

very good

每條命令語句後面可以用“;”號結尾。

二.迴圈語句(while,for,do)

1.while語句

格式:

while(表示式)

{語句}

例子:

[[email protected] nginx]# awk 'BEGIN{
test=100;
total=0;
while(i<=test)
{
    total+=i;
    i++;
}
print total;
}'
5050

2.for 迴圈

for迴圈有兩種格式:

格式1:

for(變數 in 陣列)

{語句}

例子:

[[email protected] nginx]# awk 'BEGIN{
for(k in ENVIRON)
{
    print k"="ENVIRON[k];
}
}'

AWKPATH=.:/usr/share/awk
OLDPWD=/home/web97
SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass
SELINUX_LEVEL_REQUESTED=
SELINUX_ROLE_REQUESTED=
LANG=zh_CN.GB2312

。。。。。。

說明:ENVIRON 是awk常量,是子典型陣列。

格式2:

for(變數;條件;表示式)

{語句}

例子:

[[email protected] nginx]# awk 'BEGIN{
total=0;
for(i=0;i<=100;i++)
{
    total+=i;
}
print total;
}'

5050

3.do迴圈

格式:

do

{語句}while(條件)

例子:

[[email protected] nginx]# awk 'BEGIN{
total=0;
i=0;
do
{
    total+=i;
    i++;
}while(i<=100)
print total;
}'
5050

以上為awk流程控制語句,從語法上面大家可以看到,與c語言是一樣的。有了這些語句,其實很多shell程式都可以交給awk,而且效能是非常快的。

break 當 break 語句用於 while 或 for 語句時,導致退出程式迴圈。
continue 當 continue 語句用於 while 或 for 語句時,使程式迴圈移動到下一個迭代。
next 能能夠導致讀入下一個輸入行,並返回到指令碼的頂部。這可以避免對當前輸入行執行其他的操作過程。
exit 語句使主輸入迴圈退出並將控制轉移到END,如果END存在的話。如果沒有定義END規則,或在END中應用exit語句,則終止指令碼的執行。

相關推薦

Linux Shell指令碼程式設計awk命令

簡單使用: awk :對於檔案中一行行的獨處來執行操作 。 awk -F :'{print $1,$4}'   :使用‘:’來分割這一行,把這一行的第一第四個域打印出來 。 詳細介紹: AWK命令介紹 awk語言的最基本功能是在檔案或字串中基於指定規則瀏覽和抽取資訊,awk抽取資訊後,才能進行其他

Linux Shell指令碼程式設計cut命令

cut cut命令可以從一個文字檔案或者文字流中提取文字列。 cut語法 [[email protected] ~]# cut -d'分隔字元' -f fields <==用於有特定分隔字元 [[email protected] ~]# cut

Linux Shell指令碼程式設計scp命令

不同的Linux之間copy檔案常用有3種方法: 第一種就是ftp,也就是其中一臺Linux安裝ftp Server,這樣可以另外一臺使用ftp的client程式來進行檔案的copy。 第二種方法就是採用samba服務,類似Windows檔案copy 的方式來操作,比較簡潔方便。 第三種就是利用scp命令來

Linux Shell指令碼程式設計sed命令

簡介 sed 是一種線上編輯器,它一次處理一行內容。處理時,把當前處理的行儲存在臨時緩衝區中,稱為“模式空間”(pattern space),接著用sed命令處理緩衝區中的內容,處理完成後,把緩衝區的內容送往螢幕。接著處理下一行,這樣不斷重複,直到檔案末尾。檔案內容並沒有

Linux Shell指令碼程式設計xargs命令

xargs是給命令傳遞引數的一個過濾器,也是組合多個命令的一個工具。它把一個數據流分割為一些足夠小的塊,以方便過濾器和命令進行處理。通常情況下,xargs從管道或者stdin中讀取資料,但是它也能夠從檔案的輸出中讀取資料。xargs的預設命令是echo,這意味著通過管道傳遞給xargs的輸入將會包含換行和空

Linux Shell指令碼程式設計 --awk命令

簡單使用: awk :對於檔案中一行行的獨處來執行操作 。 awk -F :'{print $1,$4}'   :使用‘:’來分割這一行,把這一行的第一第四個域打印出來 。    

Linux Shell指令碼程式設計函式返回值

Shell函式返回值,常用的兩種方式:return,echo 1) return 語句shell函式的返回值,可以和其他語言的返回值一樣,通過return語句返回。示例: #!/bin/sh function test() { echo "arg1 =

Linux-Shell指令碼程式設計基礎(1)

1. 我們一般在使用Linux系統的時候,都活接觸到shell指令碼的使用,例如我們經常在linux系統中使用的ls命令、cd命令等,都是衣蛾簡單而又基本的shell命令,在 linux系統中我們一般的使用如下的格式來進行shell指令碼的編寫: (1)格式 #!bin/bash e

從新手到系統管理員(四):Linux Shell指令碼程式設計之數學(Part I)

本文由 [茶話匯] – [Qing] 編譯自 [Avishek Kumar] 轉載請註明出處 這部分主要討論數學相關的shell指令碼程式設計。 加法運算 新建一個檔案“Addition.sh”,輸入下面的內容並賦予其可執行的許可權。 [code language=”bash”] #!/bin/b

Linux Shell指令碼程式設計提高(12)

實際上Shell是一個命令直譯器,它解釋由使用者輸入的命令並且把它們送到核心,不僅如此,Shell有自己的程式語言用於對命令的編輯,它允許使用者編寫由shell命令組成的程式.Shel程式語言具有普通程式語言的很多特點,比如它也有迴圈結構和分支控制結構等,用這種程式語言編寫的Shell程式與其他應用程式具有同

Linux shell指令碼程式設計-將一行中的某個部分去重

一,背景。 今天遇到了一個使用場景,獲取檔案中每一行的某個屬性資料,然後將該屬性資料去重。 二,shell指令碼編寫。 bash 1 #!/bin/bash 2 for line in `cat test1|awk -F "|"

Linux Shell 指令碼程式設計(3)—Shell輸入與輸出

shell 輸入與輸出 提綱: echo read cat 管道 tee 檔案重定向

一文學會Linux-shell指令碼程式設計基礎

終於到shell 指令碼這章了,在以前筆者賣了好多關子說shell指令碼怎麼怎麼重要,確實shell指令碼在linux系統管理員的運維工作中非常非常重要。下面筆者就帶你正式進入shell指令碼的世界吧。 到現在為止,你明白什麼是shell指令碼嗎?如果明白最好了,不明白

shell指令碼嵌入expect和awk命令

網上查了好多資料 感覺也沒怎麼看明白 哭暈在廁所 我這智商是不是得轉產品去了額。。。 主要是因為寫了好幾個版本 最後把能用的都改瞎了 看來還得再寫幾個別的 總結總結才好 總之 注意幾點: 1、expect程式碼塊裡面末尾需要寫 interact(但是我寫

Linux-Shell指令碼程式設計-學習-4-Shell程式設計-運算元字-加減乘除計算

對於任何一種程式語言都很重要的特性就是運算元字的能力,遺憾的是,對於shell指令碼來說,這個過程比較麻煩,在shell指令碼中有兩種途徑來進行數學運算操作。 1.expr 最開始的時候,shell提供了一個特別的命令來梳理數學表示式,expr允許在命令列上處理數學表示式

shell程式設計awk命令

linux本篇部落格主要介紹linux常用命令中的對文字和資料進行處理的命令awk的用法。awk命令awk是一種程式語言,用於在linux/unix下對文字和資料進行處理。資料可以來自標準輸入(stdin)、一個或多個檔案,或其它命令的輸出。它支援使用者自定義函式和動態正則表示式等先進功能,是linux/un

Linux shell指令碼程式設計之函式

在編寫功能比較複雜的shell指令碼時,完成具體任務的程式碼有時會被重複使用,bash shell指令碼提供函式特性實現程式碼複用,函式是被賦予名稱的指令碼程式碼塊。 一、建立函式 在bash shell指令碼中建立函式的格式如下: function name() {

linux指令碼 awk命令

轉載自:http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858470.html 簡介 awk是一個強大的文字分析工具,相對於grep的查詢,sed的編輯,awk在其對資料分析並生成報告時,顯得尤為強大。簡單來說awk

linuxawk命令

數學函數 mat loop 多次 finished 數組結構 save pre 新的 awk是一種程序語言,對文檔資料的處理具有很強的功能。awk名稱是由它三個最初設計者的姓氏的第一個字母而命名的: Alfred V. Aho、Peter J. We i n b e rg

【轉】linux awk命令

column 環境變量 最後一行 工作流程 初始 文本文件 for循環 其中 cti 簡介 awk是一個強大的文本分析工具,相對於grep的查找,sed的編輯,awk在其對數據分析並生成報告時,顯得尤為強大。簡單來說awk就是把文件逐行的讀入,以空格為默認分隔符將每行切