2014-06-14 48 views
3

我目前正在編寫一個腳本來大量重置wordpress用戶名和密碼。密碼是使用舊密碼保存的,現在隨着MySQL和PHP的更新,舊密碼不再有效,因此需要重置。單引號與awk之間的返回字符串

我有一個看起來像這樣的文件:

define('DB_USER', 'abc_12345'); 
define('DB_PASSWORD', 'abc12345'); 
define('DB_USER', 'def_34589'); 
define('DB_PASSWORD', 'def34589'); 

我只是需要返回單引號內的值:

DB_USER abc_12345 
DB_PASSWORD abc12345 

DB_USER def_34589 
DB_PASSWORD def34589 

現在,我已經在左顧右盼類似的問題,但他們都和我一起工作有點不同。

我已經試過如下:

cat file.txt | awk '{print $1,$2}' 

返回

define('DB_USER', 'abc_12345'); 
define('DB_PASSWORD', 'abc12345'); 
define('DB_USER', 'def_34589'); 
define('DB_PASSWORD', 'def34589'); 

我已經試過

cat file.txt | awk '{print $1}' 

返回

define('DB_USER', 
define('DB_PASSWORD', 

我試過

cat file.txt | awk '{print $2}' 

返回

'abc_12345'); 
'abc12345'); 

我也試過awk中使用grep

cat file.txt | awk '{print $2}' | grep -P " '*.' " 

不返回任何混合。

回答

5
awk -F\' '{print $2,$4}' file.txt 
+0

謝謝你。我清楚地想到了這一點。 – Jimmy

3

您可以使用記錄分隔標誌awk和獨立-F'

$> string="define('DB_USER', 'abc_12345');" 
$> echo $string | awk -F"'" '{print $2}' 
DB_USER 
$> echo $string | awk -F"'" '{print $4}' 
abc_12345 

或者只是簡單地傳遞文件

awk -F"'" '{print $2 $4}' file.txt 
1

如果你有GNU grep

$ grep -Po "(?<=')[^',]+(?=')" file | xargs -n2 
DB_USER abc_12345 
DB_PASSWORD abc12345 
DB_USER def_34589 
DB_PASSWORD def34589 

這對於單引號內部不是',然後xargs只是將每行匹配兩個匹配。

P.S從不以明文存儲密碼!

+0

謝謝你的幫助。我只有一個問題,你能解釋「(?<=')[^',] +(?=')」部分嗎?我已經看到這個,但還沒有完全理解它。 – Jimmy

+0

它使用正則表達式看看周圍:http://www.regular-expressions.info/lookaround.html –

+0

謝謝你的幫助,併爲我提供一些家庭作業 – Jimmy

0

我能夠做到這一點Cygwin以下方式...

$ cat test.file | awk -F "\'" '{print $2" "$4}' 
DB_USER abc_12345 

因爲逃逸的,但是輸出應該是你正在使用類似的語法來你已經嘗試過想什麼你可能會得到一個AWK警告。我發現使用雙引號,至少在我的shell中,圍繞單引號分隔符運行良好,只要你在中間跳過單引號即可。對於輸出領域的awk但是你想切換回單引號,否則就會有這樣的錯誤...

$ cat test.file | awk -F "\'" "{print $2" "$4}" 
awk: cmd. line:1: {print 
awk: cmd. line:1:  ^unexpected newline or end of string 

順便說一句,我瞭解使用不如本身效率很高,但我經常使用cat創建一個像這樣的內襯,在我去的時候修剪輸出。如果我要將其編寫出來,我會考慮一種更有效的方法,但是如果我生成一次性報告,那對我來說沒有任何影響。

相關問題