**:
awk命令的一般形式:
awk 'begin
pattern1
pattern2
...patternn
end ' input-filename
其中,begin 和 end 是可選的。
awk的執行過程如下:
1,如果存在begin,awk首先執行它指定的actions。
2,awk從輸入中讀取一行,稱為一條輸入記錄。
3,awk將讀入的記錄分割成個字段,並將第乙個字段放入變數$1中,第二個放入變數$2中,依次類推。$0表示整條記錄;字段分隔符可以通過選項-f指定,否則使用預設的分隔符。
4,把當前輸入記錄依次與每乙個語句中pattern比較;如果相匹配,就執行相應的actions;如果不匹配,就跳過相應的actions,直到完成所有的語句。
5,當一條輸入記錄處理完畢後,awk讀取下一行,重複上面的處理過程,直到所有輸入全部處理完畢。
6,如果輸入是檔案列表,awk將按順序處理列表中的每個檔案。
7,awk處理完所有的輸入後,若存在end,則執行相應的actions。
awk常用的內建變數
變數 說明
nf 當前記錄中的字段數
nr 當前記錄數
fs 字段分隔符(預設是乙個空格)
rs 記錄分隔符(預設是乙個換行符)
ofs 輸出字段分隔符(預設是乙個空格)
ors 輸出字段分隔符(預設是乙個換行符)
orsignorecase 如果是真,則進行忽略大小寫的匹配
awk使用例項:
# 使用awk列印字串
# awk 'begin '
#hello
# awk 'begin '
# cat test.txt
#顯示輸入檔案的內容
# awk '' test.txt
#使用正規表示式匹配行,省略時表示
# awk '/f[12].*/' test.txt
#使用正規表示式匹配行,並列印匹配的第一和第三列(域或字段)
# awk '/f[12].*/ ' test.txt
#更改字段分隔符為!,執行上面的操作
# awk -f\! '/f[12].*/ ' test.txt
#使用空格或!作為欄位的分隔符(正規表示式[ !])
# awk -f '[ !]' '/f[12].*/ ' test.txt
#使用awk內建的取字串函式提取輸入檔案中的手機號
# awk -f '[ !]' ' ' test.txt
#使用關係表示式書寫模式,列印所奇數行
# awk 'nr % 2 == 1' test.txt
#使用關係式書寫模式,列印所有奇數行的第1和第3欄位
# awk 'nr % 2 == 1 ' test.txt
#列印輸入檔案的總行數,類似於 wc -l test.txt
# awk 'end ' test.txt
# awk '' test.txt //從1到最後一行
#為每一記錄前面新增行號,類似於 wc -n test.txt
# awk '' test.txt
#為每一記錄前面新增行號,並使用製表符作為行號和記錄的間隔符
# awk '' test.txt
#為每行前面加上指定的字串,並且輸入到tmpnum.txt
# awk '' num.txt > tmpnum.txt
#把當前目錄下面字尾名為.txt的檔案,新增字首,並且輸入到tmpnum.txt
# awk '' *.txt > tmpnum.txt
注意以下命令的靈活應用
#awk 'nr % 2 == 1' a.txt b.txt > d.txt
#awk 'nr % 2 == 1' *.txt > d.txt
#awk '' *.txt > tmpnum.txt
#awk '; end ' num.txt //求第五個欄位的和
另外,在awk語句裡面可以根據條件進行資料篩選,一般是跟字段或字段的某些數,字元進行比較,進而再進行具體的操作。
下面再給出一些awk和其他命令使用的例子
#提取檔案中的手機號
# cat test.txt | awk -f\! '' | awk '' | cut -c6-16
#以檔案修改順序生成當前目錄下帶有時間的檔名
# ls -aldt * --time-style='+%f_%h:%m' | awk ''
#計算當前目錄中所有12月份建立的檔案的位元組數
# ls -l | awk ' $6 == "dec" ; end '
#顯示當前所有的登入使用者和其使用的終端
# who | awk ''
# df -hpt -x tmpfs //檔案裝置的詳細資訊
#顯示ifconfig -a的輸出中以單詞開頭的行
# ifconfig -a | grep '^\w'
#顯示除了lo之外的所有網路介面
# ifconfig -a | grep '^\w' | awk '!/lo/'
#匹配inet的行,以分號為字段間隔符列印第二個字段
# ifconfig eth0 | awk -f\: ' /inet/ '
# ifconfig eth0 | awk -f\: ' /inet/ ' | awk ''
# ifconfig eth0 | grep 'inet'
#以乙個或多個空格 或:作為字段分隔符(正規表示式' +|:')
# ifconfig eth0 | grep 'inet' | awk -f ' +|:' ''
#以乙個或多個空格 或 乙個或多個:作為字段分隔符(正規表示式'[ :]+')
# ifconfig eth0 | grep 'inet' | awk -f '[ :]+' ''
#刪除所有名為foo的程序
# kill 'ps ax | grep 'foo' | grep -v 'grep' | awk '''
#檢視apache的併發請求數及其tcp連線狀態
# from :
# netstat -n | awk '/^tcp/ end '
//nf 是當前記錄的字段個數, 使用$nf可以實現每個記錄的最後乙個字段 就和$6一樣
awk應用於多行程式設計
1. 應用場景
在 linux 下有時在處理配置檔案是,需要對乙個文字塊進行處理,此時使用 awk 的強大功能。文字塊的格式是如下:
[section1]
tag1 = value_a
tag2 = value_b
tag3 = value_c
[section 2]
tag4 =
[section 3]
tag6 =
現在有個需求,需要在[section 2] 這個文字塊加入tag5=( 類似於tag4 的格式) 這種形式的屬性。當然還需要對其進行修改和刪除。下面就是示範使用awk 來進行處理。
1.1. 增加
假設現在要進行新增操作,首先必須要檢查tag5 這個文字塊是否存在,如果不存在就新增。awk 程式設計如下:
[python]view plain
copy
awk –v tagvalue1=vaule_a –v tagvalue2=vaule_b ' "
#其他保持不變
}' a.conf
結果如下:
[root@local~]#cat a.conf ·
…[section 2]
tag4 =
tag5 =
[section 3]
tag6 =
1.2. 修改
假設現在要進行修改操作( 把tag5 中的 subtag2
的值修改為
vaule_bb ) ,首先必須要檢查tag5 這個文字塊是否存在,如果存在就修改。awk 程式設計如下:
[python]view plain
copy
awk –v tagvalue2=vaule_bb '
print $0
#其他保持不變
}while($1 != "}")
} print $0
# 其他保持不變
} ' a.conf
結果如下:
…[section 2]
tag4 =
tag5 =
[section 3]
tag6 =
1.3. 刪除
假設現在要進行刪除操作( 把tag5 這個文字塊刪除 ) ,首先必須要檢查tag5 這個文字塊是否存在,如果存在就刪除。awk 程式設計如下:
[python]view plain
copy
awk 'while($1 != "}") #刪除該塊
} else
print $0
# 其他保持不變
}' a.conf
結果如下:
…[section 2]
tag4 =
[section 3]
tag6 =
Flash中的文字應用
1.分離文字 1 為什麼要分離文字?由於某些操作不能直接作用於文字物件,比如為文字填充漸變色,以及調整文字的外形。上述操作僅僅作用於影象物件,所以須要將文字打散,使其具有和圖形相似的屬性。注意打散的文字要想再次改變字型的一些設定是有限制的,有的就失去了改變的功能。所以在打散之前最好要確保正確設定文字...
awk實際應用 文字合併
請使用awk命令將如下兩份檔案中名字相同的兩行合併起來1 2 3 4 5 6 7 8 9 10 root localhost cat 1.txt 韓海林 21歲 海林韓 23歲 韓林海 22歲 林海韓 24歲 root localhost cat 2.txt 韓林海 男 海林韓 男 韓海林 男 林海...
譯 HAL 超文字應用語言
hal 是一種簡單的格式,它提供了一種一致且簡便的方法在 api 的資源之間進行超連結。採用 hal 將使您的 api 易於探索,並且其文件很容易從 api 本身中發現。簡而言之,這將使您的 api 更易於使用,因此對客戶端開發人員更具吸引力。使用適用於大多數程式語言的開源庫,可以輕鬆提供和使用採用...