2017-07-29 62 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