2016-01-23 54 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