【问题标题】:Get text only within parenthesis from a file in linux terminal [duplicate]仅从linux终端中的文件中获取括号内的文本[重复]
【发布时间】:2019-01-31 00:51:25
【问题描述】:

我有一个需要排序的大型日志文件,我想提取括号之间的文本。格式是这样的:

<@44541545451865156> (example#6144) has left the server!

我将如何提取“example#6144”?

【问题讨论】:

  • 我不同意最后的投票。人们经常在这里问这样的问题。这些问题很容易回答,更重要的是,这些问题的答案有助于 OP 了解他以前不知道的东西。
  • (当我之前评论时,关闭的原因是离题,我不同意。重复是一个更好的理由。)跨度>

标签: linux bash parsing


【解决方案1】:

给这只猫剥皮的方法有很多。

假设括号中总是只有一个词位,可以使用bash参数扩展:

while read t; do echo $(t=${t#*(}; echo ${t%)*}); done <logfile

第一个替换:${t#*(} 切断所有内容,包括左括号,留下example#6144) has left the server!;第二个:${t%)*} 切断右括号和之后的所有内容。

或者,您也可以使用awk

awk -F'[)(]' '{print $2}' logfile

-F'[)(]' 告诉awk 使用任一括号作为字段分隔符,因此它将输入字符串分成三个标记:&lt;@44541545451865156&gt;example#6144has left the server!;然后{print $2} 指示它打印第二个令牌。

cut 也可以:

cut -d'(' -f 2 logfile | cut -d')' -f 1

【讨论】:

【解决方案2】:

这个sed 应该在这里工作:

sed -E -n 's/.*\((.*)\).*$/\1/p' file_name

【讨论】:

    【解决方案3】:

    试试这个:

    sed -e 's/^.*(\([^()]*\)).*$/\1/' <logfile
    

    /^.*(\([^()]*\)).*$/ 是一个正则表达式正则表达式。正则表达式在你习惯它们之前很难阅读,但对于按模式提取文本最有用,就像你在这里做的那样。

    【讨论】:

    • 这将完整打印任何不包含该模式的行。
    • @tripleee:够真实的。好吧,看起来其他回答者已经涵盖了这一点,所以我会赞成他们的。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-16
    • 1970-01-01
    • 1970-01-01
    • 2016-05-04
    • 1970-01-01
    • 1970-01-01
    • 2015-02-26
    相关资源
    最近更新 更多