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
是从文件中删除双引号的更有效方法。
我有一个脚本来操作一些日志文件,然后将它们推送到服务器,加载到 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
是从文件中删除双引号的更有效方法。