天天看點

awk 系列:如何使用 awk 複合表達式

一直以來在查對條件是否比對時,我們使用的都是簡單的表達式。那如果你想用超過一個表達式來查對特定的條件呢?

本文中,我們将看看如何在過濾文本和字元串時,結合多個表達式,即複合表達式,用以查對條件。

awk 的複合表達式可由表示“與”的組合操作符 <code>&amp;&amp;</code> 和表示“或”的 <code>||</code> 構成。

複合表達式的正常寫法如下:

<code>( 第一個表達式 ) &amp;&amp; ( 第二個表達式 )</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]$/) &amp;&amp; ($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>&amp;&amp;</code> 操作符的兩端狀态,也就是兩個表達式都是真值的情況下,這一行才會被打上 <code>(*)</code> 标志。

<a target="_blank"></a>

有些時候為了真正符合你的需求,就不得不用到複合表達式。當你掌握了比較和複合表達式操作符的用法之後,複雜的文本或字元串過濾條件也能輕松解決。

原文釋出時間為:2016-07-23

本文來自雲栖社群合作夥伴“linux中國”

繼續閱讀