linux_awk小例子


集群為什么那么慢,等的人無語啊。。。。。。

1:awk '/555555*/' test

打印所有包含模式/555555*/的行

 

2:awk '{print $1}' test

打印文件的第一個字段,字段從行的左端開始,以空白符分隔

 

3:awk '{print $1,$3}' test

打印文件的第一,第三個字段

 

4:awk '/555555/{print $1,$3}' test
打印包含模式/555555/的第一,第三個字段

 

awk原理:

1):awk使用一行作為輸入,並將這一行賦給內部變量$0,默認時每一行也可以稱為一個記錄,以換行符結束。

2):然后,行被空格分解成字段,每一個字段存儲在已編號的變量中,從$1開始,可以多達100個字段。

3):awk如何知道空格是用來分隔字段的呢?因為有另一個內部變量FS用來確定字段的分隔符。初始時,FS被賦為空格——包含制表符和空格符。如果需要使用其他的字符分隔符,如冒號或破折號,則需要將FS變量的值設為新的字段分隔符。

4):awk打印字段時,將以下面的方式使用print函數:{print $1,$3};逗號比較特殊,它映射為另一個內部變量,稱為輸出字段分隔符OFS,OFS默認為空格。逗號被OFS變量中存儲的字符替換。

5):awk輸出之后,將從文件中獲取另一行,並將其存儲到$0中,覆蓋原來的內容,然后將新的字符串分隔成字段並進行處理。這個過程將持續到整個文件的所有行都處理完畢。

 

轉義序列:轉義序列用一個反斜杠后跟一個字母或數字來表示。它們可以用在字符串中,代表制表符,換行符,換頁符等。

 

5:awk '/zhangfei/{print "\t\twu hu shangjiang:" $1,$2 "!"}'

wu hu shangjiang:zhangfei xiuhua!

\t:制表符,tab鍵

 

6.打印數字時,可能需要控制數字的格式。這可以通過printf函數來實現,但是,通過設置一個特殊的awk變量OFMT,使用print函數時也可以控制數字的打印格式。OFMT的默認值時“%.6gd",表示只打印小數部分的前六位。

awk 'BEGIN{OFMT="%.2f";print 1.23456789,12E-2}'

1.23 0.12

如果設置了變量OFMT,在打印浮點數時,就只打印小數部分的前兩位。百分號表示接下來要定義格式。

BEGIN:必須大寫

 

7:

1):[root@localhost tmp]# echo "UNIX" | awk '{printf "|%-15s|\n",$1}'
         |UNIX           |
2):[root@localhost tmp]# echo "UNIX" | awk '{printf "|%15s|\n",$1}'
         |           UNIX|
1): 對於echo命令的輸出,unix是經管道發給awk。printf函數包含一份控制串。百分號讓printf做好准備,它要打印一個占15非格,向左對 齊的字符串,這個字符串夾在兩個豎杠之間,並且以換行符結尾。百分號后的短划線表示左對齊。控制穿后面跟了一個逗號和$1。printf將根據控制串中的 格式說明來格式化字符串unix。

2):字符串unix被打印成一個占15格,向右對齊的字符串,夾在兩個豎杠之間,以換行符結尾。

 


8.[root@localhost tmp]# awk '{printf "The name is: %-15s ID is: %-15d Money is: %-15d\n",$1,$2,$3}' liuguanzhang
The name is: liubei              ID is: 1                Money is: 10000
The name is: guanyu          ID is: 2                Money is: 2000
The name is: zhangfei        ID is: 3                Money is: 1000

9.[root@localhost tmp]# awk '{printf "|%-15s| %-15s| %-15s\n",$1,$2,$3}' liuguanzhang
|liubei             | 1              | 10000
|guanyu         | 2              | 2000
|zhangfei        | 3              | 1000

 

10:root@localhost tmp]# awk '{max=($1>$2)?$1:$2;print max}' filename

如果記錄的第一個字段的值大於第二個字段的值,則把問號后面那個表達式的值賦給max,否則就將冒號后面的那個表單時的賦給max。

 

11:awk -F: 'NF != 7{printf("line %d,does not have 7 fields: %s\n",NR,$0)} $1 !~/[A-Za-z0-9]/{printf("line %d,nonalphanunmeric user id: %s\n",NR,$0)} $2=="*"{printf("line %d,no password:%s\n",NR,$0)}' passwd

awk的字段分隔 符是冒號;如果字段數(NF)不等於7,則執行接下來的操作塊;printf函數打印字符串“line<行號>,does not have 7 fields:”,后面跟上當前記錄的記錄號(NR)和記錄本身($0);如果第一個字段($1)中不含任何字母和數字字符,printf函數就打印字符 串“nonalphanumberic user id:”,后面跟上當前記錄的記錄號和內容;如果第二個字段是一個星號,就打印字符串“no passwd:",后面跟上記錄號和記錄本身.

 

12:awk -F: '/Nancy McNeil/{$1="Louise Mclnnes";print $0}' test

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM