как найти последний экземпляр настройки в файле конфигурации - PullRequest
1 голос
/ 28 декабря 2010

Я пытаюсь выяснить, как найти запись last строки в нескольких файлах конфигурации на сервере.Каждая из строк будет в файле /home/***usernamewouldbehere/public_html/typo3conf/localconf.php

Вкратце - последняя запись в файлах конфигурации будет указывать на сервер базы данных, который использует приложение- и нам нужно знать, какие учетные записи указывают на какой сервер БД.

Хотя я могу запустить что-то вроде этого -

grep "$_db_host" /home/*/public_html/conf/localconf.php

Это не очень помогает, потому что дает нам много информации ... а не то, что нам действительно нужно.

Что мне действительно нужно знать, так это последняя запись этой строки $ _db_host = 'xx';и отсортировать их в файле экспорта

Поскольку файлы конфигурации могут иметь несколько записей (пример ниже)

$_db_host = 'localhost';
$_db_host = '10.0.1.234';

Было бы здорово перечислить в файле все те, которые имеютзапись для 'localhost' и затем перечислите все те, у которых есть запись для '10 .0.1.234 '(или того сервера, который там может быть), но даже если мне нужно сделать это вручную, это было бы здорово.

Я не уверен, как добраться до него с помощью Awk - ... и действительно застрял

Я надеюсь, что это что-то, что будет передано следующим образом

db_host = localhost /home/username1/www/conf/localconf.php
db_host = localhost / home/username2/public_html/conf/localconf.php

db_host= '10.1.2.23' /home/username55/public_html/conf/localconf.php 

надеясь, что это поможет вам помочь: -)

Ответы [ 4 ]

3 голосов
/ 28 декабря 2010

Немного неясно, о чем вы спрашиваете. Не вдаваясь в perl или awk, возможно, вы могли бы использовать что-то вроде

grep -H '$_db_host =' /home/*/public_html/typo3conf/localconf.php | tail -n 1

Или, если вы хотите последний в каждом файле (синтаксис bash):

for i in (/home/*/public_html/typo3conf/localconf.php); do
   grep -H '$_db_host =' $i /dev/null | tail -1
done

Если вы хотите классифицировать по определенным значениям $ _db_host, вы можете использовать сортировку (с хвостовым трюком или без него):

grep -H '$_db_host =' /home/*/public_html/typo3conf/localconf.php | sort -t = -k 2,2

(сортировка говорит использовать «=» в качестве разделителя полей, а затем сортировать по второму полю - это будет эффективно сортировать по значению $ _db_host, а вывод -H grep скажет grep отобразить имя файла из совпадающих строк в начале.

Обратите внимание, что вы также можете передать вывод цикла выше:

for i in (/home/*/public_html/typo3conf/localconf.php); do
   grep -H '$_db_host =' $i /dev/null | tail -1
done | sort -t = -k 2,2

Вы можете смешивать или сочетать свои инструменты по своему усмотрению!

еще один очень полезный инструмент - это «вырезать» (с -d для указания разделителя полей), который вы можете использовать для разделения выходных данных.

(Вы можете делать все это также в perl и awk, но иногда, особенно для "одноразовых", конвейеры оболочки проще)

2 голосов
/ 28 декабря 2010

Ваш вопрос немного неясен, но это первоначальная попытка:

grep "$_db_host" /home/*/public_html/typo3conf/localconf.php | \
    awk '{ print $1":"$3; }' | awk -F ':' '{ print $3": "$1 }' | sort

Что означает grep для $_db_host строк. Возможно, вы захотите использовать регулярное выражение, чтобы сделать его более надежным, если там есть другие строки с подстрокой $_db_host, которую вы не хотите сопоставлять. Затем он использует два прохода awk для преобразования строк в формат 'ip';: configfile. При необходимости вы можете избавиться от кавычек и точек с запятой с помощью нарезки bash, но если формат не является строгим, вам понадобится регулярное выражение. Наконец, он сортирует результаты так, что совпадающие IP-адреса будут следовать друг за другом (за исключением различий в кавычках, поэтому вы можете их исключить).

Пример вывода:

'10.0.1.234';: /home/foo/public_html/typo3conf/localconf.php
'localhost';: /home/bar/public_html/typo3conf/localconf.php
1 голос
/ 28 декабря 2010

Здесь, кажется, есть два вопроса:

  1. Список файлов, которые содержат "$_db_host = 'localhost';".

     grep -l '^[ <t>]*$_dbhost[ <t>]*=[ <t>*]'localhost'[ <t>]*;' \
             /dev/null /home/*/public_html/conf/localconf.php
    

    Я использую <t>, чтобы указать, где скрипт может содержать вкладку; вам может не понадобиться быть таким осторожным, если вы уверены, что ваши строки жестко отформатированы.

  2. Список последнего имени хоста (адреса) в файле, который также может содержать записи localhost (где записи localhost должны игнорироваться).

     grep -l '^[ <t>]*$_dbhost[ <t>]*=[ <t>*]'[^']*'[ <t>]*;' \
             /dev/null /home/*/public_html/conf/localconf.php |
     grep -v "'localhost'" |
     sed 's/:[ <t>]*$_dbhost[ <t>]*=[ <t>]*'\([^']*\)';/ \1/' |
     awk '{address[$1] = $2}
         END { for (file in address) {
                   printf "%s %s\n", file, address[file];
               }
             }' | sort
    

    Команды grep -v и sed могут быть объединены, но проще понять, если это не так. Если этот сценарий не будет использоваться очень часто, снижение производительности, вероятно, не стоит беспокоить.

    Первый grep - это небольшая адаптация ответа на вопрос 1; он генерирует список имен файлов (при поиске '/ dev / null' ничего не будет найдено, но он гарантирует, что, если существует только один файл localconf.php, имя все еще будет в списке). Второй grep удаляет строки локального хоста. Команда sed удаляет мусор, оставляя только имя файла и имя хоста в двух разделенных пробелами полях, так же, как awk любит представленные данные. Команда awk использует ассоциативный массив с ключом по имени файла для записи последней записи в файле; присваивание всегда перезаписывает любое предыдущее значение. Блок END затем распечатывает все имена файлов и соответствующее последнее значение $_db_host, установленное в файле. sort просто перечисляет файлы в детерминированном порядке; порядок петель for не является детерминированным. Вы можете выровнять скрипт awk на одну или две строки - я распределил его на 5, чтобы вместить ограниченную ширину линии в SO.


Адресация комментария:

Мы можем адаптировать мой ответ «Часть 2» - и исправить проблему с одинарными и двойными кавычками, которая приводит к ошибкам оболочки.

Отредактировано: удалена ненужная опция -l и восстановлена ​​пропущенная $.

 grep "^[ <t>]*\$_dbhost[ <t>]*=[ <t>*]'[^']*'[ <t>]*;" \
         /dev/null /home/*/public_html/conf/localconf.php |
 sed "s/:[ <t>]*\$_dbhost[ <t>]*=[ <t>]*'\([^']*\)';/ \1/" |
 awk '{address[$1] = $2}
     END { for (file in address) {
               printf "%s %s\n", file, address[file]; } }' |
 sort

Это оставляет записи localhost в списке. Я изменил то, что раньше было одинарными кавычками, окружающими регулярное выражение grep и скрипт sed, в двойные кавычки. Это означает, что необходимо экранировать символы $.


Игнорирование вкладок:

 grep "^ *\$_dbhost *= '[^']*' *;" \
         /dev/null /home/*/public_html/conf/localconf.php |
 sed "s/: *\$_dbhost *= *'\([^']*\)';/ \1/" |
 awk '{address[$1] = $2}
     END { for (file in address) {
               printf "%s %s\n", file, address[file]; } }' |
 sort

Я на самом деле проверил это с помощью ряда тривиальных файлов вместо длинных длинных сложных / home / * / public_html / ... путей - все работало нормально.

JL: cat f1
$_dbhost = 'localhost';
JL: cat f2
$_dbhost = 'localhost';
$_dbhost = '9.12.23.34';
JL: 

1058 * Etc. *

0 голосов
/ 28 декабря 2010

Вы regex-fu слабы.

> cat localconf.php
$_db_host = '10.0.1.234';

> grep -oP '(?<=\$_db_host = '\'').*(?='\'';)' localconf.php
10.0.1.234

> grep --version | head -n 1
GNU grep 2.5.4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...