解決awk中無法使用shell變量問題及腳本使用命令行對用戶進行切換的問題

問題一、解決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來對處理時間進行控制,也算是達到了目的。

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章