实现这一目标的正则表达式(似乎无法完全实现):
注意:
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
答案 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