一直以來在查對條件是否比對時,我們使用的都是簡單的表達式。那如果你想用超過一個表達式來查對特定的條件呢?
本文中,我們将看看如何在過濾文本和字元串時,結合多個表達式,即複合表達式,用以查對條件。
awk 的複合表達式可由表示“與”的組合操作符 <code>&&</code> 和表示“或”的 <code>||</code> 構成。
複合表達式的正常寫法如下:
<code>( 第一個表達式 ) && ( 第二個表達式 )</code>
這裡隻有當“第一個表達式” 和“第二個表達式”都是真值時整個表達式才為真。
<code>( 第一個表達式 ) || ( 第二個表達式)</code>
這裡隻要“第一個表達式” 為真或“第二個表達式”為真,整個表達式就為真。
注意:切記要加括号。
現在讓我們通過一個例子來加深了解:
此例中,有一個文本檔案 <code>tecmint_deals.txt</code>,文本中包含着一張随機的 tecmint 交易清單,其中包含了名稱、價格和種類。
<code>tecmint deal list</code>
<code>no name price type</code>
<code>1 mac_os_x_cleanup_suite $9.99 software</code>
<code>2 basics_notebook $14.99 lifestyle</code>
<code>3 tactical_pen $25.99 lifestyle</code>
<code>4 scapple $19.00 unknown</code>
<code>5 nano_tool_pack $11.99 unknown</code>
<code>6 ditto_bluetooth_altering_device $33.00 tech</code>
<code>7 nano_prowler_mini_drone $36.99 tech</code>
我們隻想列印出價格超過 $20 且其種類為 “tech” 的物品,在其行末用 (*) 打上标記。
我們将要執行以下指令。
<code># awk '($3 ~ /^\$[2-9][0-9]*\.[0-9][0-9]$/) && ($4=="tech") { printf "%s\t%s\n",$0,"*"; } ' tecmint_deals.txt</code>
<code></code>
<code>6 ditto_bluetooth_altering_device $33.00 tech *</code>
<code>7 nano_prowler_mini_drone $36.99 tech *</code>
此例,在複合表達式中我們使用了兩個表達式:
表達式 1:<code>($3 ~ /^\$[2-9][0-9]*\.[0-9][0-9]$/)</code> ;查找交易價格超過 <code>$20</code> 的行,即隻有當<code>$3</code> 也就是價格滿足 <code>/^\$[2-9][0-9]*\.[0-9][0-9]$/</code> 時值才為真值。
表達式 2:<code>($4 == “tech”)</code> ;查找是否有種類為 “<code>tech</code>”的交易,即隻有當 <code>$4</code> 等于 “<code>tech</code>” 時值才為真值。 切記,隻有當 <code>&&</code> 操作符的兩端狀态,也就是兩個表達式都是真值的情況下,這一行才會被打上 <code>(*)</code> 标志。
<a target="_blank"></a>
有些時候為了真正符合你的需求,就不得不用到複合表達式。當你掌握了比較和複合表達式操作符的用法之後,複雜的文本或字元串過濾條件也能輕松解決。
原文釋出時間為:2016-07-23
本文來自雲栖社群合作夥伴“linux中國”