Grep сначала 50 строк файлов для шаблона

Я не абсолютно уверен, что Вы спрашиваете. В первую очередь, mysql команда является всем нижним регистром:

mysql DBname -uusername -ppassword <"path to the .sql file"

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

Добавить путь к PATH переменная среды, использовать

export PATH=$PATH:/path/to/add

где /path/to/add путь, содержащий двоичный файл, который Вы хотите выполнить.

Но путь для клиентского исполняемого файла MySQL должен уже быть добавлен. Если Вы получили a command not found ошибка, скорее всего, это - потому что Вы использовали прописные буквы на название команды.

5
22.04.2015, 15:01
4 ответа

Это решение работает, но я чувствую, что это неуклюже. Поиск первых 50 строк для струны "foobar":

$ for I in *.sql ; do echo $I && head -n 50 $I | grep foobar ; done
6
27.01.2020, 20:31

В цикле пути GNU sed может выполнять и задачу:

for f in *.sql
do
    sed -e '1 F' -e '51 Q' -e '/pattern/! d' "$f"
done
-121--66388-

Можно ли это сделать? Возможно, но, вероятно, с большим количеством тайников и взломов sendmail, чем в PHP коде.

Однако, после нескольких раскопок, я обнаружил следующее: « Как я могу задержать доставку почты »

Недостатки заключаются в том, что вам придется иметь второй SMTP-сервер, работающий в режиме QUEUE, и вам все равно нужно будет изменить код, чтобы это сработало.

Таким образом, мое предложение состоит в том, чтобы создать небольшой php или javascript апплет, который по заданному расписанию (каждый день через cron), запрашивает базу данных для всех покупок, сделанных две недели назад, и отправить электронное письмо этому клиенту. Таким образом, можно использовать существующий сервер и не трогать код.

-121--145693-

Напор, идущий в греп, доставляет вас на полпути.

head -50 filename | grep string
2
27.01.2020, 20:31

awk (если предположить, что ваша реализация поддерживает оператор nextfile] ) может сделать это довольно неплохо:

awk 'FNR > 50 { nextfile }; /foobar/ { print FILENAME ": " $0 }' ./*.sql

Первое оператор пропускает следующий файл после обработки 50 записей. Второй оператор печатает имя файла и соответствующую строку для любой строки, содержащей foobar.

Если ваш awk не имеет следующего файла , этот вариант тоже работает, хотя я думаю, что он будет менее эффективным:

awk 'FNR <= 50 && /foobar/ { print FILENAME ": " $0 }' ./*.sql
10
27.01.2020, 20:31

В цикле таким же образом GNU sed может выполнять и задачу :

for f in *.sql
do
    sed -e '1 F' -e '51 Q' -e '/pattern/! d' "$f"
done
3
27.01.2020, 20:31

Теги

Похожие вопросы