什么正则表达式会达到这个要求?

时间:2014-07-18 21:47:39

标签: regex unix grep

实现这一目标的正则表达式(似乎无法完全实现):

注意:

  • 请注意,方括号中的数字可能会更改运行状态。
  • 将在Mac终端中用作“grep”的一部分(即实时日志文件中的grep'ing输出)

INPUT:

Jul 19 07:32:19 iPhone CoronaViewer[4043] <Warning>: userdata: 0x1b5df900   10  nil began
Jul 19 07:32:19 iPhone CoronaViewer[4043] <Warning>: userdata: 0x1b5df900   10  nil ended/cancelled
Jul 19 07:32:19 iPhone CoronaViewer[4043] <Warning>: userdata: 0x1b544ff0   10  nil began
Jul 19 07:32:20 iPhone CoronaViewer[4043] <Warning>: userdata: 0x1b544ff0   10  nil ended/cancelled
Jul 19 07:34:00 iPhone CoronaViewer[4043] <Warning>: userdata: 0x1b549270   10  nil began
Jul 19 07:34:00 iPhone CoronaViewer[4043] <Warning>: userdata: 0x1b549270   10  nil ended/cancelled
Jul 19 07:34:02 iPhone CoronaViewer[4043] <Warning>: userdata: 0x1b33ab50   10  nil began
Jul 19 07:34:02 iPhone CoronaViewer[4043] <Warning>: userdata: 0x1b33ab50   10  nil ended/cancelled

需要的输出

<Warning>: userdata: 0x1b5df900 10  nil began
<Warning>: userdata: 0x1b5df900 10  nil ended/cancelled
<Warning>: userdata: 0x1b544ff0 10  nil began
<Warning>: userdata: 0x1b544ff0 10  nil ended/cancelled
<Warning>: userdata: 0x1b549270 10  nil began
<Warning>: userdata: 0x1b549270 10  nil ended/cancelled
<Warning>: userdata: 0x1b33ab50 10  nil began
<Warning>: userdata: 0x1b33ab50 10  nil ended/cancelled

5 个答案:

答案 0 :(得分:3)

awk之后的Mac上应该完成这项工作:

awk -F'CoronaViewer\[[0-9]+\] *' '/CoronaViewer\[[0-9]+\]/{print $2}' file
<Warning>: userdata: 0x1b5df900   10  nil began
<Warning>: userdata: 0x1b5df900   10  nil ended/cancelled
<Warning>: userdata: 0x1b544ff0   10  nil began
<Warning>: userdata: 0x1b544ff0   10  nil ended/cancelled
<Warning>: userdata: 0x1b549270   10  nil began
<Warning>: userdata: 0x1b549270   10  nil ended/cancelled
<Warning>: userdata: 0x1b33ab50   10  nil began
<Warning>: userdata: 0x1b33ab50   10  nil ended/cancelled

替代方法:如果您可以在OSX上使用gnu-grep安装home brew(就像我一样),那么这个grep -P也会做同样的事情:

grep -oP "CoronaViewer\[\d+\] \K<Warning>:.*" file

答案 1 :(得分:2)

修改

在Mac上,您可以使用以下内容:

perl -nle 'print $1 if /\] *(.*)/' file

如果必须在&#39; CoronaViewer&#39;之后...

perl -nle 'print $1 if /CoronaViewer\[[0-9]+\] *(.*)/' file

答案 2 :(得分:1)

以下是使用sed的答案:

sed 's/[^<]*\(<.*\)/\1/' filename

如果您知道您需要的数据始终从第43栏开始(如您的示例所示),则可以使用cut作为

cut -c43- filename

答案 3 :(得分:0)

grep -oP "(?<=^\w{3} \d{2} \d{2}:\d{2}:\d{2} iPhone CoronaViewer\[\d{4}\] ).*$"

样本:

# c.txt contains:
Jul 19 07:32:19 iPhone CoronaViewer[4043] <Warning>: userdata: 0x1b5df900   10  nil began
Jul 19 07:32:19 iPhone CoronaViewer[4043] <Warning>: userdata: 0x1b5df900   10  nil ended/cancelled
Jul 19 07:32:19 iPhone CoronaViewer[4043] <Warning>: userdata: 0x1b544ff0   10  nil began
Jul 19 07:32:20 iPhone CoronaViewer[4043] <Warning>: userdata: 0x1b544ff0   10  nil ended/cancelled
Jul 19 07:34:00 iPhone CoronaViewer[4043] <Warning>: userdata: 0x1b549270   10  nil began
Jul 19 07:34:00 iPhone CoronaViewer[4043] <Warning>: userdata: 0x1b549270   10  nil ended/cancelled
Jul 19 07:34:02 iPhone CoronaViewer[4043] <Warning>: userdata: 0x1b33ab50   10  nil began
Jul 19 07:34:02 iPhone CoronaViewer[4043] <Warning>: userdata: 0x1b33ab50   10  nil ended/cancelled

> grep -oP "(?<=^\w{3} \d{2} \d{2}:\d{2}:\d{2} iPhone CoronaViewer\[\d{4}\] ).*$" c.txt
<Warning>: userdata: 0x1b5df900   10  nil began
<Warning>: userdata: 0x1b5df900   10  nil ended/cancelled
<Warning>: userdata: 0x1b544ff0   10  nil began
<Warning>: userdata: 0x1b544ff0   10  nil ended/cancelled
<Warning>: userdata: 0x1b549270   10  nil began
<Warning>: userdata: 0x1b549270   10  nil ended/cancelled
<Warning>: userdata: 0x1b33ab50   10  nil began
<Warning>: userdata: 0x1b33ab50   10  nil ended/cancelled

像往常一样,正确的正则表达式往往是你想要排除的东西,而不是你想要包含的东西,所以这是它的关键部分。

答案 4 :(得分:0)

awk应该:

awk '{sub(/.*\] /,"")}1' file
<Warning>: userdata: 0x1b5df900   10  nil began
<Warning>: userdata: 0x1b5df900   10  nil ended/cancelled
<Warning>: userdata: 0x1b544ff0   10  nil began
<Warning>: userdata: 0x1b544ff0   10  nil ended/cancelled
<Warning>: userdata: 0x1b549270   10  nil began
<Warning>: userdata: 0x1b549270   10  nil ended/cancelled
<Warning>: userdata: 0x1b33ab50   10  nil began
<Warning>: userdata: 0x1b33ab50   10  nil ended/cancelled

或者,如果您想确保其唯一一行应该打印CoronaViewer

awk '/CoronaViewer/ {sub(/.*\] /,"");print}' file