구성 파일의 데이터를 구문 분석하는 bash 스크립트를 작성하고 싶습니다. 이것을 검색했지만 필요에 맞게 수정할 수 있는 항목을 찾지 못했습니다.
좀라! 구성 파일:
public $access = '1';
public $debug = '0';
public $debug_lang = '0';
public $dbtype = 'mysqli';
public $host = 'localhost';
public $user = 'template';
public $password = 'template';
public $db = 'template_druha';
public $dbprefix = 'dsf1i_';
public $live_site = '';
public $secret = '2w9gHzPb4HfAs2Y9';
public $gzip = '0';
public $error_reporting = 'default';
"$user"
데이터베이스 자격 증명을 사용 및 구문 분석 하고 "$password"
이를 변수에 저장하고 싶습니다 . 모범 사례는 무엇입니까?
답변1
GNU를 사용하면 grep
다음과 같은 작업을 수행할 수 있습니다.
user=$(grep -oP "\\\$user.+?'\K[^']+" file)
pass=$(grep -oP "\\\$password.+?'\K[^']+" file)
Perl 호환 정규 표현식을 활성화 -P
하면 우리에게 제공됩니다 \K
(지금까지 일치하는 항목은 무시). -o
"줄에서 일치하는 부분만 인쇄합니다. 그런 다음 다음 항목까지 작은따옴표와 하나 이상의 비문자를 검색합니다 ( 변수 확장 을 피하고 정규 표현식의 일부로 간주되지 않으려면 $var
세 개가 필요합니다 ) .\
$
'
'
또는 다음을 사용할 수 있습니다 awk
.
user=$(awk -F"'" '/\$user/{print $2}' file)
pass=$(awk -F"'" '/\$password/{print $2}' file)
'
여기서는 변수 값이 두 번째 필드가 되도록 필드 구분 기호를 설정했습니다 . 이 awk
명령은 일치하는 줄의 두 번째 필드를 인쇄합니다.
답변2
예시 입력의 경우:
$ cat /tmp/foo
public $access = '1';
public $debug = '0';
public $debug_lang = '0';
public $dbtype = 'mysqli';
public $host = 'localhost';
public $user = 'template-user';
public $password = 'template-pass';
public $db = 'template_druha';
public $dbprefix = 'dsf1i_';
public $live_site = '';
public $secret = '2w9gHzPb4HfAs2Y9';
public $gzip = '0';
public $error_reporting = 'default';
다음을 수행할 수 있습니다.
user="$(grep '$user' /tmp/foo | sed -e 's/ *$//g' -e 's/;$//' | awk -F= '{ print $2}')"
pass="$(grep '$password' /tmp/foo | sed -e 's/ *$//g' -e 's/;$//' | awk -F= '{ print $2}')"
- grep은 특정 파일에서 사용자 또는 비밀번호 행을 검색합니다.
- 첫 번째 sed 표현식은 모든 후행 공백을 제거합니다.
- 두 번째 sed 표현식은 후행 ;
- awk는 =를 열 구분 기호로 사용하고 두 번째 열을 인쇄합니다.
var=$(...)
모두 평가하고 출력을 얻은 후 변수에 저장합니다.
답변3
이 파일은 PHP 파일이므로 데이터를 추출하는 가장 안정적인 방법은 PHP를 사용하여 구문 분석하는 것입니다. 셸 스크립트에서 데이터를 사용해야 하는 경우 셸 구문에서 변수 할당을 인쇄하는 일부 PHP 코드를 작성하세요.
#!/bin/sh
eval "$(php -r '
include $argv[1];
$config = new JConfig();
echo "joomla_user=\x27" . preg_replace("/\x27/", "\x27\\\x27\x27", $config->user) . "\x27\n";
echo "joomla_password=\x27" . preg_replace("/\x27/", "\x27\\\x27\x27", $config->password) . "\x27\n";
' /path/to/configuration.php)"
echo "User is $joomla_user"