本文主要是介绍解决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来对处理时间进行控制,也算是达到了目的。
这篇关于解决awk中无法使用shell变量问题及脚本使用命令行对用户进行切换的问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!