用sed和变量剪切日志文件

mar*_*rio 1 linux variables bash sed

我有日期和事件的日志文件.我想不时检查这个文件,只查看特定时间点的记录,例如上次检查时的最后一次错误.

05/03/2016 23:55:25.142639 user1
05/04/2016 12:55:25.142639 user4
05/04/2016 13:57:25.142639 user3
05/04/2016 13:51:02.236522 user2
Run Code Online (Sandbox Code Playgroud)

我希望在变量中包含日期

variable="05/04/2016 12:55:25.142639"
Run Code Online (Sandbox Code Playgroud)

我试图运行以下命令,但没有成功:

[sdtest tmp]$ sed -n "/$variable/,\$p" logfile.out
sed: -e expression #1, char 5: unknown command: `0'
Run Code Online (Sandbox Code Playgroud)

Ben*_* W. 5

这是因为你的命令扩展到了

sed -n /05/04/2016 12:55:25.142639/,$p logfile.out
Run Code Online (Sandbox Code Playgroud)

你看到了问题吗?太多的正斜杠混淆了sed,它试图0在地址处执行命令/05/.

要解决此问题,您必须使用不同的地址分隔符.与s///您不同的地方不同s|||,对于地址,您必须使用不同的分隔符,例如:

$ sed -n "\|$variable|,\$p" logfile.out
05/04/2016 12:55:25.142639 user4
05/04/2016 13:57:25.142639 user3
05/04/2016 13:51:02.236522 user2
Run Code Online (Sandbox Code Playgroud)

手册中引用:

\%regexp%

(%可以用任何其他单个字符替换.)

这也匹配正则表达式regexp,但允许使用不同的分隔符/.如果正则表达式本身包含很多斜杠,这是特别有用的 ,因为它避免了每个人的繁琐逃避/.如果regexp本身包含任何分隔符,则必须使用反斜杠(\)对每个分隔符进行转义.


备注:为了避免使用双引号导致的转义问题,我们也可以在shell变量周围使用双引号,并在其余部分使用单引号:

sed -n '\|'"$variable"'|,$p' logfile.out
Run Code Online (Sandbox Code Playgroud)