【问题标题】:cut log files with sed and variable使用 sed 和变量剪切日志文件
【发布时间】:2016-05-18 23:04:19
【问题描述】:

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

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

我想把日期放在一个变量中

variable="05/04/2016 12:55:25.142639"

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

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

【问题讨论】:

    标签: linux bash variables sed


    【解决方案1】:

    这是因为你的命令扩展为

    sed -n /05/04/2016 12:55:25.142639/,$p logfile.out
    

    你看到问题了吗?正斜杠太多让sed感到困惑,它会尝试在地址/05/处执行命令0

    要解决这个问题,您必须使用不同的地址分隔符。与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
    

    引用自manual

    \%regexp%

    % 可以替换为任何其他单个字符。)

    这也匹配正则表达式 regexp,但允许一个 使用与/ 不同的分隔符。如果 regexp 本身包含很多斜线,因为它避免了每个/ 的繁琐转义。如果 regexp 本身包含任何分隔符 字符,每个字符都必须用反斜杠 (\) 转义。


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

    sed -n '\|'"$variable"'|,$p' logfile.out
    

    【讨论】:

    • 是否可以从结果中删除模式(变量中有什么)?并且只查看测试的其余部分
    • @mario 是的,但请记住,变量只匹配一行,然后你说“从这里到文件末尾”,所以你不能只删除你的变量,因为只会影响一行。通常,要删除某些内容,请将其替换为空字符串:s/pattern//。在您的情况下,您需要一个模式,包括该行中的第二个空白:s/^\([^[:blank:]]*[[:blank:]]\)\{2\}//,并且您希望将其与您的地址范围相结合:sed -n '\|'"$variable"'|,$s/^\([^[:blank:]]*[[:blank:]]\)\{2\}//p' logfile.out 其中p 是@987654338 的标志@ 命令。
    猜你喜欢
    • 2020-05-25
    • 2012-05-22
    • 1970-01-01
    • 2021-05-01
    • 2012-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    相关资源
    最近更新 更多