Grep слово из файла и сохранить файл как это слово - PullRequest
0 голосов
/ 12 марта 2020

Я использую Ubuntu Linux и извлекаю информацию из файла (скажем, filename.log) и хочу сохранить файл, используя некоторую информацию внутри (filename.log).

пример :

The info in the (filename.log) has version_name and date.

При отображении этой информации на экране с помощью cat будет отображаться:

version_name=NAME
date=TODAY

Затем я хочу сохранить файл как NAME-TODAY.log и понятия не имею, как сделать это.

Любая помощь будет оценена

Ответы [ 2 ]

1 голос
/ 12 марта 2020

Вы можете связать несколько команд basi c linux с символом канала |. В сочетании с тем, что называется подстановкой команд (используя вывод сложной команды для использования в другой команде. Синтаксис: $(your command)), вы можете достичь того, что вы хотите сделать.

Это то, что я придумал на основании вашего вопроса:

cp filename.log $(grep -E "(version_name=)|(date=)" filename.log | cut -f 2 -d = | tr '\n' '-' | rev | cut -c 2- | rev).log

Итак, здесь я использовал cp, $(), grep, cut, tr и, наконец, rev.

Поскольку вы сказали, что понятия не имеете, с чего начать, позвольте мне рассказать вам об этом oneliner:

  1. cp - он используется для копирования файла filename.log в новый файл с именем, основанным на значениях version_name и date (шаг 2 и выше)
  2. подстановка команд $() вся команда между круглыми скобками 'разрешается' до завершения cp Команда в шаге 1. Например, в вашем примере это будет ИМЯ-СЕГОДНЯ. обратите внимание на .log в конце за пределами круглых скобок, чтобы дать ему правильное расширение файла. Вывод этой команды в вашем примере будет NAME-TODAY.log
  3. grep -E "(version_name=)|(date=)" grep с флагом регулярного выражения -E, чтобы иметь возможность делать то, что мы делаем. Соответствует любым строкам , содержащим version_name= ИЛИ date=. Ожидаемый результат:
version_name=NAME
date=TODAY
cut -f 2 -d =, потому что я не заинтересован в version_name, но вместо этого в значении, связанном с этим полем, я использую cut, чтобы разбить строку на символе равенства = с флагом -d =. Затем я выбираю значение за знаком равенства (второе поле) с флагом -f 2. Ожидаемый результат:
NAME
TODAY
tr '\n' '-', поскольку grep выводит несколько строк, я хочу удалить все новые строки и заменить их на da sh. Ожидаемый результат:
NAME-TODAY-
rev | cut -c 2- | rev Я группирую их. rev переворачивает слово, которое я создал. с cut -c 2- я вырезал все символы, начиная со второго символа обратного слова. Это необходимо, потому что я заменил новые строки тире, и это означает, что у меня теперь NAME-TODAY-. По сути, это всего лишь дополнительный шаг для удаления последнего da sh. Смотрите ожидаемые результаты каждого шага:
-YADOT-EMAN
YADOT-EMAN
NAME-TODAY

помните, что это значение находится в подстановке команд шага 2, поэтому конечный результат будет:

cp filename.log NAME-TODAY.log

0 голосов
/ 12 марта 2020

Мне удалось решить эту проблему следующим образом: grep filename.log> /tmp/file.info && filename = $ (echo $ (grep "version_name" /tmp/filename.info | cut -d "" -f) 3) - $ (grep "date" /tmp/filename.info | cut -d "" -f 3) - $ filename.log

...