в моем каталоге есть несколько файлов с шаблоном
simulation_y_t
для всех файлов с этим шаблоном. Мне нужно будет проверить, появляется ли в последней строке файла слово hgip
или нет. ... слово может быть не отделено пробелами от окружающих символов, но если оно появится, оно появится в последних 20 символах строки ...
Как бы я мог это сделать?
Используя sed
:
for file in *simulation_y_t*; do sed -n '$ s/.*hgip.\{0,16\}$/&/p' "$file"; done
Это проверит последнюю строку каждого файла и если hgip
прибывает в последних 20 символах, это распечатает строку.
Вот расширенная версия (печатающий имена файлов также):
#!/bin/bash
for file in *simulation_y_t*; do
line="$(sed -n '$ s/.*hgip.\{0,16\}$/&/p' "$file")"
[[ -n $line ]] && echo "$file: " "$line"
done
Запуск $
(прежде чем s///
шаблон), указывает на последнюю строку файла.
Шаблон hgip.\{0,16\}$
гарантирует это hgip
происходит только с последними 20 символами строки
line
будет содержать строку с соответствием
[[ -n $line ]]
тесты, если длина $line
является ненулевым, раз так затем, файл и подобранная последняя строка будут распечатаны.
Это может также быть сделано с помощью grep
со справкой от tail
:
grep 'hgip.\{0,16\}$' < <(for f in *simulation_y_t*;do tail -1 "$f";done)
Здесь логика - то же как sed
кроме того tail -1
даст нам последние строки файлов так, чтобы мы могли работать grep
по ним.
РЕДАКТИРОВАНИЕ:
Если Вы хотите удалить последнюю строку, если она соответствует условиям, используйте это:
!/bin/bash
for file in *simulation_y_t*; do
[[ -n "$(sed -n '$ s/.*hgip.\{0,16\}$/&/p' "$file")" ]] && sed -i.bak '$d' "$file"
done
Исходный файл будет сохранен с a .bak
расширение, если Вы не хотите это просто, использует -i
вместо -i.bak
.