天天看點

linux系統之文本格式化工具awk

一、文本處理工具

grep、sed和awk都是文本處理工具,雖然都是文本處理工具但卻都有各自的優缺點,一種文本處理指令是不能被另一個完全替換的,否則也不會出現三個文本處理指令了。隻不過,相比較而言,sed和awk功能更強大而已,且已獨立成一種語言來介紹。

sed:Stream EDitor,流編輯器,預設隻處理模式空間,不處理原資料,如果你處理的資料是針對行進行處理的,可以使用sed;

awk:報告生成器,格式化以後顯示。如果對處理的資料需要生成報告之類的資訊,或者你處理的資料是按列進行處理的,最好使用awk。

二、awk可以完成的一些功能

将文本檔案看做由記錄和字段組成的文本資料庫

使用變量操作資料庫

使用算術和字元串操作符

使用普通的程式設計結構,例如循環和條件

生幫格式化報告

定義函數

從腳本中執行unix指令

處理unix指令的結果

更加巧妙的處理指令行的參數

更容易地處理多個輸入流

三、文法格式

1、選項

-F fs or --field-separator fs:

指定輸入檔案折分隔符,fs是一個字元串或者是一個正規表達式,如-F:

<a href="http://s3.51cto.com/wyfs02/M00/23/BA/wKioL1NBJRmCP3i8AAHmFxB5UOc722.jpg" target="_blank"></a>

-v 選項定義的變量在腳本運作之前即存在,可以在腳本的 BEGIN 流程中被調用;

<a href="http://s3.51cto.com/wyfs02/M00/23/BA/wKioL1NBJo6ggoygAADZ-2DtPuQ717.jpg" target="_blank"></a>

2、awk的輸出:print和printf

⑴、print的使用格式:

print item1, item2, ...

要點:

①、各項目之間使用逗号隔開,而輸出時則以空白字元分隔;

②、輸出的item可以為字元串或數值、目前記錄的字段(如$1)、變量或awk的表達式;數值會先轉換為字元串,而後再輸出;

③、print指令後面的item可以省略,此時其功能相當于print $0, 是以,如果想輸出空白行,則需要使用print "";

注意,在AWK中,$表示字段,使用者變量不需要加$,這是AWK與shell或者Perl不同之處!在shell中,變量定義時不加$,再次引用時則需要用$,而在Perl中,無論定義和引用時都需要加$ (Perl中$表示标量,另有@和%符号表示數組和Hash變量)。

執行個體

<a href="http://s3.51cto.com/wyfs02/M01/23/B9/wKiom1NBKS_BwfM0AACZkFzCp_s795.jpg" target="_blank"></a>

⑵、printf的使用格式

printf format, item1, item2, ...

format格式的訓示符都以%開頭,後跟一個字元,

%c

轉換數字成ASCII,如printf "%c", 67結果為C。

<a href="http://s3.51cto.com/wyfs02/M02/23/B9/wKiom1NBKiCgOr_tAABvKrxuDWw453.jpg" target="_blank"></a>

%d, %i

列印十進制整數,如printf "%dn", 6.745結果為6。

<a href="http://s3.51cto.com/wyfs02/M01/23/BA/wKioL1NBKk3QABhtAAC4294mCiU316.jpg" target="_blank"></a>

%e, %E

轉換數字為科學(指數)符号,如printf "%4.3en", 6745結果為6.745e+03。

<a href="http://s3.51cto.com/wyfs02/M02/23/BA/wKioL1NBKz7j69JLAAFlB4E30yc055.jpg" target="_blank"></a>

%f

以浮點表示法列印數字,如 printf "%4.3f\n", 6745結果為6745.0000000

<a href="http://s3.51cto.com/wyfs02/M02/23/BA/wKiom1NBLAbTiZHiAABnpSu_Rzo057.jpg" target="_blank"></a>

%s

列印字元串,如printf "%10s\n", 6745結果為十個空格加6745。

<a href="http://s3.51cto.com/wyfs02/M02/23/BA/wKioL1NBLI3S8XyJAABP2IXbdZs195.jpg" target="_blank"></a>

可更改的格式:

N$

位置訓示符,可調整字元串的輸出位置。printf "%s %s %s\n", "I", "lOVE","YOU"輸出為:I LOVE YOU,我們調整一下位置,printf "%3$s %2$s %1$s\n", "YOU", "LOVE","I",輸出結果為:I LOVE YOU

<a href="http://s3.51cto.com/wyfs02/M00/23/BA/wKioL1NBLmigIuXEAADsYHCzwN8582.jpg" target="_blank"></a>

修飾符

N: 顯示寬度;

-: 左對齊;

+:右對齊(也可以顯示數值符号正負之用);

<a href="http://s3.51cto.com/wyfs02/M02/23/BA/wKiom1NBRyWjY4XlAADA52wl3YQ099.jpg" target="_blank"></a>

3、模式和操作

⑴、模式可以是以下任意一個:

/正規表達式/:使用通配符的擴充集。

關系表達式:可以用下面運算符表中的關系運算符進行操作,可以是字元串或數字的比較,如$2&gt;%1選擇第二個字段比第一個字段長的行。

模式比對表達式:用運算符~(比對)和~!(不比對)。

模式,模式:指定一個行的範圍。該文法不能包括BEGIN和END模式。

BEGIN:讓使用者指定在第一條輸入記錄被處理之前所發生的動作,通常可在這裡設定全局變量。

END:讓使用者在最後一條輸入記錄被讀取之後發生的動作。

⑵、操作由一人或多個指令、函數、表達式組成,之間由換行符或分号隔開,并位于大括号内。主要有四部份:

變量或數組指派

輸出指令

内置函數

控制流指令

4、變量

⑴、awk内置變量之記錄變量

FS: field separator

讀取檔案本時,所使用字段分隔符

RS: Record separator

輸入文本資訊所使用的換行符

OFS: Output Filed Separator

輸出字段分隔符(預設值是一個空格)

ORS:Output Row Separator

輸出記錄分隔符(預設值是一個換行符)

<a href="http://s3.51cto.com/wyfs02/M01/23/BA/wKioL1NBNCzhKn2dAAHfTp_8JTE006.jpg" target="_blank"></a>

注:

從$1,$2一直到$NF,整行用$0标,如果$0被賦予新值,所有的$1,$2...和NF都将被重新計算。同樣,若$i被改變,$0将用OFS重新計算。

⑵、awk内置變量之資料變量

NR: The number of input records

awk指令所處理的記錄數;如果有多個檔案,這個數目會把處理的多個檔案中行統一計數

NF:Number of Field

目前記錄的field個數

FNR

目前檔案的相對記錄數

ARGV

數組,儲存指令行本身這個字元串,如awk '{print $0}' a.txt b.txt這個指令中,ARGV[0]儲存awk,ARGV[1]儲存a.txt

ARGC

awk指令的參數的個數

FILENAME

awk指令所處理的檔案的名稱

ENVIRON

目前shell環境變量及其值的關聯數組

NR用法

<a href="http://s3.51cto.com/wyfs02/M02/23/BA/wKioL1NBN1iCKEKLAAHv8FnWF1E842.jpg" target="_blank"></a>

NF用法(預設以空格分隔)

<a href="http://s3.51cto.com/wyfs02/M01/23/BA/wKiom1NBOCewuwqhAAH-50uswW4321.jpg" target="_blank"></a>

FNR用法

<a href="http://s3.51cto.com/wyfs02/M02/23/BA/wKiom1NBOO6xV4-eAAH-1fUFdYs235.jpg" target="_blank"></a>

ARGV用法

<a href="http://s3.51cto.com/wyfs02/M00/23/BA/wKiom1NBPEOCDyCCAAGXmCnWNTc876.jpg" target="_blank"></a>

之二

<a href="http://s3.51cto.com/wyfs02/M02/23/BA/wKiom1NBPV-CBu10AAEFzoxinSo600.jpg" target="_blank"></a>

FILENAME用法

<a href="http://s3.51cto.com/wyfs02/M02/23/BA/wKiom1NBPsPRXSriAANBI5SWlv4654.jpg" target="_blank"></a>

ENVIRON用法

<a href="http://s3.51cto.com/wyfs02/M01/23/BB/wKioL1NBQifg6icPAAE1XFKBXtc198.jpg" target="_blank"></a>

ARGV數組由ARGV[0]....ARGV[ARGC-1]組成,第一個元素是0而不是1,這與AWK中的般數組不同

ENVIROND數組在shell與AWK的互動中非常有用,使用ENVIRON["PARA_NAME"]來擷取環境變量$PARA_NAME的值,其中引号“”不可少!

5、标準輸出與重定向

⑴、輸出重定向

print items &gt; output-file

print items &gt;&gt; output-file

print items | command

⑵、特殊檔案描述符:

/dev/stdin:标準輸入

/dev/sdtout: 标準輸出

/dev/stderr: 錯誤輸出

/dev/fd/N: 某特定檔案描述符,如/dev/stdin就相當于/dev/fd/0;

執行個體:

<a href="http://s3.51cto.com/wyfs02/M00/23/BA/wKiom1NBStnDFP2pAAExjxe_fhc563.jpg" target="_blank"></a>

6、awk的操作符:

⑴、算術操作符:

-x: 負值

+x: 轉換為數值;

x^y:

x**y: 次方

x*y: 乘法

x/y:除法

x+y:

x-y:

x%y:

<a href="http://s3.51cto.com/wyfs02/M00/23/BA/wKiom1NBTQrCngRtAAEi3k07gnM847.jpg" target="_blank"></a>

⑵、字元串操作符:

隻有一個,而且不用寫出來,用于實作字元串連接配接;

⑶、 指派操作符:

=

+=

-=

*=

/=

%=

^=

**=

++

--

需要注意的是,如果某模式為=号,此時使用/=/可能會有文法錯誤,應以/[=]/替代;

⑷、布爾值

awk中,任何非0值或非空字元串都為真,反之就為假;

⑸、 比較操作符:

x &lt; y    True if x is less than y.

x &lt;= y    True if x is less than or equal to y.

x &gt; y    True if x is greater than y.

x &gt;= y    True if x is greater than or equal to y.

x == y    True if x is equal to y.

x != y    True if x is not equal to y.

x ~ y    True if the string x matches the regexp denoted by y.

x !~ y    True if the string x does not match the regexp denoted by y.

subscript in array  True if the array array has an element with the subscript subscript.

⑺、表達式間的邏輯關系符:

&amp;&amp;

||

<a href="http://s3.51cto.com/wyfs02/M02/23/BB/wKioL1NBTj_RLuZNAAJCgtUvxKU570.jpg" target="_blank"></a>

⑻、條件表達式:

selector?if-true-exp:if-false-exp

if selector; then

 if-true-exp

else

 if-false-exp

fi

<a href="http://s3.51cto.com/wyfs02/M00/23/BA/wKiom1NBT1PiUUJJAAFOxwjTL9A175.jpg" target="_blank"></a>

⑼、函數調用:

function_name(para1,para2)

7、控制語句

⑴、 if-else

文法:

if (condition) {then-body} else {[ else-body ]}

本文轉自 jinlinger 51CTO部落格,原文連結:http://blog.51cto.com/essun/1391320,如需轉載請自行聯系原作者