Bash脚本生成正确的$cmd,但无法执行复杂流
这个简短的脚本每天刮取一些日志文件来创建一个简单的摘录。它可以从命令行工作,当我回显$cmd和复制/粘贴时,它也可以工作。但当我试图从脚本本身执行时,它会中断 我知道这是一个我可能会改进的模式的噩梦,但我是否错过了一些简单的方法来正确执行它Bash脚本生成正确的$cmd,但无法执行复杂流,bash,cut,Bash,Cut,这个简短的脚本每天刮取一些日志文件来创建一个简单的摘录。它可以从命令行工作,当我回显$cmd和复制/粘贴时,它也可以工作。但当我试图从脚本本身执行时,它会中断 我知道这是一个我可能会改进的模式的噩梦,但我是否错过了一些简单的方法来正确执行它 #!/bin/bash priorday=$(date --date yesterday +"%Y-%m-%d") outputfile="/home/CCHCS/da14/$priorday""_PROD_message_processing_times.
#!/bin/bash
priorday=$(date --date yesterday +"%Y-%m-%d")
outputfile="/home/CCHCS/da14/$priorday""_PROD_message_processing_times.txt"
cmd="grep 'Processed inbound' /home/rules/care/logs/RootLog* | cut -f5,6,12,16,18 -d\" \" | grep '^"$priorday"' | sed 's/\,/\./' | sed 's/ /\t/g' | sed -r 's/([0-9]+\-[0-9]+\-[0-9]+)\t/\1 /' | sed 's/ / /g' | sort >$outputfile"
printf "command to execute:\n"
echo $cmd
printf "\n"
$cmd
输出:
./make_log_extract.sh要执行的命令:grep'Processed inbound'/home/rules/care/logs/RootLog.log/home/rules/care/logs/RootLog.log.1
/home/rules/care/logs/RootLog.log.10
/home/rules/care/logs/RootLog.log.11
/home/rules/care/logs/RootLog.log.12
/home/rules/care/logs/RootLog.log.2
/home/rules/care/logs/RootLog.log.3
/home/rules/care/logs/RootLog.log.4
/home/rules/care/logs/RootLog.log.5
/home/rules/care/logs/RootLog.log.6
/home/rules/care/logs/RootLog.log.7
/home/rules/care/logs/RootLog.log.8
/home/rules/care/logs/RootLog.log.9 | cut-f5,6,12,16,18-d“| grep
“^2014-01-30”
's/([0-9]+-[0-9]+-[0-9]+)\t/\1/'| sed's///g'|排序
/home/CCHCS/da14/2014-01-30\u生产消息\u处理\u times.txt
grep:5,6,12,16,18:没有这样的文件或目录
作为,不要存储命令,然后执行它
您可以执行它,但首先要打印它:
priorday=$(日期--昨天的日期+%Y-%m-%d)
outputfile=“/home/CCHCS/da14/$priorday”“\u PROD\u message\u processing\u times.txt”
设置-o xtrace#$outputfile”
set+o xtrace#基本上,尽量不要这样做:+1,set-x
和set-o xtrace
(如果有的话)之间有什么区别吗?从我在中看到的情况来看,完全一样。只是简短和长的符号。启动bash
时也可以使用单字符shell选项:bash-x
相当于启动bash
然后执行set-x
。谢谢;非常有用。我能够将该命令与print命令括在一起,然后通过每个管道命令来获得正确的语法:#grep'Processed inbound'/home/rules/care/logs/RootLog*| cut-f5,6,12,16,18-d'| grep'^“$priorday”| sed's/\,/\./'| sed's/\t/g';sed's/-r's([0-9]+\-[0-9]+\-[0-9]+\t/\1/''sed's///g'| sort>$outputfile grep'Processed inbound'/home/rules/care/logs/RootLog*| cut-f5,6,12,16,18-d''grep'^$priorday'./'./'./''sed's//\t/g'.\sed's/\t/g'.-sed-r's/([0-9]+-[0-9]+]\t/\1/'| sed's///g'| sort>$outputfile`@DaveA将命令存储在变量中也存在此问题,变量扩展可能会更改,等等。此外,由于您是新来的,如果您的问题已经解决,请不要忘记将答案标记为已接受。您可以单击答案旁边的复选标记将其从空切换到空给格林。看看你是否有任何疑问!
priorday=$(date --date yesterday +"%Y-%m-%d")
outputfile="/home/CCHCS/da14/$priorday""_PROD_message_processing_times.txt"
set -o xtrace # <-- set printing mode "on"
grep 'Processed inbound' /home/rules/care/logs/RootLog* | cut -f5,6,12,16,18 -d\" \" | grep '^"$priorday"' | sed 's/\,/\./' | sed 's/ /\t/g' | sed -r 's/([0-9]+\-[0-9]+\-[0-9]+)\t/\1 /' | sed 's/ / /g' | sort >$outputfile"
set +o xtrace # <-- revert to normal