← Назад к вопросам

Как скопировать отфильтрованные строчки в отдельный файл

1.3 Junior🔥 132 комментариев
#Автоматизация тестирования

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Копирование отфильтрованных строк в отдельный файл в Linux/Unix-средах

Это классическая задача обработки текста в командной строке. Основной подход - использование конвейеров (pipes) и утилит grep, awk, sed в сочетании с перенаправлением вывода (output redirection). Рассмотрим основные методы.

1. Использование grep (наиболее частый случай)

Команда grep предназначена для поиска строк по паттерну (регулярному выражению или фиксированной строке).

# Базовый синтаксис: grep 'паттерн' исходный_файл > целевой_файл
grep 'error' application.log > errors_only.log

# С флагом -i (игнорировать регистр)
grep -i 'warning' system.log > warnings.txt

# С флагом -v (инвертировать выбор - скопировать все СТРОКИ, НЕ содержащие паттерн)
grep -v 'DEBUG' app.log > filtered.log

# С флагом -E (расширенные регулярные выражения)
grep -E 'FATAL|CRITICAL' logfile.log > critical_events.txt

# С флагом -A (добавить N строк после совпадения) и -B (добавить N строк до совпадения)
grep -A 2 -B 1 'Exception' trace.log > exception_context.log

2. Использование awk (для сложной фильтрации)

awk - мощный язык для обработки текста, основанный на столбцах и условиях.

# Скопировать строки, где первое поле равно "ERROR"
awk '$1 == "ERROR"' input.csv > errors.csv

# Скопировать строки, где третий столбец численно больше 100
awk '$3 > 100' data.txt > large_values.txt

# С комбинированным условием (логическое И)
awk '/error/ && $5 == "failed"' service.log > failed_errors.log

# Использование встроенных переменных (NR - номер строки)
awk 'NR >= 10 && NR <= 50' bigfile.txt > lines_10_to_50.txt

3. Использование sed (для редактирования потоков)

sed часто используется для замены текста, но может и фильтровать.

# Скопировать строки, содержащие паттерн
sed -n '/pattern/p' source.txt > target.txt

# Скопировать строки с 100 по 200
sed -n '100,200p' document.txt > fragment.txt

# Удалить строки с комментариями (начинающиеся с #) и сохранить результат
sed '/^#/d' config.cfg > clean_config.cfg

4. Комбинирование утилит в конвейере

Мощь командной строки раскрывается при объединении утилит.

# Найти строки с "error", отсортировать уникальные значения
grep 'error' logs/*.log | sort | uniq > unique_errors.txt

# Фильтровать через awk, затем подсчитать строки
awk '/POST/ {print $7}' access.log | grep -v '/health' > post_endpoints.txt

# Многоэтапная фильтрация: grep -> awk -> сохранение
grep '2023-10-27' production.log | awk '$2 == "ERROR"' | tee daily_errors.log | wc -l

5. Важные нюансы и лучшие практики

  • Перезапись vs добавление: Оператор > перезаписывает файл, >> добавляет в конец.
  • Сохранение стандартного вывода и ошибок:
    # Сохранить и вывод, и ошибки в разные файлы
    grep 'pattern' file.txt > output.txt 2> errors.txt
    
    # Перенаправить все в один файл
    grep 'pattern' file.txt > all_output.txt 2>&1
    
  • Использование tee для одновременного вывода и сохранения:
    # Вывести на экран И сохранить в файл
    grep 'important' data.log | tee important_entries.log
    
    # С добавлением в файл (без перезаписи)
    grep 'new_entry' data.log | tee -a important_entries.log
    
  • Работа с кодировками:
    # Для файлов в кодировке Windows (CRLF)
    grep 'pattern' file.txt | dos2unix > unix_filtered.txt
    
    # Указание кодировки
    iconv -f CP1251 -t UTF-8 source.txt | grep 'pattern' > filtered_utf8.txt
    

6. Пример реального сценария для QA Engineer

Представьте, что вам нужно извлечь все тестовые сценарии, помеченные как @smoke, из файла с тестами.

# Фильтрация тестов по тегам
grep -E '@smoke|@critical' test_suite.py > smoke_tests.py

# С контекстом - взять 3 строки после тега
grep -A 3 '@regression' tests/*.js > regression_suite.js

# Комплексный пример: найти падающие тесты в логе
grep 'FAILED\|ERROR' test_run.log | \
  awk '{print $2, $5}' | \
  sort -u > failed_tests_$(date +%Y%m%d).txt

7. Создание скрипта для регулярного использования

Для частых операций создайте скрипт:

#!/bin/bash
# filter_and_save.sh - фильтрация строк по паттерну
if [ $# -lt 2 ]; then
    echo "Использование: $0 <паттерн> <исходный_файл> [целевой_файл]"
    exit 1
fi

PATTERN=$1
INPUT_FILE=$2
OUTPUT_FILE=${3:-"filtered_$(date +%s).txt"}

if [ ! -f "$INPUT_FILE" ]; then
    echo "Ошибка: файл '$INPUT_FILE' не найден"
    exit 2
fi

grep "$PATTERN" "$INPUT_FILE" > "$OUTPUT_FILE"
echo "Отфильтрованные строки сохранены в: $OUTPUT_FILE"
echo "Количество строк: $(wc -l < "$OUTPUT_FILE")"

Резюме

Выбор инструмента зависит от сложности фильтрации:

  • grep - для простого поиска по тексту/регулярным выражениям
  • awk - для фильтрации по столбцам и сложным условиям
  • sed - для задач, связанных с редактированием или выбором диапазонов строк

Ключевая концепция - перенаправление вывода (>, >>) и конвейеры (|), которые позволяют комбинировать утилиты UNIX для решения сложных задач обработки текста минимальными средствами. Для QA Engineer эти навыки критически важны при анализе логов тестовых прогонов, обработке результатов тестирования и автоматизации рутинных задач.

Как скопировать отфильтрованные строчки в отдельный файл | PrepBro