2015-10-16 73 views
1

我试图通过一个日志文件循环并获取一部分字符串。bash failing中的子串:意外标记`done'附近的语法错误。

日志文件包含:

Variable_name Value 
Slave_running ON 

首先我要看看如果当前行包含子Slave_running(长13个字符开始位置0)。如果我得到一个匹配,那么我需要测试同一个字符串右边的字符(14:2)。

这里是我的软弱试图第一只打印字符串到控制台:

while read p; do 
    echo ${$p:0:13} 
done <slaverunning.log 

这将返回:

syntax error near unexpected token `done'. 

什么我得到错误的bash的子串语法错了吗?

回答

1

有一个语法错误,但它不是意外的标记......

${...}内的$p是错误的,这应该给一个bad substitution错误:

echo ${$p:0:13} 

随着那固定的,你的脚本应该工作:

while read p; do 
    echo ${p:0:13} 
done <slaverunning.log 
2

首先,您的代码问题只是一个语法问题,您不需要在p之前的,仅在{之前。下面应该按预期工作:

while read p; do 
    echo ${p:0:13} 
done < slaverunning.log 

也就是说,AWK似乎更适合这个问题,是这样的:

awk '/^Slave_running/ { if ($2 == "ON") { print "running"; } }' slaverunning.log 

的bash的字符串处理函数一个伟大的演练:http://www.thegeekstuff.com/2010/07/bash-string-manipulation/
熟悉Awk的好地方:http://www.grymoire.com/Unix/Awk.html

+0

我的不好;将下划线误认为一个空间 - NVM – tripleee

相关问题