sed清空脚本中的文件

时间:2015-02-09 14:17:45

标签: bash sed

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

2 个答案:

答案 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是一种从文件中删除双引号的更有效方法。