Как отредактировать текстовый файл на 40Gb??

Поимел тут дамп базы данных — текстовик на 40 гигов.

Для понимания проблемы: дамп состоит из двух основных блоков
[блок команд создания таблиц]
[блок команд вставки строк]

Первый блок небольшой, на 150 строк. Второй – все остальные гиги, которые выглядят как

 
 
  1. INSERT INTO tablename VALUES (val1, val2… valN);
  2. INSERT INTO tablename VALUES (val1, val2… valN);
  3. ...
  4. INSERT INTO tablename VALUES (val1, val2… valN);

Импортируется обычно все командой

 
 
cat dump.sql | mysql basename

то есть файл просто читается в пайп и mysql выполняет команды из него.

И в чем подстава.
Во-первых у дампа в начале не хватало пары команд — это выяснилось сразу при попытке импорта и легко выгуглилось. Во-вторых — в блоке импорта строк, ВО ВСЕХ строках отсутствовало начало: «INSERT INTO tablename VALUES»

Я не нашел такой чудо-редактор, который смог бы на редактирование хотя бы открыть этот мегадамп, поэтому к сути.

Сделал два вспомогательных файла:
1.sql – с недостающими командами,
2.sql – с первыми 150 строками, которые про создание таблиц, и первым недостающим «INSERT INTO tablename VALUES» — для начала блока импорта — который я добавил вручную.

Свел задачу к:
— как бы в один поток прочитать сначала эти два файла,
— а потом третий – только в нем пропустить первые строки, а во оставшихся — заменять концы строк с «);» на «); INSERT INTO tablename VALUES», чтобы каждая новая строка начиналась с корректной команды,
— и все это точно также запихать в пайп и отдать mysql.

Оказывается есть такая магия!

 
 
{cat 1.sql 2.sql; sed -n -e 's/);/); INSERT INTO tablename VALUES /g;151,$ p' dump.sql;} | mysql basename
 
 
конструкция команд внутри {} дает общий вывод, который можно направить в пайп и в mysql.
cat 1.sql 2.sql - просто читает два файла подряд
чтение основного файла отдаем седу, с двумя его командами
sed -n -e 's/);/); INSERT INTO tablename VALUES /g;152,$ p' dump.sql;
здесь      ^-- меняем ";)" на "); INSERT..."   --^ ^-- --^ - выводим файл со 151 строки

Что нужно для просмотра сериала?

Горячий кофе, мягкий плед, гроза за окном — многое может пригодиться. Но совершенно точно под рукой должны быть: добротный файлменеджер с функцией массового переименования, и скрипт для столь же массового переименования субтитров по имени серий.

Скрипт для поднятия SOCKS-прокси посредством ssh с проверкой его работоспособности

Небольшой скрипт, которым я пользуюсь для поднятия прокси-через-ssh. Висит в автозагрузке, постоянно проверяет при помощи курла доступность гугла, в случае недоступности — прибивает нужное ssh-соединение и открывает его снова.

ЗЫ: свой собственный прокси с шифрованием трафика средствами ssh — рекомендации лучших собаководов )

proxy.sh
 
#!/bin/sh
# establishes an SSH Socks proxy and reconnects if it fails.
socksPort=8376
server=example.com
user=myproxyuser
key=~/.ssh/id_rsa_myproxyuser
while true
do
    timeout 20 curl --retry-max-time 1 --retry 5 --retry-delay 1 -x socks5://127.0.0.1:${socksPort} http://google.com/ > /dev/null 2>&1
    if [ $? -ne 0 ]
    then
        echo $(date) reconnect...
        while ps -eo pid,cmd | grep ssh | grep ${socksPort}
        do
            kill $(ps -eo pid,cmd | grep ssh | grep ${socksPort} | awk '{print $1}' | head -n 1)
        done;
        ssh -D ${socksPort} -f  -q -N -i "${key}" ${user}@${server}
    else
        sleep 10
    fi
done;

Вариант для cygwin

proxy_cygwin.sh
 
#!/bin/sh
# establishes an SSH Socks proxy and reconnects if it fails.
socksPort=8376
server=example.com
user=myproxyuser
key=~/.ssh/id_rsa_myproxyuser
while true
do
    timeout 20  curl -x socks5://127.0.0.1:${socksPort} http://google.com/  > /dev/null 2>&1
    if [ $? -ne 0 ]
    then
        while ps -e | grep ssh;
        do
            # /bin/kill - is important!
            /bin/kill -f $(grep -a "ssh" /proc/*/cmdline  | grep -a  ${socksPort} | awk -F '/' '{print $3}' | head -n 1)
        done;
        echo $(date) reconnect
        ssh -D ${socksPort} -fNq -i "${key}" ${user}@${server}
    else
        sleep 10
    fi
done;