Извлеките путь из текстового файла с помощью команды sed

Это даст вам хорошие шансы.

cat../logs/em2.log.1 |grep -i 192.168.21.15 |awk '{system("date"); print $1}'

системная функция позволяет анализировать команду bash в потоке awk.

0
27.01.2020, 14:59
6 ответов

Попробуйте это,

grep -o '[^`]*/cooler[^`]*' one.txt
/var/log/cooler_x86_64_someos8.4/config.cf
  • -oПечатать только совпавшие
0
28.01.2020, 02:54

я смог решить проблему с помощьюsed 's:[^/]*\(.*\)'\''.*$:\1:'

0
28.01.2020, 02:54
sed -n -r '/^cooler/s|.*['\''`"]([^'\''"`]+).*|\1|gp' one.txt

-nбез звука
/^cooler/узор
gp-результат вывода
.*['\''`"]-группа символов перед кавычками (' `")
([^'\''"`]+)-группа символов после кавычки, за исключением следующих кавычек (' `")

0
28.01.2020, 02:54

Начнем с выбора линии интереса. Эта строка начинается со строкиcooler::

$ sed -e '/^cooler:/!d' file
cooler:some default cooler string `/var/log/cooler_x86_64_someos8.4/config.cf'

Выражение /^cooler:/!dудалит из ввода все строки, которые не соответствуют /^cooler:/.

Затем мы извлекаем вещь между обратной цитатой и цитатой:

$ sed -e '/^cooler:/!d' -e "s/.*\`\([^']*\)'.*/\1/" file
/var/log/cooler_x86_64_someos8.4/config.cf

Выражение s/.*\`\([^']*\)'.*/\1/заменяет всю строку строкой внутри `...'. Обратная кавычка должна быть экранирована, так как это выражение заключено в двойные кавычки (, в противном случае это будет началом подстановки команд в оболочке ).

Вы также можете выполнить извлечение пути в два этапа. :Удалите все до обратной кавычки включительно, а затем удалите все после одинарной кавычки включительно. Это может даже выглядеть немного опрятнее:

$ sed -e '/^cooler:/!d' -e 's/.*`//' -e "s/'.*//" file
/var/log/cooler_x86_64_someos8.4/config.cf
0
28.01.2020, 02:54

Еще пара вариантов регулярных выражений

  1. Использованиеsed

    sed -n '/^cooler:/s/^.*`\(.*\)'"'"'/\1/p'
    

    Это можно объяснить следующим образом

    • -nничего не печатать, если нет совпадения
    • ^cooler:ищите cooler:в начале строки
    • s/old/new/pзаменить oldна newи вывести результат, если замена прошла успешно
    • ^.*`\(.*\)'"'"'сопоставляет все с обратной кавычкой, затем фиксирует все, что находится внутри квадратных скобок (... ), затем фиксирует одинарную кавычку до конца строки. '"'"'— пустая оболочка -первый 'завершает исходную строку в одинарных -кавычках, "'"заключает в кавычки одинарную -кавычку, последний 'перезапускает одинарную -строку в кавычках
    • \1в замещающей части ссылается на захваченную строку из сопоставления с образцом
  2. Использование GNUgrep

    grep -oP '^cooler:.*`\K'"[^']*"
    

    Это можно объяснить почти так же, как и раньше

    • -oPвыводить только совпадения и использовать регулярные выражения perl (PCRE )для синтаксического анализа
    • \Kграница :все до этого сопоставляется, но отбрасывается; все последующее включается в результат
    • [^']*соответствует всему, кроме одной -кавычки
0
28.01.2020, 02:54
$ sed -ne '
   /^cooler:/y/`'\''/\n\n/
   s/.*\n\(.*\)\n.*/\1/p
' one.txt

Это posix sed, и мы меняем кавычки и обратную кавычку на новые строки. Тогда путь Зажат между двумя новыми строками.

0
28.01.2020, 02:54

Теги

Похожие вопросы