awk語法與文字應用處理

2021-06-22 10:51:05 字數 4907 閱讀 6322

**:

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  ' "

print

#其他保持不變

}' 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 更易於使用,因此對客戶端開發人員更具吸引力。使用適用於大多數程式語言的開源庫,可以輕鬆提供和使用採用...