我目前正在编写一个脚本来大规模重置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 " '*.' "
没有任何回报。
答案 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构建一个这样的衬里,修剪输出为我去。如果我要编写这个脚本,我会考虑一种更有效的方法,但如果我正在生成一次性报告,那对我来说没有任何区别。