URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 9812
[ Назад ]

Исходное сообщение
"Вопросы по работе xargs"

Отправлено universite , 10-Янв-14 16:24 
1) Нужно переименовать список директорий из файла $dir_list

Так не работает:

#grep -v ^# $dir_list | xargs -n 1  echo mv ${1} ${1}-OFF

Так работает:

for dir in `grep -v ^# $dir_list`; do
    echo mv ${dir} ${dir}-OFF
done

2) Нужно проверить статус (код ответа по http) списка доменов
Так не работает:

awk -F"/" '{print $6;}' result.log | xargs -n 1 curl -s -I $1 | head -1 | awk '{print $2}'

Получаем ответ только первого элемента списка  awk -F"/" '{print $6;}' result.log , а остальные два десятка элементов игнорируются.


Содержание

Сообщения в этом обсуждении
"Вопросы по работе xargs"
Отправлено universite , 10-Янв-14 16:29 

> 2) Нужно проверить статус (код ответа по http) списка доменов
> Так не работает:
>
awk -F"/" '{print $6;}' result.log | xargs -n 1 curl -s -I 
> $1 | head -1 | awk '{print $2}'
>

Нужно логику изменить.
ибо


awk -F"/" '{print $6;}' result.log | xargs -n 1 echo $1

отдает список доменов полностью...

"Вопросы по работе xargs"
Отправлено Andrey Mitrofanov , 10-Янв-14 19:00 
>> 2) Нужно проверить статус (код ответа по http) списка доменов
>> Так не работает:
>> | xargs -n 1 curl -s -I $1 | head -1 | awk '{print $2}'

Ты, видимо имел в виду -

...|xargs -I{} --n1 bash -c "curl -s -I {} | head -1" |...

> Нужно логику изменить.
> ибо [ code]
> отдает список доменов полностью...

Да, не. Нужно понимать, что-где. Что $1, который ты дал xargs-у будет подставлен не им, а шелом. И вывод xargs-а будет конкатенауией всех запушенных curl-ов. И head -1 от этой сонкатенации будет именно результат (первая строка) только от первого curl-a

.....
На сладкое:

<result.log gawk -F/ '{arr[++nn]=$6}END{FS=" ";for(i=1;i<=nn;i++){cmd="curl -s -I "$6";cmd|getline;close(cmd);print $2}'


"Вопросы по работе xargs"
Отправлено Andrey Mitrofanov , 10-Янв-14 19:12 
> .....
> На сладкое:
> <result.log gawk -F/ '{arr[++nn]=$6}END{FS=" ";for(i=1;i<=nn;i++){cmd="curl -s -I "$6";cmd|getline;close(cmd);print 2}'

Агкхр... Скука какая.

<result.log gawk -F/ '{arr[++nn]=$6}END{FS=" ";for(i=1;i<=nn;i++){cmd="curl -s -I "arr[i];cmd|getline;close(cmd);print$2}'


"Вопросы по работе xargs"
Отправлено universite , 11-Янв-14 14:32 
>> .....
>> На сладкое:
>> <result.log gawk -F/ '{arr[++nn]=$6}END{FS=" ";for(i=1;i<=nn;i++){cmd="curl -s -I "$6";cmd|getline;close(cmd);print 2}'
> Агкхр... Скука какая.
> <result.log gawk -F/ '{arr[++nn]=$6}END{FS=" ";for(i=1;i<=nn;i++){cmd="curl -s -I "arr[i];cmd|getline;close(cmd);print$2}'

После


print$2}
               ^ unexpected newline or end of string

}'  --> }}'


"Вопросы по работе xargs"
Отправлено pavlinux , 10-Янв-14 17:36 
>
awk -F"/" '{print $6;}' result.log | xargs -n 1 curl -s -I $1 | head -1 | awk '{print $2}' 
>

Если в скрипте 2 и более раз используется одна и та же утиль, то это ошибка.


> Получаем ответ только первого элемента списка  awk -F"/" '{print $6;}' result.log ,
> а остальные два десятка элементов игнорируются.

Отседа вывод: нужно обрабатывать возврат каждой отдельно  

for i in `awk -F"/" '{print $6;}' result.log`
   do
      res=$(curl -s -I $i);
      if [ $res == че-надо ]
          echo $res | head -1 | cut -d" " -f2;
      else
          continue;  
done
...
как-то так


"Вопросы по работе xargs"
Отправлено universite , 10-Янв-14 18:01 
>> Получаем ответ только первого элемента списка  awk -F"/" '{print $6;}' result.log ,
>> а остальные два десятка элементов игнорируются.
> Отседа вывод: нужно обрабатывать возврат каждой отдельно

Благодарю.
Скрипт теперь выглядит так:


for i in `awk -F"/" '{print $6;}' result.log`; do
    echo -e "$i\t\t`curl -s -I $i | head -1 | cut -d" " -f2;`"
done

Скорость выполнения соответствующих команд равнозначна:

time cut -d"/" -f6 result.log
time awk -F"/" '{print $6;}' result.log

Возможно при обработке гигабайтных файлов будут отличия...

"Вопросы по работе xargs"
Отправлено pavlinux , 10-Янв-14 18:07 
> Возможно при обработке гигабайтных файлов будут отличия...

Ты ж знаешь, - как начинаются гигабайты нужно врубать sed.
Но у тебя всё равно узким местом будет curl, поэтому спасут только Perl/Ruby/Python/...


"Вопросы по работе xargs"
Отправлено universite , 10-Янв-14 18:20 
>> Возможно при обработке гигабайтных файлов будут отличия...
> Ты ж знаешь, - как начинаются гигабайты нужно врубать sed.
> Но у тебя всё равно узким местом будет curl, поэтому спасут только
> Perl/Ruby/Python/...

В данный момент, да однопоточно.
Но я же могу использовать & и писать результат в отдельный лог.

curl самый надежный консольный http клиент.
Для Perl/Ruby/Python/ нужно подключать модули и чем сложнее и навороченнее сайт, тем больше модулей надо подключать :)



"Вопросы по работе xargs"
Отправлено pavlinux , 10-Янв-14 22:00 
> curl самый надежный консольный http клиент.
> Для Perl/Ruby/Python/ нужно подключать модули и чем сложнее и навороченнее сайт, тем
> больше модулей надо подключать :)

Когда пойдут гигабайтные логи, задумаешься, почему сразу на перлерубипитоне не написал.


"Вопросы по работе xargs"
Отправлено Andrey Mitrofanov , 10-Янв-14 18:36 
>>
awk -F"/" '{print $6;}' result.log | xargs -n 1 curl -s -I $1 | head -1 | awk '{print $2}' 
>>

> Если в скрипте 2 и более раз используется одна и та же
> утиль, то это ошибка.

Это чушь.  У двух авков тут (ты же про них?) совершенно разная область действия.

Вот head можно довольно легко в соседний awk "внести".

В принципе, можно и xarg внести, но тогда пидётся очень вдумчиво понисмать, чего пишешь, возможно, получится GNU awk специфично, и, в конце концов _придётся :) объединить 2 awk-а.


"Вопросы по работе xargs"
Отправлено pavlinux , 10-Янв-14 19:55 
>>>
awk -F"/" '{print $6;}' result.log | xargs -n 1 curl -s -I $1 | head -1 | awk '{print $2}' 
>>>

>> Если в скрипте 2 и более раз используется одна и та же
>> утиль, то это ошибка.
> Это чушь.  У двух авков тут (ты же про них?) совершенно
> разная область действия.

Делешь афк основной программой, остальные как его аргументы.

Выше схема:  AWK( HEAD( CURL( AWK() )));  
переделывается в AWK( HEAD( CURL()), AWK()),
что есть две функции AWK( HEAD( CURL()), AWK()) + AWK(AWK())
и как ты написал - AWK(AWK()) самопоглощается,
и получим:  
            AWK( HEAD( CURL()), var); , где var - какая-то вспомог. переменная (скорее всего глобальная)

Теперь самый гиморp - представить это в виде кода  :D


"Вопросы по работе xargs"
Отправлено universite , 10-Янв-14 20:26 
>>>>
awk -F"/" '{print $6;}' result.log | xargs -n 1 curl -s -I $1 | head -1 | awk '{print $2}' 
>>>>

>>> Если в скрипте 2 и более раз используется одна и та же
>>> утиль, то это ошибка.
>> Это чушь.  У двух авков тут (ты же про них?) совершенно
>> разная область действия.
> Делешь афк основной программой, остальные как его аргументы.

А по первому вопросу есть мысли?


"Вопросы по работе xargs"
Отправлено Andrey Mitrofanov , 10-Янв-14 20:33 
>> Делешь афк основной программой, остальные как его аргументы.

Павлин, глаза выше!

> А по первому вопросу есть мысли?

|xargs -I{} -n1 mv {} {}-OFF


"Вопросы по работе xargs"
Отправлено universite , 10-Янв-14 21:44 

>> А по первому вопросу есть мысли?
> |xargs -I{} -n1 mv {} {}-OFF

Работает!


"Вопросы по работе xargs"
Отправлено pavlinux , 10-Янв-14 21:51 
>>> Делешь афк основной программой, остальные как его аргументы.
> Павлин, глаза выше!

Ну не заметил...