Страница 1 из 1

Помогите составть скрипт (awk\ssed)

Добавлено: 2011-02-15 9:44:41
neowisard
Помогите с шелл скриптом.
Задача взять из текстового файла ip : port (забиты построчно, несколько строк) 2 случайных ИП с портом и в другом файле в строках
[HTML]
parent 500 http IP PORT
parent 500 http IP PORT
[/HTML]произвести замену существующих ip и портов на новые.

- Делаю random прокси(что б каждый час менялся). как на proxy.void.ru .

Не допираю как составить.

Re: Помогите составть скрипт (awk\ssed)

Добавлено: 2011-02-17 18:16:13
kpp
Так можно получить два случайных номера строк из файла ФАЙЛ_С_ХОСТАМИ_ПОРТАМИ

Код: Выделить всё

jot -r -s " " 2 1 `wc -l ФАЙЛ_С_ХОСТАМИ_ПОРТАМИ | awk '{print $1}'`
А потом получение строк по номерам и замена на эти строки.

Команда jot с опцией -r генерирует указанное кол-во случайных чисел (первый параметр) из указанного диапазона(2-й и 3-й параметры), переопределяет разделитель между результатами (по умолчанию - разделитель - перевод строки).

Re: Помогите составть скрипт (awk\ssed)

Добавлено: 2011-02-17 19:00:00
kpp
Как вариант: получение двух случайных записей из файла:

change_001.sh (параметр - файл с IP:порт)

Код: Выделить всё

#!/bin/sh
#
# change_001.sh
# 2011-02-17 17:34:18
#

NUMS=$(jot -r -s "|" 2 1 `wc -l $1 | awk '{print $1}'`)

HOSTS_PORT=`grep -n \^ $1 | egrep "^($NUMS):" | awk -F ':' '{print $2}'`

echo "$HOSTS_PORT"

Re: Помогите составть скрипт (awk\ssed)

Добавлено: 2011-02-19 1:43:09
kpp
Такой вариант.
Не очень кратко\красиво\универсально, но работает.
change_001.sh с тремя параметрами: 1 - файл со списком IP:порт, 2 - входной файл, 3- файл выходной

Код: Выделить всё

#!/bin/sh
#
# change_001.sh
# 2011-02-19
#

STR_NUM=`wc -l $1 | awk '{print $1}'`
NUM1=$(jot -r 1 1 $STR_NUM)
NUM2=$(jot -r 1 1 $STR_NUM)
while [ "$NUM1" -eq "$NUM2" ]
do
  NUM2=$(jot -r 1 1 $STR_NUM)
done

NUMS="$NUM1|$NUM2"
HOSTS_PORT=`grep -n \^ $1 | egrep "^($NUMS):" | awk -F ':' 'BEGIN {OFS=":"}{print $2,$3}'`
host1="`echo "$HOSTS_PORT" | awk '{ if ( NR == 1) {print}}'`"
host2="`echo "$HOSTS_PORT" | awk '{ if ( NR == 2) {print}}'`"

awk 'BEGIN {kolvo=0}
     {if ($0 ~/^[ \t]*parent 500 http / && kolvo < 2 ) {
       if ( kolvo == 0 ) {
           print "parent 500 http "host1;
           kolvo++;
           next;
                    }
          if ( kolvo == 1 ) {
            print "parent 500 http "host2;
            kolvo++;
                            }
         }else{
             print;
              }
     }
     ' host1="$host1" host2="$host2" $2 > $3

Re: Помогите составть скрипт (awk\ssed)

Добавлено: 2011-02-22 18:51:17
kpp
Еще вариант:
change_001.sh с тремя параметрами: 1 - файл со списком IP:порт, 2 - входной файл, вывод на консоль

Код: Выделить всё

#!/bin/sh
#
# change_001.sh

# получить кол-во строк в файле с IP:порт
STR_NUM=`wc -l $1 | awk '{print $1}'`
# получить первый случайный номер строки
NUM1=$(jot -r 1 1 $STR_NUM)
# получить второй случайный номер строки
NUM2=$(jot -r 1 1 $STR_NUM)
# для гарантирования того, что получили разные номера
while [ "$NUM1" -eq "$NUM2" ]
do
 NUM2=$(jot -r 1 1 $STR_NUM)
done

# получить первый IP:PORT
host1=`sed -n "${NUM1}p" $1`
# получить второй IP:PORT
host2=`sed -n "${NUM2}p" $1`

a="[ <->]\{0,\}"
q="parent 500 http "
w="[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}:[0-9]\{1,5\}"

sed "/^$a$q$w/{
N;
s/$w\(\n\)$a$q$w/$host1\1$q$host2/;
}" $2

Вместо вставить табуляцию.