首頁 >php教程 >PHP开发 >awk命令詳解

awk命令詳解

高洛峰
高洛峰原創
2016-12-12 16:12:161433瀏覽

简单使用:

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

     设置大小写: 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命令詳解:

awk命令詳解

例: awk 'END {print NR}' temp    在最後印製已讀取記錄條數

     awk '{print NF,NR,$0} ENDEND >0 && $4~/Brown/) print $0}' temp  至少有一筆記錄且包含Brown

    NF的另一用法:  echo $PWD | awk -F/ '{print $NF}'   顯示目前目錄名稱

2.5.     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    };END {print tot}' temp         只顯示最後的結果

     文件長度相加:

 ls -l|awk '/^[^d]/ {print $

 ls -l|awk '/^[^d]/ {print $

 ls -l|awk '/^[^d]/ {print $ {print "totKB:" tot}'

     只列出檔案名稱:

 ls -l|awk '{print $9}'     

 gsub(r,s)           在整個$0中使用s替代r

 awk 'gsub(/name/,"xing 中用s替代r

 index(s,t)          為下字串t的第一個位置

 awk 'BEGIN {print 回傳s的長度

 match(s,r)          是否為對上配對r的字串

 awk '$1=="J.Lulu" {print match($1," split(s,a,fs)       在fs上將s分成序列a

 awk 'BEGIN {print split("12#345#6789",myarray,"#")"'

 y ]="12", myarray[2]="345", myarray[3]="6789"

 sprint(fmt,exp)     返回經fmt格式化後的exp

 在最左邊最長的子字串中用s取代r(只更換第一個遇到的符合字串)

 substr(s,p)         在p開始的字串中傳回字串s中從p開始的字尾部分

 substr(s,請返回字串s中從p開始的字尾部分

 substr(s,p ,n)       返回字串s中從p開始長度為n的字尾部分

 

2.7.     printf函數的使用:

"輸出A

 awk 'BEGIN {printf "%fn",999}'        輸出999.0000000

 格式化輸出:awk '{printf "%-15s %sn左對齊顯示

 

2.8.     其他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 f 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 totalpoints points

     print "Club student total points points" tot 母親  

 }

 

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)

🎠(

一.條件)

語句1

else

語句2

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

if(表達式)

{語句1}


else if(表達式)
{語句2}
else

{語句3}

@localhost nginx]# awk 'BEGIN{ 

test=100;

if(test>90)

{

    print "非常

else

{
    print "no pass";
}
}'

very good

 

每條指令語句後面可以用「;」號結尾。

 

二.循環語句(while,for,do)

1.while語句

格式:

while(表達式)

} awk 'BEGIN{ 

test=100;

total=0;

while(i{

    total+=i;

    i++;

}

.

for迴圈有兩種格式:

格式1:

for(變數in 陣列)

{語句}

範例:

[chengmo@localhost nginx]# aw範例:

[chengmo@localhost nginx]# awg 'RONBIN  
{
    print k"="ENVIRON[k];
}
}'

AWKPATH=.:/usr/share/awk
OLDPWD=/home/web97
/SS_ASKPASSc/home/web -askpass
SELINUX_LEVEL_REQUESTED=
SELINUX_ROLE_REQUESTED=

LANG=zh_CN.GB2312

。 。 。 。 。 。

說明:ENVIRON 是awk常數,是子典型數組。

格式2:

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

{語句}

範例:


[chengmo@localhost nginx]# awk 'BEGIN{ 
[chengmo@localhost nginx]# awk 'BEGIN{ 
[3]]; i{
    total+=i;

}

print total;
}'

5050

3.do循環範例:

[chengmo@localhost nginx]# awk 'BEGIN{ 

total=0;

i=0;

do

{

    total+=i;

do

{

    total+=i;

}'

5050

 

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



陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
上一篇:AWK指令使用下一篇:AWK指令使用