Найти файлы ( нет), содержащий текстовый шаблон на указанной строке

/ usr / bin - это общие общесистемные двоичные файлы, которые содержат большинство исполняемых файлов (т. Е. Готовых к запуску программ), которые не требуется для загрузки (т. е. запуска) или восстановления системы.

/ usr / local / bin предназначен для программ, которые может запускать обычный пользователь.

0
20.12.2018, 22:29
2 ответа

Чтобы проверить содержимое последней строки каждого файла в текущем каталоге, используйте tailиgrep:

for file in *.txt
do
  tail -1 -- "$file" | grep -q "must have" || printf '%s\n' "$file"
done

Предполагается, что имена ваших текстовых файлов заканчиваются на .txt; отрегулируйте этот подстановочный знак по мере необходимости. tail -1захватывает последнюю строку файла (с поиском назад, что более эффективно, чем потенциальное чтение файла вперед ); эта строка затем направляется в grepдля поиска нужного текста. Флаг -qдля команды grep сообщает ему, что он должен молчать о своей работе, и просто устанавливает соответствующий код возврата. Если grep не не находит совпадение, то чередование ||"или" указывает оболочке выполнить printf, которая печатает имя файла.

Вы можете поместить этот код в скрипт или в функцию:

lastlinehas() {
  for file in *.txt
  do
    tail -1 -- "$file" | grep -q "$1" || printf '%s\n' "$file"
  done
}
1
28.01.2020, 02:41

Использование GNUawk:

$ awk 'ENDFILE { if ($0 !~ /must have/) print FILENAME }' file2.txt file1.txt
file2.txt

Здесь используется блок ENDFILEдля проверки текущего содержимого$0(последней строки файла, до которого мы только что дошли до конца )относительно регулярного выражения must have. Если совпадений нет, печатается имя файла.

Блок ENDFILEнедоступен в BSD awkили mawk.

Использование стандартаawk:

for fname in *.txt; do
    awk 'END { if ($0 !~ /must have/) print FILENAME }' "$fname"
done

Это работает аналогично решению GNU awk, но вызывает awkодин раз для каждого файла.

0
28.01.2020, 02:41

Теги

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