У нас есть приложение, которое берет параметры настройки из файла. Я хочу извлечь один или два оператора из строки запуска и представить их в виде красивой таблицы.
Примерной строкой может быть -Dmysql.host = mysql1.company.com, но это также может быть ip-адрес или имя компьютера, а не fqdn.
Я хочу найти -Dmysql.host =, но вернуть имя сервера.
Приветствуются любые советы или указатели относительно того, как, как только я найду строку «-Dmysql.host =» в файле, показать все до следующего пробела.
Возможно, есть способ получше. Я планирую запустить это на дюжине машин или около того, чтобы в конечном итоге вернуть список, какие машины приложений настроены так, чтобы сразу разговаривать с какой машиной db.
Спасибо за уделенное время.
Попробуй это:
grep mysql.host file.txt | sed -e 's/.*mysql.host=\(\S*\).*/\1/g'
Вы должны получить значение, которое является значением mysql.host. Вы также можете указать -D в совпадении, если хотите, но я оставил его, потому что это параметр для grep, и вам нужно его избежать.
Исходя из предоставленной информации, я бы сделал это, сначала разделив все на основе пробелов, а затем разделив эти токены на основе знака =. Решение на чистом bash будет примерно таким, как показано ниже.
foo="bar=baz boo=zip"
for keyvalue in $foo; do
key=${keyvalue%%=*}
value=${keyvalue##*=}
echo $key $value
done
Поскольку IFS, вероятно, является пробелом, оболочка заботится о разделении на основе пробелов. Затем вы можете использовать расширение параметра (переменной) для обработки разбиения на пары ключ / значение на основе знака равенства.
Как насчет передачи файлов в старый добрый sed:
$ echo foo -Dmysql.host=mysql1.company.com -bar | grep -- "-Dmysql.host=" | sed -e 's/^.*-Dmysql.host=//' -e 's/ .*//'
mysql1.company.com
Итак, в вашем случае вы бы скормили ему файл следующим образом:
$ grep -- "-Dmysql.host=" FILENAME | sed -e 's/^.*-Dmysql.host=//' -e 's/ .*//'
Я понимаю, что там есть grep, с которым может справиться sed, но это просто проще написать, sed может быть неудобным.