2017-07-29 47 views
1

我尝试从.my.cnf grep(写入访问)密码,但我还没有得到它。grep来自.my.cnf的密码

.my.cnf看起来是这样的:

# longer 
# comment text 

[clientreadonly] 
password=pass1 # comment 
port=3306 
user=test_ro 
socket=/var/lib/mysql/mysql.sock 

[client] 
password=pass2 # comment 
port=3306 
user=test 
socket=/var/lib/mysql/mysql.sock 

,我想给grep pass2。当然代码不应该太冗长。我结束了

grep 'password=' ~/.my.cnf | sed -e 's/password=// 

但thath实际离开pass2背后的#comment,我不想更换整个评论(因为它在原有的和愚蠢的,只是取代它长)。所以我需要一个正则表达式来获得pass2

主要目标是,到grep密码,所以我可以很容易地在shell命令行中使用它

+0

前行,现在你需要什么样的基础上解释'密码= PASS1#comment'应该被忽略 – Sundeep

+0

最好将上线的基础上以前的通过(只读),但它也可以只采取第二次发生 – Asara

+0

并且在'='之后和'#comment'之前你需要的文本之间总是有空格吗? – Sundeep

回答

1
$ awk -F'[= ]' '/^password=/ && p !~ /clientreadonly/{print $2} {p=$0}' ~/.my.cnf 
pass2 
  • -F'[= ]'利用空间或=作为字段分隔
  • /^password=/ && p !~ /clientreadonly/如果符合password=和以前的行开始不包含clientreadonly
    • print $2打印第二个fi场
  • p=$0保存在p可变
+1

谢谢,它的工作原理,并解释得很好 – Asara

0

您可以修改有点像下面 -

grep 'password=' ~/.my.cnf | sed -e 's/password=//' -e 's/ # comment//' 

或其他方式 -

grep 'password=' ~/.my.cnf | cut -d' ' -f1 | cut -d'=' -f2 
+0

第二个可以工作,但它会返回两个密码,如'pass1 \ npass2' – Asara

+0

iam非常抱歉,我的问题出现了一个错误,我对第一个密码有pXassword,但那只是对于调试,原来它的密码 – Asara

+0

好吧,所以你只需要第二次发生? –

1

使用perl:

perl -00 -ane '/\[client\].password=(\S+)/s && print $1' < ~/.my.cnf 

输出:

pass2 
+0

啊对不起,不行不过,它会返回两个密码,比如'pass1pass2' – Asara

+0

@Asara:那么你的示例文件不是你给的。在问题中,它包含'pXassword = pass1#comment' – Toto

+0

uups对不起,那是用于调试的,编辑 – Asara