1

我有一堆 web.config 文件,每个文件都可能包含一个到数据库的连接字符串,如下所示:-

<add name="MyConnectionString" connectionString="Data Source=myserver;Initial Catalog=mydb;Persist Security Info=False;User ID=myuser;Password=secret" providerName="System.Data.SqlClient" />

我想要做的是 grepUser ID=myuser;Password=secret部分如果存在的话。

我不能假设密码是连接字符串中的最后一个属性,它后面可能还有其他属性。所以基本上密码总是以"or结尾;

使用 cygwin 我可以像这样搜索文件:-

find /cygdrive/c/inetpub/wwwroot/ -iname 'web.config' -printf '%p\0' | xargs -0 grep -i "password="

我将如何改进 grep 部分以仅检索用户名和密码而不是整行?

然后我可以通过管道将其输入sort -u以获取正在使用的用户名和密码的唯一列表。

4

2 回答 2

2

您可以使用grepwith-P标志来使用 Perl 的正则表达式引擎,并使用-o标志仅返回输入的匹配部分:

grep -Po '(User ID|Password)=[^;"]*' web.config

考虑到您的示例输入,这将返回以下内容:

User ID=myuser
Password=secret

给你现有的命令,它会是这样的:

find /cygdrive/c/inetpub/wwwroot/ -iname 'web.config' -printf '%p\0' | xargs -0 grep -Poi '(User ID|Password)=[^;"]*'
于 2012-12-03T14:10:42.710 回答
1

使用 grep 和 cut 你可以这样做来提取密码:

grep -o 'Password=[^;"]*' web.config | cut -d= -f2
于 2012-12-03T14:07:27.610 回答