我试图解析一个包含这样的行的日志文件:
[DDD]
其中[
可以在任何地方。
任何行中的]
和[
之间只有一件事
使用awk和space作为分隔符,如何在]
和aaa ccc: DDD
之间打印第1,第3和所有数据(整个字符串)?
预期输出:$stmt->bind_param('ssssssiiss', $sid, $sname, $sgender, $sdob, $sbranch, $stell, $position, $salary, $login, $password);
答案 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