sed 在脚本中清空文件

sed emptying file in script

我有一个脚本来操作一些日志文件,然后将它们推送到服务器,加载到 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

启动 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

你原来的问题显示重定向 > 但你的实际脚本有 &>。这些是完全不同的东西,事实上,后者可能与您的 sh.

不兼容

包含错误重定向的可移植、兼容的方法是

command >file 2>&1

你的 shebang 行说 #!/bin/bash 但根据你的诊断评论,我猜你毕竟是 运行 这个 sh

顺便说一下,tr -d '"' <file >newfile 是从文件中删除双引号的更有效方法。