用awk返回单引号之间的字符串

时间:2014-06-14 21:03:45

标签: shell awk

我目前正在编写一个脚本来大规模重置wordpress用户名和密码。密码是使用旧密码存储的,现在随着MySQL和PHP的更新,旧密码不再有效,因此需要重置。

我有一个看起来像这样的文件:

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 " '*.' "

没有任何回报。

4 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:3)

您可以使用-F的记录分隔符标记awk并在'分隔

$> 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

答案 2 :(得分: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永远不会以明文存储密码!

答案 3 :(得分: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 本身并不像 awk 那样有效,但我经常使用cat构建一个这样的衬里,修剪输出为我去。如果我要编写这个脚本,我会考虑一种更有效的方法,但如果我正在生成一次性报告,那对我来说没有任何区别。