使用awk處理文本


http://blog.wuxu92.com/using-awk/

在Liux下我們經常需要對一些文本文檔做一些處理,尤其像從日志里提取一些數據,這是我們一般會用awk工具和sed工具去實現需求,這里對awk的入門使用簡單記錄。

awk可以看作一種文本處理工具,一種專注數據操作的編程語言,一個數據處理引擎。其名字來源於三個發明者的姓名首字母。一般在Liux下使用的awk是gawk(gnu awk)。

入門

awk把文本文檔看作是數據庫,每一行看作一條數據庫中的記錄,可以指定數據列的分隔符,默認的分隔符是”\t”,即Tab。
awk工作流程是這樣的:讀入有’\n’換行符分割的一條記錄,然后將記錄按指定的域分隔符划分域,填充域,$0則表示所有域,$1表示第一個域,$n表示第n個域。默認域分隔符是”空白鍵” 或 “[tab]鍵”
awk的執行模式是: awk '{pattern + action}' {filenames}

awk的執行方式:

1.命令行方式

awk [-F  field-separator]  'commands'  input-file(s)

其中,commands 是真正awk命令,[-F域分隔符]是可選的。 input-file(s) 是待處理的文件。
在awk中,文件的每一行中,由域分隔符分開的每一項稱為一個域。通常,在不指名-F域分隔符的情況下,默認的域分隔符是空格。

2.shell腳本方式
將所有的awk命令插入一個文件,並使awk程序可執行,然后awk命令解釋器作為腳本的首行,一遍通過鍵入腳本名稱來調用。
相當於shell腳本首行的:#!/bin/sh
可以換成:#!/bin/awk

3.將所有的awk命令插入一個單獨文件,然后調用:

awk -f awk-script-file input-file(s)

其中,-f選項加載awk-script-file中的awk腳本,input-file(s)跟上面的是一樣的。

一般是喲你哦個命令行模式就能滿足需求了。

這樣下面的一行文本:

abc def 123
dfg jik 234

在awk看來就是一個包含三個字段的記錄,可以類比到mysql的一行記錄,只不過awk沒有一個mysql那么強的scheme。
這樣比如我們要抽出中間的那一行數據,假設文本保存為文件 data.txt

awk '{print $2}'

很簡單,這樣就可以打印出中間的字符def 和jik 了。

下面來一個點點復雜的:

Beth	4.00	0
Dan 3.75 0
kathy 4.00 10
Mark 5.00 20
Mary 5.50 22
Susie 4.25 18

對於這樣的數據
使用 awk '$3>0 { print $, $2 * $3 }' data.txt 這樣會輸出

Kathy 40
Mark 100
Mary 121
Susie 76.5

理解就是可以在{}前面添加一個判斷的語句,只有符合條件的行才會執行后面的語句。

進階

相對於print輸出,可以使用printf進行格式化輸出:

awk  -F ':'  '{printf("filename:%10s,linenumber:%s,columns:%s,linecontent:%s\n",FILENAME,NR,NF,$0)}' /etc/passwd

print函數的參數可以是變量、數值或者字符串。字符串必須用雙引號引用,參數用逗號分隔。如果沒有逗號,參數就串聯在一起而無法區分。這里,逗號的作用與輸出文件的分隔符的作用是一樣的,只是后者是空格而已。

printf函數,其用法和c語言中printf基本相似,可以格式化字符串,輸出復雜時,printf更加好用,代碼更易懂。

 


免責聲明!

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



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