LINUX.ORG.RU

Задачка. Парсинг строк на bash

 


1

2

Задачка, значит. Есть файл со строками, элементы строк разделены пробелами
a.первый элемент строки - IP-адрес сервера
b.второй элемент строки - путь на локальной системе
c.третий элемент строки - путь и имя файла на сервере
например:

10.0.0.2 /home/vasyap/dir1/ /kraker_interneta.exe 
172.20.253.3 /home/vasyap/ /KAV10/kav9.0.0.736ru.exe
Нужно скачать с удаленного сервера каждый файл по протоколу HTTP в указанную локальную директорию.

Можно ли решить задачу без использования инструментов с мозговзрывательным синтаксисом, типа ed, sed, awk? Продвинутые скриптовые языки perl и python прошу не предлагать, я о них ничего кроме названия не знаю.

★★★★★

man cut xargs wget

anonymous
()

Например, read – читать файл, for – пройтись по словам.

staseg ★★★★★
()
cat file | while read i; do IP=`echo $i | cut -d" " -f1` ; FILE=`echo $i | cut -d" " -f3`; DIR=`echo $i | cut -d" " -f2` ; cd $DIR; wget $IP$FILE; done

500 руб

r0ck3r ★★★★★
()
Последнее исправление: r0ck3r (всего исправлений: 1)
awk '{print "wget -o", $2, "http://" $1 $3 }' list.txt | sh
beastie ★★★★★
()

Ничего плохого в awk нет.

cat files.txt | awk '{print $1 }'

распечатает первый столбец. Если поставить $2 - второй, $3 - третий.

10.0.0.2
172.20.253.3

Теперь добавим строку «http://»:

cat files.txt | awk '{print «http://» $1}'

http://10.0.0.2
http://172.20.253.3

А в конце напишем полный запрос wget:

cat files.txt | awk '{print «wget -P » $2 " http://" $1 $3}'

wget -P /home/vasyap/dir1/ http://10.0.0.2/kraker_interneta.exe
wget -P /home/vasyap/ http://172.20.253.3/KAV10/kav9.0.0.736ru.exe

Остается только заключить команду в апострофы, чтобы баш выполнил эти wget-овые команды

`cat files.txt | awk '{print «wget -P » $2 " http://" $1 $3}'`

anonymous
()

Массив:

$ cat testfile.txt | while read i ; do j=($i) ; for n in {0..2} ; do echo ${j[$n]} ; done ; done
10.0.0.2
/home/vasyap/dir1/
/kraker_interneta.exe
172.20.253.3
/home/vasyap/
/KAV10/kav9.0.0.736ru.exe
sin_a ★★★★★
()
Последнее исправление: sin_a (всего исправлений: 1)
Ответ на: комментарий от anonymous

Кавычки, чтоб они были здоровы.

cat files.txt | awk '{print $1 }'

распечатает первый столбец. Если поставить $2 - второй, $3 - третий.

10.0.0.2
172.20.253.3

Теперь добавим строку «http://»:

cat files.txt | awk '{print "http://" $1}'
http://10.0.0.2
http://172.20.253.3

А в конце напишем полный запрос wget:

cat files.txt | awk '{print "wget -P " $2 " http://" $1 $3}'
wget -P /home/vasyap/dir1/ http://10.0.0.2/kraker_interneta.exe
wget -P /home/vasyap/ http://172.20.253.3/KAV10/kav9.0.0.736ru.exe

Остается только заключить команду в апострофы, чтобы баш выполнил эти wget-овые команды

`cat files.txt | awk '{print "wget -P " $2 " http://" $1 $3}'`
anonymous
()
IFS="
"
for i in `cat file` ; do
   IFS=" "
   for a in 1 2 3 ; do
      eval param_${a}="`echo ${i} | cut -d' ' -f${a}`"
   done
   cd ${param_2} || { mkdir -p ${param_2} ; cd ${param_2} ; }
   wget http://${param_1}${param_3}
done

Как-то так. Не проверял, работает или нет.

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

dexpl самый удобный кажется способ, им и воспользовался

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