Назад | Перейти на главную страницу

Сценарий оболочки для извлечения строки из файла и возврата следующих символов до пробела

У нас есть приложение, которое берет параметры настройки из файла. Я хочу извлечь один или два оператора из строки запуска и представить их в виде красивой таблицы.

Примерной строкой может быть -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 может быть неудобным.