【问题标题】:How to escape "[" in gsub in awk?如何在awk中转义gsub中的“[”?
【发布时间】:2016-10-05 10:22:39
【问题描述】:

我正在尝试从以下解析日期时间部分 -

[Tue Oct  4 11:55:19 2016] [hphp] [25376:7f5d57bff700:279809:000001] [] \nFatal error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting ')' in /var/cake_1.2.0.6311-beta/app/webroot/openx/www/delivery/postGetAd.php(12479)(62110d90541a84df30dd077ee953e47c) : eval()'d code on line 1

使用以下命令 -

/usr/local/nagios/libexec/check_logwarn -d /tmp/logwarn -p /mnt/log/hiphop/error_`(date +'%Y%m%d')`.log "^.*Fatal*" | awk '{print $1" "$2" "$3" "$4" "$5}' 

我得到以下输出(带括号[]) -

[Wed Oct 5 09:49:49 2016]

我只想获取日期时间部分,然后进行一些比较。看我的另一个问题Parsing lines from a log file containing date-time greater than something

我尝试使用 gsub 替换括号,但它给了我以下错误 -

/usr/local/nagios/libexec/check_logwarn -d /tmp/logwarn -p /mnt/log/hiphop/error_`(date +'%Y%m%d')`.log "^.*Fatal*" | awk '{ gsub("/\[\","T",$1); print $1" "$2" "$3" "$4" "$5}' 

输出 -

awk: (FILENAME=- FNR=1) fatal: Invalid regular expression: /[/

看来我需要逃离[。我尝试使用\[,但没有成功。输出 -

awk: warning: escape sequence `\[' treated as plain `['
awk: (FILENAME=- FNR=1) fatal: Invalid regular expression: /[/

【问题讨论】:

    标签: bash awk gsub


    【解决方案1】:

    如果你使用/.../ 正则表达式语法,你可以用一个反斜杠转义:

    $ echo '[abc]' | awk '{ gsub(/\[/,"") }1'
    abc]
    

    或者你可以使用字符串文字语法,但是你需要一个额外的反斜杠,(因为当字符串被解析为正则表达式时,\\[ 成为所需的\[)。

    $ echo '[abc]' | awk '{ gsub("\\[","") }1'
    abc]
    

    同样地,删除左括号和右括号:

    $ echo '[abc]' | awk '{ gsub(/[\[\]]/,"") }1'
    abc
    

    $ echo '[abc]' | awk '{ gsub("[\\[\\]]","") }1'
    abc
    

    【讨论】:

    • echo '[ABC]' | awk '{gsub(/[[\]]/,"") } 1' 也返回“ABC”。
    • 好点,@JamesBrown。有趣的是,gsub(/[][]/,"") 也是如此。
    • 使用你的答案,` /usr/local/nagios/libexec/check_logwarn -d /tmp/logwarn -p /mnt/log/hiphop/error_20161006.log "^.*Fatal*" | awk 'gsub(/[/,"",$1); gsub(/]/,"",$5);' | awk '{print $5}'` 给了我以下输出 - 2016 2016] 2016 2016]。不确定,为什么] 仍保留在替代行中。而@VIPIN KUMAR 的回答,效果很好。
    • 代码末尾1的作用是什么}1'
    • @SanderW.vanderLaan,1{ print $0 } 的简写,如下所述:stackoverflow.com/questions/20262869/…
    【解决方案2】:
    echo "[Wed Oct 5 09:49:49 2016]"|tr -d '[]'
    

    【讨论】:

    • 这似乎也可以。不过需要适合我的情况。
    • 验证此方法有效,即使它删除了日志中出现的所有[],这对我来说没问题。
    猜你喜欢
    • 1970-01-01
    • 2019-04-05
    • 1970-01-01
    • 1970-01-01
    • 2012-04-11
    • 2016-06-28
    • 1970-01-01
    • 2017-06-02
    • 1970-01-01
    相关资源
    最近更新 更多