grep 文件中的特定参数

grep specific parameter from a file

我正在尝试从 grep 结果中获取目录路径,以便在备份失败时删除目录。

那么我如何从下面获取目标目录(确切地说 /backups/incr/2015-04-07_10-00-01/2015-04-08_09-35-42)。

val=`grep -F -m 1 'target-dir=' innobackupex-runner.11498.tmp`
 echo $val
150408 09:35:42 innobackupex: Starting ibbackup with command: xtrabackup --defaults-group="mysqld" --backup --suspend-at-end --target-dir=/backups/incr/2015-04-07_10-00-01/2015-04-08_09-35-42 --innodb_data_file_path="ibdata1:12M:autoextend" --tmpdir=/tmp --tables='.*[.].*' --extra-lsndir='/tmp' --incremental-basedir='/backups/incr/2015-04-07_10-00-01/2015-04-08_09-28-04'
val=`grep -F -m 1 'target-dir=' innobackupex-runner.11498.tmp | sed 's/..*target_dir=\(..*\) --innodb..*//' `

如果你的 grep 版本支持 Perl (-P) 模式,你可以这样做:

val=$(grep -oP -m1 'target-dir=\K\S+' innobackupex-runner.11498.tmp)

-o开关表示只打印匹配的部分。 \K "kills" 之前的部分,只剩下 = 符号后的非 space 字符。

如果您的文件名包含 spaces!

,您将 运行 出问题

另一种选择,使用sed:

val=$(sed -n 's/.*target-dir=\([^[:space:]]\{1,\}\).*//p;q' innobackupex-runner.11498.tmp)

这实际上做了同样的事情,但使用了基本的正则表达式,任何符合 POSIX 的 sed 版本都支持这些正则表达式。

稍微短一些,使用扩展的正则表达式(-r-E with BSD sed):

val=$(sed -rn 's/.*target-dir=([^[:space:]]+).*//p;q' innobackupex-runner.11498.tmp)