【问题标题】:How to get sub-string of one line using awk如何使用awk获取一行的子字符串
【发布时间】:2013-04-22 23:47:21
【问题描述】:
2012-04-22 04:07:50,862 com.xu.validater[ajp-8009-889]: XU_USER: d888880
2012-04-22 04:07:50,863 com.xu.validater[ajp-8009-888]: XU_USER: d888881
2012-04-22 04:07:50,864 com.xu.validater[ajp-8009-887]: XU_USER: d888882
2012-04-22 04:07:50,865 com.xu.validater[ajp-8009-886]: XU_USER: d888883
...
...

我想从每一行中获取两个部分。一个是threadid,如ajp-8009-889,另一个是userid,如d888880。 你能给我一个可以做到的awk expression吗?谢谢。

我在 Google 上搜索了很多帖子,例如 awk '{match($0, xxx; print substr($0, a[1, "start"], a[1, "length"])}' xxx.log。但我无法解决。我知道如果使用java,Matcher.group(x) 可以做到。

【问题讨论】:

    标签: unix awk


    【解决方案1】:

    这可以工作:

    $ awk -F"[ [\]]" '{print $4,$7}' your_file
    

    表示可能的分隔符为[space]。然后根据这些分隔符拆分字符串并打印字段编号 4 和 7。

    测试:

    $ awk -F"[ [\]]" '{print $4,$7}' your_file
    ajp-8009-889 d888880
    ajp-8009-888 d888881
    ajp-8009-887 d888882
    ajp-8009-886 d888883
    

    【讨论】:

    • 哈哈@EdMorton 我不知道怎么称呼它,决定根据php explode()函数说explode :)
    • "splits" 在这种情况下可能是正确的词。毫无疑问,在 awk 中,将记录拆分为字段的过程称为“字段拆分”,请参阅gnu.org/software/gawk/manual/gawk.html#Records
    • 我不仅在这里学习编程,而且还学习英语:) 作为一个非英语母语人士,我感谢您的指正,非常感谢!
    【解决方案2】:

    设置字段分隔符为空格和括号,并打印第四和第七个字段:

    $ awk -F' |[][]' '{print $4,$7}' file
    ajp-8009-889 d888880
    ajp-8009-888 d888881
    ajp-8009-887 d888882
    ajp-8009-886 d888883
    

    【讨论】:

    • 您的解决方案确实有效 (+1),但我不明白为什么。我假设-F' |[][]' 表示分隔符是space][ 字符之一。但是为什么第一个] 不需要转义呢?我尝试了-F'[] []'-F'[][ ]',它们也有效。我试过 GNU awk 的 Using Bracket Expressions,但我想不通...
    • ] 表示括号表达式的结尾,除非它是第一个字符,在这种情况下它被视为文字],因此当它是第一个字符时无需转义它。不知道为什么@sudo_O 将括号表达式之外的空格作为 RE 的“或”,[][ ][] [] 可以正常工作。
    • @EdMorton 这只是我思维过程的体现,即在我的脑海中,我认为FS 应该是空格括号,发布后我认为[] []会更优雅,但认为编辑是次要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-20
    • 2013-04-09
    • 1970-01-01
    • 1970-01-01
    • 2015-05-10
    • 2022-12-06
    相关资源
    最近更新 更多