2016-01-23 55 views
1

的最后一行的特殊字符我有这样一个文本文件(例如,a.txt):查找文本文件

1.1.t  
1.2.m 

如果最后一行是由字符m的,我想呼应Ok

我尝试这样做:

line=` awk '/./{line=$0} END{print line}' a.txt`  
line1= `echo $line | grep "m"`  
if [[ $line1= `:` ]] ; then 
echo 
else 
echo "Ok" 
fi 

它不工作,错误的是:

bash: conditional binary operator expected 
bash: syntax error near ``:`, 
`if [[ $line1= `:` ]] ; then' 

回答

1

if [[ $line1=]]是夫妇的方式围绕=空间不正确的语法缺失和反引号用于命令替换

awk本身可以处理这个问题:

awk '/./{line=$0} END{print (line ~ /\.m/)? "ok" : "no"}' file 
ok 
+1

'awk'/./{line=$0} END {print(line〜/\.m/)? “ok”:“no”}'file'我试试这个非空行。谢谢。它的工作 – user3891747

+0

我已经更新了一个照顾空行的版本。 – anubhava

+1

如果行包含单个字符'0',则即使行不是空白,第一个条件也会计为false。 – ghoti

1

你也可以使用tailgrep

[[ -n $(tail -1 a.txt | grep "m$") ]] && echo "OK" || echo "FAILED" 
+2

这里你不需要'grep':'if [[$(tail -1 a.txt)= * m]];然后回显“OK”;其他回声“失败”; fi'。 –

+0

@gniourf_gniourf你说得对。仍然保持它,因为它是显示模式。 –

0

您可以使用sed

sed -n '${/m$/s/.*/OK/p;}' file 

选项-n默认抑制输出。 $解决输入的最后一行。在这种情况下,我们检查该行是否以m/m$/结尾。如果是这种情况,我们用OK这个词替换这行,然后打印出来。

顺便说一句,我要去槽的shell脚本,真的有太多的错误解释,语法错误是因为有$line1,并在有条件的[[ ... ]]=之间没有空格。但是,嘿,这远远不是这个剧本的唯一问题。 ;)

http://www.shellcheck.net/可能是一个很好的资源来增强您的脚本。

+0

这会产生一个错误:'sed:1:“$ {/ m $/s /.*/OK/p}”:替换命令中的坏标志:'}''在非GNU sed中运行时(OSX,FreeBSD ,也许是其他)。在最后一个'}'之前添加一个分号以使其具有可移植性。 – ghoti

+0

@ghoti我正在使用GNU sed。即使我通过'--posix',这对我也很有用。 'p'后面的分号对你有用吗? – hek2mgl

+0

是的,它使用分号,你的脚本在GNU sed和non-GNU中都可以使用。这个问题不符合POSIX标准,这就是GNU对于假设换行应该发生的地方更宽容。 'p'是命令的结尾。把'}'想象成一个*不同的命令*,而不仅仅是一个提供结构的包装器。它不是一种结构化语言,sed更像是一台状态机。 – ghoti