【问题标题】:Bash include string between chars in awk printBash 在 awk 打印中包含字符之间的字符串
【发布时间】:2017-04-26 04:23:05
【问题描述】:

我正在尝试解析包含如下行的日志文件:

aaa bbb ccc: [DDD] efg oi    
aaa bbb ccc: lll [DDD] efg oo    
aaa bbb ccc: [DDD]

[DDD] 可以在队列中的任何位置。

在任何一行中,[] 之间只有一件事

使用 awk 和空格作为分隔符,如何打印 [] 之间的第一个、第三个和所有数据(整个字符串)?

预期输出:aaa ccc: DDD

【问题讨论】:

  • 您尝试了哪些方法,又是如何失败的?看来您应该能够通过阅读任何 Awk 介绍的第一页的大约一半来解决这个问题。
  • awk '{print $1,$3,$4}' file
  • awk '{print $1,$3, ???}',在某些位置打印数据,但我正在寻求帮助,包括可以在字符串中任何位置的字符之间包含数据。
  • @TadijaBagarić,好的,显示预期的输出
  • @TadijaBagarić,所以它是一个字符串而不是文件,对吧?

标签: bash awk scripting


【解决方案1】:

gawk(GNU awk)方法:

假设我们是一个包含以下行的文件:

aaa bbb ccc: ddd [fff] ggg hhh

命令:

awk '{match($0,/\[([^]]+)\]/, a); print $1,$3,a[1]}' file

输出:

aaa ccc: fff

match(string, regexp [, array])
string中搜索正则表达式匹配的最长、最左边的子字符串regexp 并返回该子字符串开始的字符位置(索引)(一个,如果它从 string 的开头开始)。如果未找到匹配项,则返回零..

【讨论】:

  • 介于“[”和“]”之间的数据不必位于第 4 位
  • $1 和 $3 是强制性的吗?如果[]之间的数据在任意位置,会不会有多个像aaa bbb ccc: ddd [fff] ggg hhh [jjj]这样的条目?
  • 效果很好,tnx
【解决方案2】:

给定:

$ cat file
aaa bbb ccc: [DDD] efg oi    
aaa bbb [ccc:] lll DDD efg oo    
aaa [bbb] ccc: DDD

(注意——从 OP 的例子中改变)

在 POSIX 中 awk:

awk 'BEGIN{fields[1]; fields[3]} 
                                {s=""
                                 for (i=1;i<=NF;i++) 
                                       if ($i~/^\[/ || i in fields) 
                                           s=i>1 ? s OFS $i : $i
                                 gsub(/\[|\]/,"",s)
                                 print s
                                }' file

打印:

aaa ccc: DDD
aaa ccc:
aaa bbb ccc:

如果字段同时包含在[] 和选定的fields 数组中,则不会打印两次。 (即[aaa] bbb ccc: 不会打印两次aaa)如果您有aaa [bbb] ccc ...,它也会以正确的字段顺序打印

【讨论】:

    【解决方案3】:
    awk '$5=="[DDD]"{gsub("[\\[\\]]","");print $1,$3,$5}' file
    

    awk '$5=="[DDD]"{print $1,$3, substr($5,2,3)}' file
    

    aaa ccc: DDD
    

    【讨论】:

    • 不确定,但仅代码的答案通常不受欢迎。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-01
    • 2019-10-17
    • 2019-04-02
    • 1970-01-01
    • 1970-01-01
    • 2015-11-22
    相关资源
    最近更新 更多