作為awk命令系列的第三部分,這次我們將看一看如何基於使用者定義的特定模式來篩選文字或字串。
讓我們看一看下面這個例子,比方說你有一個寫有你想要購買的食物的購物清單,其名稱為food_prices.list,它所含有的食物名稱及相應的價格如下所示:
$catfood_prices.list
NoItem_NameQuantityPrice
1Mangoes10$2.45
2Apples20$1.50
3Bananas5$0.90
4Pineapples10$3.46
5Oranges10$0.78
6Tomatoes5$0.55
7Onions5$0.45
然後,你想使用一個(*)符號去標記那些單價大於$2的食物,那麼你可以透過執行下面的命令來達到此目的:
$awk"/*\$[2-9]\.[0-9][0-9]*/{print$1,$2,$3,$4,"*";}/*\$[0-1]\.[0-9][0-9]*/{print;}"food_prices.list
打印出單價大於$2的專案
從上面的輸出你可以看到在含有芒果mangoes和菠蘿pineapples的那行末尾都已經有了一個(*)標記。假如你檢查它們的單價,你可以看到它們的單價的確超過了$2。
在這個例子中,我們已經使用了兩個模式:
第一個模式:/*\$[2-9]\.[0-9][0-9]*/將會得到那些含有食物單價大於$2的行,
第二個模式:/*\$[0-1]\.[0-9][0-9]*/將查詢那些食物單價小於$2的那些行。
上面的命令具體做了什麼呢?這個檔案有四個欄位,當模式一匹配到含有食物單價大於$2的行時,它便會輸出所有的四個欄位並在該行末尾加上一個(*)符號來作為標記。
第二個模式只是簡單地輸出其他含有食物單價小於$2的行,按照它們出現在輸入檔案food_prices.list中的樣子。
這樣你就可以使用模式來篩選出那些價格超過$2的食物專案,儘管上面的輸出還有些問題,帶有(*)符號的那些行並沒有像其他行那樣被格式化輸出,這使得輸出顯得不夠清晰。
我們在awk系列的第二部分中也看到了同樣的問題,但我們可以使用下面的兩種方式來解決:
1、可以像下面這樣使用printf命令,但這樣使用又長又無聊:
$awk"/*\$[2-9]\.[0-9][0-9]*/{printf"%-10s%-10s%-10s%-10s\n",$1,$2,$3,$4"*";}/*\$[0-1]\.[0-9][0-9]*/{printf"%-10s%-10s%-10s%-10s\n",$1,$2,$3,$4;}"food_prices.list
使用Awk和Printf來篩選和輸出專案
2、使用$0欄位。Awk使用變數0來儲存整個輸入行。對於上面的問題,這種方式非常方便,並且它還簡單、快速:
$awk"/*\$[2-9]\.[0-9][0-9]*/{print$0"*";}/*\$[0-1]\.[0-9][0-9]*/{print;}"food_prices.list
使用Awk和變數來篩選和輸出專案
結論
這就是全部內容了,使用awk命令你便可以通過幾種簡單的方法去利用模式匹配來篩選文字,幫助你在一個檔案中對文字或字串的某些行做標記。
作為awk命令系列的第三部分,這次我們將看一看如何基於使用者定義的特定模式來篩選文字或字串。
讓我們看一看下面這個例子,比方說你有一個寫有你想要購買的食物的購物清單,其名稱為food_prices.list,它所含有的食物名稱及相應的價格如下所示:
$catfood_prices.list
NoItem_NameQuantityPrice
1Mangoes10$2.45
2Apples20$1.50
3Bananas5$0.90
4Pineapples10$3.46
5Oranges10$0.78
6Tomatoes5$0.55
7Onions5$0.45
然後,你想使用一個(*)符號去標記那些單價大於$2的食物,那麼你可以透過執行下面的命令來達到此目的:
$awk"/*\$[2-9]\.[0-9][0-9]*/{print$1,$2,$3,$4,"*";}/*\$[0-1]\.[0-9][0-9]*/{print;}"food_prices.list
打印出單價大於$2的專案
從上面的輸出你可以看到在含有芒果mangoes和菠蘿pineapples的那行末尾都已經有了一個(*)標記。假如你檢查它們的單價,你可以看到它們的單價的確超過了$2。
在這個例子中,我們已經使用了兩個模式:
第一個模式:/*\$[2-9]\.[0-9][0-9]*/將會得到那些含有食物單價大於$2的行,
第二個模式:/*\$[0-1]\.[0-9][0-9]*/將查詢那些食物單價小於$2的那些行。
上面的命令具體做了什麼呢?這個檔案有四個欄位,當模式一匹配到含有食物單價大於$2的行時,它便會輸出所有的四個欄位並在該行末尾加上一個(*)符號來作為標記。
第二個模式只是簡單地輸出其他含有食物單價小於$2的行,按照它們出現在輸入檔案food_prices.list中的樣子。
這樣你就可以使用模式來篩選出那些價格超過$2的食物專案,儘管上面的輸出還有些問題,帶有(*)符號的那些行並沒有像其他行那樣被格式化輸出,這使得輸出顯得不夠清晰。
我們在awk系列的第二部分中也看到了同樣的問題,但我們可以使用下面的兩種方式來解決:
1、可以像下面這樣使用printf命令,但這樣使用又長又無聊:
$awk"/*\$[2-9]\.[0-9][0-9]*/{printf"%-10s%-10s%-10s%-10s\n",$1,$2,$3,$4"*";}/*\$[0-1]\.[0-9][0-9]*/{printf"%-10s%-10s%-10s%-10s\n",$1,$2,$3,$4;}"food_prices.list
使用Awk和Printf來篩選和輸出專案
2、使用$0欄位。Awk使用變數0來儲存整個輸入行。對於上面的問題,這種方式非常方便,並且它還簡單、快速:
$awk"/*\$[2-9]\.[0-9][0-9]*/{print$0"*";}/*\$[0-1]\.[0-9][0-9]*/{print;}"food_prices.list
使用Awk和變數來篩選和輸出專案
結論
這就是全部內容了,使用awk命令你便可以通過幾種簡單的方法去利用模式匹配來篩選文字,幫助你在一個檔案中對文字或字串的某些行做標記。