我有一个脚本来操作一些日志文件,然后将它们推送到服务器,加载到mysql并进行分析。除了收集日志的自动化之外,我几乎完成了所有这个过程。我使用sed从日志文件中删除所有"
,因此可以更容易地将其导入到mysql中。当我运行下面的命令时它工作正常,但在shell脚本中运行相同的命令,它会创建一个空文件。我不确定为什么 - 非常感谢任何帮助。
sed 's/\"//g' /usr/local/tomcat/logs/localhost_access_log.$yest.txt > /$DIR/iweb$yest.txt
这是完整的脚本。
#!/bin/bash
#Script to manage catalina logs on our servers.
#First create the needed variables.
date=$(date +"%m_%d_%y")
adate=$(date +"%Y-%m-%d")
yest=$(date -d 'yesterday' +"%Y-%m-%d")
Customer="iwebsup"
log=/isweb/admin/catmanage/log
DIR=/catmanage
#Make Directory
#mkdir /catmanage/tomcat1/
#Run access logs through sed to remove " from file
echo "Removing quote marks from access log and moving to direcotry" &> $log.$date
sed 's/\"//g' "/usr/local/tomcat/logs/localhost_access_log.$yest.txt" > "/$DIR/iweb$yest.txt" &> $log.$date
答案 0 :(得分:2)
启动shell脚本会启动一个新的系统进程。我怀疑在此脚本的子shell的上下文中,$yest
未设置为shell变量。如果您要在shell脚本中使用$yest
,理想情况下应将其值作为参数传递给脚本 - 或者将shell变量导出为环境变量(export $yest
),将由子shell进程继承(所有子进程都继承其父进程的环境)。
在调试shell脚本时,在您正在调试的部分的开头包含set -xvu
总是有用的,这样您就可以看到脚本正在做什么以及它的变量中存储了什么值。
-x Print commands and their arguments as they are executed.
-v Print shell input lines as they are read.
-u Treat unset variables as an error when substituting.
您可以稍后运行set -xvu
。
答案 1 :(得分:2)
您的原始问题显示了>
的重定向,但您的实际脚本有&>
。这些是相当不同的事情,事实上,后者可能与您的sh
不相容。
包含错误重定向的便携式兼容方式是
command >file 2>&1
你的shebang专栏说#!/bin/bash
,但根据你的诊断评论,我猜你毕竟用sh
来运行它。
顺便说一句,tr -d '"' <file >newfile
是一种从文件中删除双引号的更有效方法。