Извлечение конкретной строки из строки стандартным grep, egrep или awk - PullRequest
0 голосов
/ 27 июня 2019

Я пытаюсь извлечь определенную строку из вывода grep

uci show minidlna

создает большой список

.
.
.
minidlna.config.enabled='1'
minidlna.config.db_dir='/mnt/sda1/usb/db'
minidlna.config.enable_tivo='1'
minidlna.config.wide_links='1'
.
.
.

, поэтому я попытался сузить то, что хотел, запустив

uci show minidlna | grep -oE '\bdb_dir=\S+'

это сужает вывод до

db_dir='/mnt/sda1/usb/db'

, что я хочу, чтобы вывести только

/mnt/sda1/usb/db

без кавычек и без начального "db_dir", поэтому яможно запустить rm /mnt/sda1/usb/db/file.db

Я использовал ответы, найденные здесь Как извлечь строку, следуя шаблону с помощью grep, regex или perl , и это так близко, как я получил.

РЕДАКТИРОВАТЬ: после использования команды awk Эда Мортона мне нужно было передать вывод в команду rm.

я использовал:

| ( read DB; (rm $DB/files.db).

read DB передает вывод в переменную DB.

(...) объединяет команды.

rm $DB/files.db удаляет файл files.db.

Ответы [ 4 ]

2 голосов
/ 27 июня 2019

Это то, что вы пытаетесь сделать?

$ awk -F"'" '/db_dir/{print $2}' file
/mnt/sda1/usb/db

Это будет работать в любом awk в любой оболочке на каждом компьютере UNIX.

Если это не то, что вам нужно, отредактируйтеваш вопрос, чтобы уточнить ваши требования и опубликовать более репрезентативный образец ввода / вывода.

0 голосов
/ 29 июня 2019

Я бы сделал это:

После того, как вы извлекли свою строку в file.txt (или передали ее в эту команду), разделите поля, используя символ кавычки.Используйте printf для генерации команды rm и передайте ее в bash для выполнения.

$ awk -F"'" '{printf "rm %s.db/file.db\n", $2}' file.txt  | bash
rm: /mnt/sda1/usb/db.db/file.db: No such file or directory

С исходной командой:

$ uci show minidlna | grep -oE '\bdb_dir=\S+' | \
       awk -F"'" '{printf "rm %s.db/file.db\n", $2}' | bash
0 голосов
/ 28 июня 2019

Что ж, в итоге вы получите строку типа db_dir='/mnt/sda1/usb/db'. Сначала я удалил бы кавычки, отправив это на

.... |  tr -d "'"

Теперь вы получите строку типа db_dir=/mnt/sda1/usb/db. Допустим, эта строка хранится в переменной с именем confstr, затем

${confstr##*=}

дает вам только /mnt/sda1/usb/db, поскольку *= обозначает все от начала до знака равенства, а ## обозначает удаление.

0 голосов
/ 27 июня 2019

Использование sed с некоторыми усилиями, чтобы избежать одинарных кавычек:

sed -n 's/^minidlna.config.db_dir=\s*\S\(\S*\)\S\s*$/\1/p' input
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...