Greg
Greg

Reputation: 34818

What regex would achieve this requirement?

What would be the regex to achieve this (can't seem to quite get it):

Notes:

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

REQUIRED OUTPUT

<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

Upvotes: 1

Views: 114

Answers (5)

Jotne
Jotne

Reputation: 41460

This awk should do:

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

Or if you like to make sure its only line with CoronaViewer that should be printed:

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

Upvotes: 0

hwnd
hwnd

Reputation: 70732

Edit

On Mac, you could use the following:

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

If it has to be after 'CoronaViewer' ...

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

Upvotes: 2

anubhava
anubhava

Reputation: 785471

On Mac following awk should do the job:

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

Alternative: If you can install gnu-grep using home brew on OSX (like I have) then this grep -P will do the same thing:

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

Upvotes: 3

unxnut
unxnut

Reputation: 8839

Here is an answer using sed:

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

If you know for a fact that the data you need always starts at column 43 (as in your example), you can use cut as

cut -c43- filename

Upvotes: 1

Adam Smith
Adam Smith

Reputation: 54213

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

DEMO:

# 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

As usual, the correct regex for things like this tend to be what you want to EXCLUDE rather than what you want to INCLUDE, so that's a crucial part of this.

Upvotes: 0

Related Questions