У меня есть файл журнала, и я хочу найти его для строки, и только если эта строка найдена, новый файл будет создан. Как я могу добиться этого, похоже, что в этом случае sed doenst подходит.
command-line
Jacknife
источник
источник
grep
для поиска.-q
Опция подавляет все выходные, и ответный матч / nonmatch черезgrep
«s код выхода, который легко проверяемый.Ответы:
Придерживайтесь оценки короткого замыкания после
grep
:grep -q
не производит вывод на STDOUT, просто завершает работу со статусом выхода,0
если шаблон найден в файлеЕсли шаблон найден (
&&
), создайте файл с/newfile
помощью: >/newfile
.Вы также можете перейти на обычный
touch /newfile
подход или наbash
пустое перенаправление ->/newfile
тоже самое.Просто чтобы заметить, что если файл уже существует, он
touch
будет изменять только соответствующие временные метки без усечения файла. И пустое перенаправление>/newfile
не поддерживается на всех оболочках на ходу (например, вzsh
), где вы должны вручную отправить EOF.источник
:
?:
- это сокращениеtrue
, это команда no-op, которая всегда завершается со статусом выхода 0.Просто для удовольствия:
где
'string'
заменяется строкой (условие),'logfile'
заменяется путем к файлу журнала,'newfile'
заменяется фактическим путем к файлу для создания, все в одинарных кавычках, например, в примере.источник
Вы можете использовать awk со своей
system()
командой. Если/pattern/
найден, кодовый блок{}
будет выполнен, в этом случае мы вызываемtouch /tmp/my_file.txt
черезsystem()
команду.В приведенном ниже примере показано создание временного файла, если в нем присутствует мой пользователь
/etc/passwd
.В качестве альтернативы, мы могли бы использовать перенаправление в файл:
источник
Вы не говорите, хотите ли вы новый пустой файл, или вам нужна более сложная обработка для создания файла.
Если первое, ответ @heemayl точный.
В противном случае используйте оператор if:
источник