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

10

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

    
задан Jacknife 25.01.2017 в 14:38
источник

4 ответа

16

Выполните оценку короткого замыкания после grep :

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

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

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

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

    
ответ дан heemayl 25.01.2017 в 14:46
6

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

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

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

    
ответ дан Jacob Vlijm 25.01.2017 в 15:10
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 
    
ответ дан Sergiy Kolodyazhnyy 25.01.2017 в 15:01
0

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

Если первое, ответ @heemayl находится на месте.

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

if grep -q 'search_pattern' /file
then
    # Create your file here
fi
    
ответ дан Paddy Landau 31.01.2017 в 08:51