shell 脚本 常用命令
#获取当前目录所在路径
workpath=`pwd`
#清空DIFF.txt文件
cat /dev/null > $workpath/DIFF.txt
参考:IFS:内部字段分隔符(internal field separator)
默认情况下,bash shell会将下面的字符当做字段分隔符:空格、制表符、换行符
。
# IFS修改:
IFS=','
# 改回默认的IFS值:
IFS.OLD=$IFS
#循环遍历多个文件
TBL_LIST="a.txt b.txt c.txt"
for tbl in $TBL_LIST
do
#按行读取tbl文件: a.txt ...
while IFS= read line
do
#cut -b :
kisob=`echo $line | cut -b 2-6`
echo $kisob
done < $workpath/$tbl
done
- cut -b : 字节(bytes),用选项-b
- 字符(characters),用选项-c
- 域(fields),用选项-f
- uniq所谓的重复是连续出现的相同记录。而
sort -u
是全局的。 先sort,再用uniq可以实现sort -u(即sort -u file.txt
等价于sort file.txt | uniq
)
参考:uniq与sort -u去重区别和联系
#消除文件重复行
sort -u $workpath/Duplicate_lines.txt >> $workpath/single_line.txt
#消除临时文件
rm $workpath/Duplicate_lines.txt
#生成1000条insert数据
DATA_FMT="','0','20220909 00:00:00 ',' ',' 122'"
for ((i=2000; i<=2999; i++))
do
echo "'u"$i$DATA_FMT >> $workpath/INSERT_TBL.txt
done
echo -e
: 处理特殊字符, 若字符串中出现以下字符,则特别加以处理,而不会将它当成一般文字输出:
参考:echo -n 和echo -e 参数意义
\a 发出警告声;
\b 删除前一个字符;
\c 最后不加上换行符号;
\f 换行但光标仍旧停留在原来的位置;
\n 换行且光标移至行首;
\r 光标移至行首,但不换行;
\t 插入tab;
\v 与\f相同;
\ 插入\字符;
\nnn 插入nnn(八进制)所代表的ASCII字符;
#打印开始结束时间并写入日志
echo -e "`date +"%Y/%m/%d"` `date +"%T"` 处理开始" | tee -a $logfile
tee -a
: 向文件里面追加内容:每次的输出是追加到文件里面,这时我们可以通过-a
参数来指定。
参考:【Linux】tee命令
# INSERT_SQL 语句生成
# $line : 'u2000','0','20210909 00:00:00 ', ... ,' ','122'
while IFS= read line
do
echo 'INSERT INTO USER_TABLE(column1, column2, ...) VALUES ('$line');' >> $workpath/INSERT_TBL.sql
done < $workpath/INSERT_TBL.txt
#执行SQL并写入日志
pdsql < $workpath/INSERT_TBL.sql >> $logfile
# 执行上一个指令的返回值
rtncd=$?
#$0:Shell本身的文件名 $1:第一个参数名 $2:第二个参数名
logfile=$workpath/$0.log
$?
: 最后运行的命令的结束代码(返回值)即执行上一个指令的返回值 (显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误)
参考: Shell
脚本中$0、$?、$!、$$、$*、$#、$@
等的意义以及linux
命令执行返回值代表意义
- wc -l : 统计行数
# 统计文件行数
wc -l INSERT_TBL.sql | tee -a $logfile
hirdb 执行 参数解析
echo "source $DATA_PATH/rorg_$db.unload" > pdload_KYUFUON.cntl
pdload -d -e -i c -l n -x -z $db pdload_KYUFUON.cntl