使用 sed 清理日志文件中的长路径

使用 sed 清理日志文件中的长路径

一个脚本会生成几十行的日志文件,而且大多数行都很长。如果能通过一些编辑使该日志变得人性化,那就太好了。

在运行时,有一些有用的环境变量。说,${X}对应于 /usr/projects/draco/vendors/spack.tt.developmental/spack.tt.2017-12-06.with-flags/opt/spack/cray-CNL-haswell/intel-17.0.4/gsl-2.4-zagfxq3p5iorh7viw4gc24bwzlx2tyk7

我的目标是使用环境变量来查找类似的行

Leaving directory /usr/projects/draco/vendors/spack.tt.developmental/spack.tt.2017-12-06.with-flags/opt/spack/cray-CNL-haswell/intel-17.0.4/gsl-2.4-zagfxq3p5iorh7viw4gc24bwzlx2tyk7

并用一个方便的占位符替换它们,在这里gsl-install

Leaving directory gsl-install

我的努力包括像这样的不成功的语法

sed -i -e 's/${X}/gsl-install/g' tedious.log

如何提供sed环境变量并替换相应的字符串?


$ uname -a
Darwin ***.***.*** 16.7.0 Darwin Kernel Version 16.7.0: Thu Jun 15 17:36:27 PDT 2017; root:xnu-3789.70.16~2/RELEASE_X86_64 x86_64

答案1

你有两个问题

  • 您的环境变量包含“/”字符
  • 您将 sed 参数包含在单引号中,因此 ${X} 未经替换地传递

您可以使用任何字符作为sed命令分隔符。选择不太可能出现在搜索字符串中的内容。并在命令周围使用双引号sed..
例如:

sed -i -e "s;${X};gsl-install;g" tedious.log

答案2

要在 sed 脚本中使用 bash 变量,您需要打破单引号,将变量添加到双引号内,然后返回到 sed 的单引号中。

下面的例子:

DAY1=$(date -d "+1days" +%m%d%Y)
DAY2=$(date -d "+2days" +%m%d%Y)
DAY3=$(date -d "+3days" +%m%d%Y)
sed -n -E -e '/\s\s\s*'"($DAY1|$DAY2|$DAY3)"'/p' $file
#or
sed -n -E -e ';\s\s\s*'"($DAY1|$DAY2|$DAY3)"';p' $file

相关内容