Bash包括awk打印中字符之间的字符串

时间:2017-04-25 13:23:32

标签: bash awk scripting

我试图解析一个包含这样的行的日志文件:

[DDD]

其中[可以在任何地方。

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

使用awk和space作为分隔符,如何在]aaa ccc: DDD之间打印第1,第3和所有数据(整个字符串)?

预期输出:$stmt->bind_param('ssssssiiss', $sid, $sname, $sgender, $sdob, $sbranch, $stell, $position, $salary, $login, $password);

3 个答案:

答案 0 :(得分:3)

gawk (GNU awk)方法:

让我们说一个包含以下行的文件:

aaa bbb ccc: ddd [fff] ggg hhh

命令:

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

输出:

aaa ccc: fff
  

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

答案 1 :(得分:1)

假设:

$ 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 ...

,它也会按正确的字段顺序打印

答案 2 :(得分:-1)

awk '$5=="[DDD]"{gsub("[\\[\\]]","");print $1,$3,$5}' file

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

aaa ccc: DDD