快速截出對應表裡的資料

在實作 CI 流程中,有一段使用 shell script 實作的地方,
需要承接流程開始時傳入的環境變數,由對應表中找到對應的資料,以進行相關的流程。

本來以為需要使用的正規表示式來完成這個功能,但偏偏卡在不知怎麼下搜尋關鍵字,
找到由正規則表示取出某段資料,放到變數裡的程式寫法。
一度在評估是不是要去研究 awk 或 sed 的文件,但又隱隱覺得殺雞不該用牛刀。

好在過了一會兒,讓我找到用更基本指令完成工作的方法。

對應表

首先定義對應表的格式,由於資料的內容單純,都是英數字組成,因此並不需要在意字元編碼的問題,
也不用跳脫特殊符號,單純使用逗號作為分隔字元,示意如下…

proj.lst

PROJECT_001,VALUE_1_1,VALUE_1_2
PROJECT_002,VALUE_2_1,VALUE_2_2
PROJECT_003,VALUE_3_1,VALUE_3_2

目標

當今天環境變數 PROJECT_IDPROJECT_002 時,能夠順利取得 VALUE_2_1 的值(第二組數值)。

作法

在查詢列表類的資料,經常會使用 grep 指令,先使用它找到對應的那一行,
再使用 cut 命令,來取得其後的第一個數值,與預設使用空白或 Tab 分隔不同,在我的文件中是使用逗號。
因此給予參數 -d',' ,再告知取出第二個數值 -f2

程式碼如下,整段看起來滿簡抓的。

程式碼

#!/bin/bash

PROJECT_ID='PROJECT_002'

TARGET_VALUE=`cat proj.lst | grep $PROJECT_ID, | cut -d',' -f2`

echo $TARGET_VALUE
# VALUE_2_1

在使用 grep 時,在 $PROJECT_ID 後增加一個逗號(,),這是為了讓 grep 只抓一筆資料的作法。
PROJECT_002 為條件來說,不會的誤抓到像是 PROJECT_0023 之類的記錄。
當然,如果要更精確地下條件,還是得請出正規表示式來,
只不過在這裡我確定資料夠單純,不會出現奇怪的狀況,因此選擇讓程式碼更容易閱讀一些。

小結

寫完這段程式滿有成就感的,不過在嘗試的過程中,
又再一次遇到不同系統使用的換行表示不同,所造成的問題。
當時為了要抓行尾的數值,在 windows 下編輯的對應表,在 linux 下讀取行尾會多一個看不見的 ^M
使得後續的流程出錯,查了好一陣子才發現到又是這狀況,算是給自己再次提醒。