On 2011-05-17, Neil Bothwick <[email protected]> wrote:
> On Tue, 17 May 2011 01:33:39 +0200, Alan McKinnon wrote:
>
>> grep "GET /Tmp/Linux/G" | /var/log/apache2/access_log | grep-v <myip> |
>> \ awk '{print $1}' | sort | uniq | wc
>>
>> In true grand Unix tradition you cannot get quicker, dirtier or more
>> effective than that
>>
>
> awk does pattern matching, o you can ditch the grep stage and use
>
>  awk '! /myip/ {print $1}'
>
> You could use awk to search for the GET patterns too, not only saving yet
> another process, but making sure that no one else, including you next
> month, can work out what the command is supposed to do.
>

Meh, me forgetting what an awk snippet do? Never!

sed ... now that's a wholly different story :-P

> sort -u would save having a separate process for uniq, but I've no idea
> if it's faster. It's only worth using sort -u if you would use uniq with
> no arguments.
>

And you can actually do the 'uniq' or '-u' function within awk. Quite
easily, in fact.

Here's a sample of awk doing uniq:

awk '!x[$1]++ { print $1 }'

Benefit? It doesn't care if the non-unique lines are one-after-another
or spread all over the text. The above snippet prints only the first
occurence. Combine that with a test for match:

awk '!x[$1]++ && $0 ~ /awesome_regex_pattern/ {print $1}'

then with a test for negated match

awk '!x[$1]++ && $0 ~ /awesome_regex_pattern/ && $0 !~
/more_awesome_regex/ {print $1}'

Rgds,
--
Pandu E Poluan - IT Optimizer
My website: http://pandu.poluan.info/

Reply via email to