искать файл и создавать новый файл, только если выполняется условие

10

У меня есть файл журнала, и я хочу найти его для строки, и только если эта строка найдена, новый файл будет создан. Как я могу добиться этого, похоже, что в этом случае sed doenst подходит.

Jacknife
источник
3
Используйте grepдля поиска. -qОпция подавляет все выходные, и ответный матч / nonmatch через grep«s код выхода, который легко проверяемый.
вальтинатор
2
Может быть полезно рассказать нам, каково состояние.
01

Ответы:

16

Придерживайтесь оценки короткого замыкания после grep:

grep -q 'search_pattern' /file && : >/newfile
  • grep -qне производит вывод на STDOUT, просто завершает работу со статусом выхода, 0если шаблон найден в файле

  • Если шаблон найден ( &&), создайте файл с /newfileпомощью : >/newfile.


Вы также можете перейти на обычный touch /newfileподход или на bashпустое перенаправление - >/newfileтоже самое.

Просто чтобы заметить, что если файл уже существует, он touchбудет изменять только соответствующие временные метки без усечения файла. И пустое перенаправление >/newfileне поддерживается на всех оболочках на ходу (например, в zsh), где вы должны вручную отправить EOF.

heemayl
источник
Что делает :?
Джордж Удосен
5
@George :- это сокращение true, это команда no-op, которая всегда завершается со статусом выхода 0.
heemayl
@heemayl Это работает лучше и по сей день
Jacknife
6

Просто для удовольствия:

python3 -c "if 'string' in open('logfile').read(): open('newfile', 'wt')"

где 'string'заменяется строкой (условие), 'logfile'заменяется путем к файлу журнала, 'newfile'заменяется фактическим путем к файлу для создания, все в одинарных кавычках, например, в примере.

Якоб Влейм
источник
4

Вы можете использовать awk со своей system()командой. Если /pattern/найден, кодовый блок {}будет выполнен, в этом случае мы вызываем touch /tmp/my_file.txtчерез system()команду.

В приведенном ниже примере показано создание временного файла, если в нем присутствует мой пользователь /etc/passwd.

$ awk '/xieerqi/{system("touch /tmp/my_file.txt")}' /etc/passwd

$ ls -l /tmp/my_file.txt
-rw-rw-r-- 1 xieerqi xieerqi 0 1月  25 07:58 /tmp/my_file.txt

В качестве альтернативы, мы могли бы использовать перенаправление в файл:

 awk '/xieerqi/{f="/tmp/my_file.txt";print "" > f;close(f)}' /etc/passwd 
Сергей Колодяжный
источник
0

Вы не говорите, хотите ли вы новый пустой файл, или вам нужна более сложная обработка для создания файла.

Если первое, ответ @heemayl точный.

В противном случае используйте оператор if:

if grep -q 'search_pattern' /file
then
    # Create your file here
fi
Падди Ландау
источник