如何使用awk获取一行的子字符串

时间:2013-04-29 10:34:49

标签: unix awk

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吗?感谢。

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

2 个答案:

答案 0 :(得分:3)

这可行:

$ 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

答案 1 :(得分:2)

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

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