LINUX.ORG.RU

Регулярные выражения

 , ,


0

1

Файл с содержимым показывает вызов функции mail():

cs28 (mail) (unix@yandex.ru) /home/cs28/data/www/wp-config/hex.php
cs30 (mail) (jwa87@yandex.ru) /home/cs30/data/www/admin/system/cxmxmc.php
cs30 (site) /home/cs30/data/www/site.ru/index.php
cs28 (mail) (kh2@yandex.ru) /home/cs28/data/www/fake/root.php
cs20 (mail) (45trfsj@yandex.ru) /home/cs20/data/www/wp-config/hex.php
cs28 (site)  /home/cs20/data/www/order.ru/index.php
cs28 (mail) (sea@yandex.ru) /home/cs20/data/www/sfmve/dskjfs/.404.php
cs28 (mail) (sun@yandex.ru) /home/user1/data/www/skajk/dcke.php
cs28 (site)  /home/cs20/data/www/fiction/index.php
cs20 (mail) (wxjs@yandex.ru) /home/cs20/data/www/site/assets/owl.php
cs20 (mail) (ad4r@yandex.ru) /home/cs20/data/www/mail/postform.php
cs20 (mail) (unix_daemon@yandex.ru) /home/cs20/data/www/wp-config/hex.php
Посчитать количество раз вызова функции mail() в файле для всех пользователей. Вывести только: count USER PATH

(взять за «ключ» «USER PATH»)

Например: 3 cs20 /home/cs20/data/www/wp-config/hex.php



Последнее исправление: fruit_god (всего исправлений: 4)

Странно что USER это не почтовый адрес, ну да ладно, как в примере:

      2 cs20 /home/cs20/data/www/wp-config/hex.php
      1 cs30 /home/cs30/data/www/admin/system/cxmxmc.php
      1 cs28 /home/user1/data/www/skajk/dcke.php
      1 cs28 /home/cs28/data/www/wp-config/hex.php
      1 cs28 /home/cs28/data/www/fake/root.php
      1 cs28 /home/cs20/data/www/sfmve/dskjfs/.404.php
      1 cs20 /home/cs20/data/www/site/assets/owl.php
      1 cs20 /home/cs20/data/www/mail/postform.php
micronekodesu ★★★
()
Ответ на: комментарий от Deleted

Зачем тебе оценка на курсах проституток?

anonymous
()

Ничего непонятно, но может быть так

grep '(mail)' spammerz.log |sort -k 1,1 -k4,4|cut -d' ' -f1,4|uniq -c

madcore ★★★★★
()
Ответ на: комментарий от slovazap

grep 'USER PATH' | awk '{key=$1""$4; count[key]++} END {for ( key in count ) { print key" «count[key]; } }' file3.txt

cs20/home/cs20/data/www/mail/postform.php 1 cs28/home/cs28/data/www/fake/root.php 1 cs30/home/cs30/data/www/admin/system/cxmxmc.php 1 cs28 2 cs28/home/cs20/data/www/sfmve/dskjfs/.404.php 1 cs28/home/cs28/data/www/wp-config/hex.php 1 cs20/home/cs20/data/www/wp-config/hex.php 2 cs20/home/cs20/data/www/site/assets/owl.php 1 cs28/home/user1/data/www/skajk/dcke.php 1 cs30 1

такой ответ будет верный ?

fruit_god
() автор топика
Ответ на: комментарий от fruit_god

Напиши на этом же пхп. Он ведь может в регулярки и вызов внешних прожек. Еще и статистику удобно читаемую запилишь.

deep-purple ★★★★★
()
Ответ на: комментарий от fruit_god

grep 'USER PATH' | awk

За grep | awk хочется взять и убить всех людей...

такой ответ будет верный ?

Судя по всему ему все нужны.

awk '$2=="(mail)" {key=$1" "$4; count[key]++}
     END { PROCINFO["sorted_in"] = "@val_num_desc"
         for(key in count) print count[key]" "key }'
2 cs20 /home/cs20/data/www/wp-config/hex.php
1 cs20 /home/cs20/data/www/site/assets/owl.php
1 cs28 /home/cs20/data/www/sfmve/dskjfs/.404.php
1 cs28 /home/cs28/data/www/fake/root.php
1 cs20 /home/cs20/data/www/mail/postform.php
1 cs28 /home/user1/data/www/skajk/dcke.php
1 cs28 /home/cs28/data/www/wp-config/hex.php
1 cs30 /home/cs30/data/www/admin/system/cxmxmc.php
vodz ★★★★★
()
Ответ на: комментарий от vodz

За grep | awk хочется взять и убить всех людей...

«Все люди» используют sed и awk для восновном так:

  • awk '{print $1}'
  • sed 's/A/b/'

Так что выдыхай.

Я, например, когда надо что-то более чем из примеров выше использую* perl -e (приправляя -p, -n и -a). Там сразу тебе и PCRE и... а что еще нужно?

* От чего некоторых корёжит неистово.

KennyMinigun ★★★★★
()
Последнее исправление: KennyMinigun (всего исправлений: 2)
Ответ на: комментарий от KennyMinigun
perl -naE '$c{"$F[0] $F[3]"}++ if $F[1] eq "(mail)"; END{map {say "$c{$_} $_"} sort {$c{$b} <=> $c{$a}} keys %c}'
KennyMinigun ★★★★★
()
Ответ на: комментарий от KennyMinigun

«Все люди» используют sed и awk для восновном так:

Я не понял, что вы этим хотели сказать. То что вместо 'awk /pattern/ {print $1}' юзают тоже самое, но добавляют grep с дополнительным пайпом людям чести не делает.

vodz ★★★★★
()

Посчитать количество раз вызова функции mail() в файле для всех пользователей. Вывести только: count USER PATH

(взять за «ключ» «USER PATH»)

помимо вышеуказанных рецептов, можно средствами SQLite через import или virtual table.

Конечно выходит за рамки textutils, но зато можно делать гораздо более сложные запросы, а строчек в скрипте всё равно 3-5 не больше

MKuznetsov ★★★★★
()
Ответ на: комментарий от KennyMinigun

Да, все люди это обычные биодроны. Нужно включать мозги же.

anonymous
()
Ответ на: комментарий от vodz

но добавляют grep с дополнительным пайпом людям чести не делает.

Не все так однозначно, порой разбиение на пайпы добавляет скорости.

madcore ★★★★★
()
Ответ на: комментарий от madcore

Без тестирования это ниочём.

anonymous
()
Ответ на: комментарий от madcore

Не все так однозначно, порой разбиение на пайпы добавляет скорости.

Вы может не в курсе, но все интерпретаторы не парсят каждый раз свой скрипт, а строят дерево синтаксического разбора. Это, конечно, не jit, но и операций по работу скипта после однократного парсенья не много. По сравнению с вызовом сискола write, потом переключение задачи, потом read и потом уже единтичный regex.

Безусловно, реализация grep на bash тормозная, но речь о grep | толстый_тормозной_интерпретатор, коий есть awk.

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 1)
Ответ на: комментарий от madcore

Я параллельность выполнения.

Выражайтесь яснее. Параллельность имеет смысл рассматривать, когда данная задача основная для этого хоста и ему кроме её не то чтобы нечем заняться, а просто прямо скажем — вредно. Ибо иначе надо и на bash-е по другому обёртку писать для grep regex *.files, скажем каждый файл — в фоне.

vodz ★★★★★
()
Ответ на: комментарий от vodz

Параллельность имеет смысл рассматривать, когда данная задача основная для этого хоста

Такое условие имеет смысл только при наличии libastral, поскольку нельзя знать наперёд, какая задача на машине пользователя будет основной в конкретный момент времени. Довод-то неплохой был...

Deleted
()
Ответ на: комментарий от Deleted

Такое условие имеет смысл только при наличии libastral

Это лирика ни о чём.

поскольку нельзя знать наперёд, какая задача на машине пользователя будет основной в конкретный момент времени

С тем же успехом можно и сказать, что эта на самом деле такая побочная задача, а увеличение нагрузки на хост приведет к замедлению главных задач на ровном вроде бы месте.

Довод-то неплохой был...

Он плохой. Почему распараллелить на 2? Почему вы не складываете нагрузку на хост? Если вы озаботились распаралеливанием, то почему тогда не написать такую главную задачу на C с тредами? Ведь если один из обработчиков тормозит, то параллельность улетучвается, а нагрузка выше, чем тот же самый скрипт без дополнительных пайпов.

vodz ★★★★★
()
Ответ на: комментарий от Deleted

Так как определить основную задачу на хосте?

Узнать у пользователя? Ответ: «для мебели» тоже считается.

Не в этом же главное. А в том, что писать хорошо, а если в данном случае «хорошо» это параллелить, то это надо в задаче дополнительно указывать, предварительно доказав, что обработчики каждой стороны не тормозят, и потому никакой параллельности на самом деле нет.

vodz ★★★★★
()
Ответ на: комментарий от vodz

Узнать у пользователя?

В ответ на запуск foreground процесса спросить «Is it main task(y/N)»? Или городить километровые кофиги, в которых можно указать условия при которых задача является основной?

Не в этом же главное. [...]

Главный посыл я понял и с ним не спорю. Исходная формулировка в стиле «вода мокрая» - я об этом речь вёл

Deleted
()
Ответ на: комментарий от vodz

Что плохого в grep | awk? Мы ж не в продакшен это дело пихаем (в продакшене я вообще bash не стал бы использовать), мы пишем однострочник, который выполнится один раз, причём, скорее всего, быстрее, чем мы его напишем.

Miguel ★★★★★
()
Ответ на: комментарий от Miguel

Нужно привыкать делать нормально.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.