Файл разбора для рекурсивного шаблона

в моем каталоге есть несколько файлов с шаблоном

simulation_y_t

для всех файлов с этим шаблоном. Мне нужно будет проверить, появляется ли в последней строке файла слово hgip или нет. ... слово может быть не отделено пробелами от окружающих символов, но если оно появится, оно появится в последних 20 символах строки ...

Как бы я мог это сделать?

1
задан 30 May 2015 в 22:31

1 ответ

Используя 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.

2
ответ дан 30 May 2015 в 22:31

Другие вопросы по тегам:

Похожие вопросы: