問題一、解決awk中無法使用shell變量問題
項目背景
需要通過提取 去重後的操作日誌裏面 第一列賬號 + 設定日期 來作爲數據字段 導入到ORACLE庫
邏輯是在通過管道對 提取數據的同時,把設定日期作爲 新的一列 加入到新的文本文件裏,問題就出現在這個時間變量這裏,
本來先給時間變量賦值,然後把變量放在命令行裏是沒問題的,可是在awk 裏就出現了問題, 反覆測試依然是相同的結果,本來應該是取的時間值,卻變成了數據文件裏的某個字段值,所以$calc_day_bak 這個參數出現了問題,反覆查閱,最後問題定位在
變量在awk中無法使用的問題,需要對 "$"+變量名的形式 做字符轉義,下文做詳細說明:
一:"'$var'"
這種寫法大家無需改變用'括起awk程序的習慣,是老外常用的寫法.如:
var="test"
awk 'BEGIN{print "'$var'"}'
這種寫法其實際是雙括號變爲單括號的常量,傳遞給了awk.
如果var中含空格,爲了shell不把空格作爲分格符,便應該如下使用:
var="this is a test"
awk 'BEGIN{print "'"$var"'"}'
二:'"$var"'
這種寫法與上一種類似.如果變量含空格,則變爲'""$var""'較爲可靠.
三.把括起awk程序的''變爲"",使用"$var"
如:
$var="this is a test"
awk 'BEGIN{print "$var"}"
這是因爲在""裏$是特殊字符,而在''裏$是普通字符.
四:export 變量,使用ENVIRON["var"]形式,
如:
$var="this is a test";export $var
awk 'BEGIN{print ENVIRON["var"]}'
五:當然也可以使用-v選項
如:
$var="this is a test"
awk -v nvar="$var" '{print nvar}'
這樣便把系統變量定義成了awk變量.
問題二、腳本使用命令行對用戶進行切換的問題
項目背景
(1)項目需要每天定時從HADOOP集羣中下載 每日更新的數據文件,需要使用 hadoop fs -get命令,用戶是hadoop;
(2)把下載下來的數據源文件中指定的字段提取出來,然後把數據批量導入到ORACLE中,需要使用oracle自帶的sqlldr 工具,用戶是oracle
(3)由於數據源文件是hadoop用戶下載的,需要使用root或者hadoop用戶進行刪除處理
在寫腳本的時候就遇到需要處理用戶切換的問題,不然會有命令 或者環境不支持的問題產生報錯,經過多種方式取證嘗試,發現用戶切換問題是SHELL語法中比較大的一個詬病,沒有直接簡單合適的方式來處理,最後只好把一個腳本拆分成幾個,然後在不同的用戶角色下對數據進行處理,通過crontab來對處理時間進行控制,也算是達到了目的。