![使用 sed 清理日志文件中的长路径](https://linux22.com/image/123227/%E4%BD%BF%E7%94%A8%20sed%20%E6%B8%85%E7%90%86%E6%97%A5%E5%BF%97%E6%96%87%E4%BB%B6%E4%B8%AD%E7%9A%84%E9%95%BF%E8%B7%AF%E5%BE%84.png)
一个脚本会生成几十行的日志文件,而且大多数行都很长。如果能通过一些编辑使该日志变得人性化,那就太好了。
在运行时,有一些有用的环境变量。说,${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