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

Вы также можете использовать tail и grep:

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

Вам действительно не нужно 'grep' здесь:' if [[$ (tail -1 a.txt) = * m]]; затем эхо «ОК»; else echo "FAILED"; fi'. –

+0

@gniourf_gniourf Ты прав. Все еще держите его, как показано на рисунке. –

0

Вы можете использовать sed:

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

Опция -n подавляет вывод по умолчанию. $ обращается к последней строке ввода. В этом случае мы проверяем, заканчивается ли линия m по /m$/. Если это так, мы подставляем строку словом OK и печатаем его.

Btw, я собирался корыто сценарий оболочки, есть на самом деле слишком много ошибок, чтобы объяснить, ошибка синтаксиса, потому что нет никакого пространства между $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, так и в не-GNU. Проблема заключается не в соблюдении POSIX, а в том, что GNU более прощает, где он предполагает, что разрывы строк должны произойти. 'P' - это конец команды. Подумайте о '}' как о * другой команде *, а не о структуре оболочки. Это не структурированный язык, sed - скорее государственная машина. – ghoti

Смежные вопросы