我想编写 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)
启用-P
Perl 兼容正则表达式,它给我们\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 解析它。如果您需要在 shell 脚本中使用数据,请编写一些 PHP 代码,以 shell 语法打印出变量分配。
#!/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"