пошук у файлі та створення нового файлу, лише якщо виконується умова


10

У мене є файл реєстрації, і я хочу шукати в ньому рядок, і тільки якщо в цій рядку буде знайдено новий файл, який потрібно створити. Як я можу досягти цього, в цьому випадку, здається, підходить sed doenst.


3
Використовувати grepдля пошуку. Ця -qопція пригнічує весь вихід і повертає відповідність / невідповідність через grepвихідний код, який легко перевірити.
waltinator

2
Можливо, буде корисно сказати нам, що таке стан.
j0h

Відповіді:


16

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

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

  • Якщо шаблон знайдено ( &&), створіть файл /newfileза допомогою : >/newfile.


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

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


Що робить :?
Джордж Удосен

5
@George :скорочено true, це команда без операції, яка завжди завершується зі статусом виходу 0.
heemayl

@heemayl Це спрацювало найкраще до цього дня
Джекніф

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.