Форум русскоязычного сообщества Ubuntu


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: bash, разобрать несколько строк текста и записать данные в мускуль.  (Прочитано 1656 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн thunderamur

  • Автор темы
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 6748
  • Ubuntu 16.04
    • Просмотр профиля
Как выдрать данные из строки знаю, как записать в мускуль тоже. Не ясен мне только вопрос, как разобрать кучу строк в цикл, чтоб по одной строке работать.

имею:
34 вла овл 2л ол
534 вл лы 3а ф
23 вло вл а8 ыл
43 выф вл 43 фл

но получить цикл в котором получится оперировать
1-й прогон:
$str = "34 вла овл 2л ол"
2-й прогон:
$str = "534 вл лы 3а ф"
...

Оффлайн Мангуст

  • Любитель
  • *
  • Сообщений: 98
    • Просмотр профиля
while read str; do
 # работаем с "$str"
done

Понятно, что берем строки из фильтра или из файла:

some_command | while ...
или
while ... done < file

Если нужна обработка строк (разбивка на части, вычисления, удаление перевода строки...), то лучше использовать perl или awk.

Оффлайн thunderamur

  • Автор темы
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 6748
  • Ubuntu 16.04
    • Просмотр профиля
можешь показать законченный пример?

Оффлайн ArcFi

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 15194
    • Просмотр профиля
    • aetera.net
while read ; do echo "$REPLY" ; done <~/.bashrc
sort ~/.bashrc | while read ; do echo "$REPLY" ; done

Оффлайн thunderamur

  • Автор темы
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 6748
  • Ubuntu 16.04
    • Просмотр профиля
угу, из учебника сделал так
#!/bin/bash
for str in `cat somefile | awk '{print $1 $4}'`
do
  echo $str
done

но в $str теперь данные которые мне нужны без разделителя, охота не строку а массив, чтоб потом из него писать куда надо $ar[1], $ar[2] и т.д.

Оффлайн ArcFi

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 15194
    • Просмотр профиля
    • aetera.net
⚡ Thunde® ⚡, можете привести более точный пример исходного файла, который требуется обработать, а также принцип, по которому будет выполняться выборка данных из строки (регэксп, позиция, разделители)?

Оффлайн thunderamur

  • Автор темы
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 6748
  • Ubuntu 16.04
    • Просмотр профиля
#!/bin/bash
for str in "11111 222 333 444 555"
do
echo $str | awk '{print $1}'
echo '/'
echo $str | awk '{print $4}'
done

вот, что мне нужно, чтобы строка рассматривалась как целая а не разбитая по словам как получается в случае:

#!/bin/bash
for str in `cat somefile`
do
echo $str | awk '{print $1}'
echo '/'
echo $str | awk '{print $4}'
done

Пользователь решил продолжить мысль 14 Март 2011, 12:50:07:
⚡ Thunde® ⚡, можете привести более точный пример исходного файла, который требуется обработать, а также принцип, по которому будет выполняться выборка данных из строки (регэксп, позиция, разделители)?

вообще будет
iptables -L -vnxкоторый я хочу разобрать на данные и засунуть в мускуль.

Оффлайн ArcFi

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 15194
    • Просмотр профиля
    • aetera.net
вот, что мне нужно, чтобы строка рассматривалась как целая а не разбитая по словам как получается в случае:
Делайте цикл while, как в примерах выше, и всё будет ok.

Оффлайн thunderamur

  • Автор темы
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 6748
  • Ubuntu 16.04
    • Просмотр профиля
#!/bin/bash
while read ; do echo "$REPLY" ; done <~/.bashrc

thunder@amd:~/bin$ sh test
read: 2: arg count

Оффлайн ArcFi

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 15194
    • Просмотр профиля
    • aetera.net

Оффлайн Мангуст

  • Любитель
  • *
  • Сообщений: 98
    • Просмотр профиля
$REPLY - башизм. То есть или делайте bash try, или же, чем вам не нравится просто sh:

while read str; do
...
done


« Последнее редактирование: 14 Март 2011, 14:33:14 от Мангуст »

Оффлайн alexander.pronin

  • Старожил
  • *
  • Сообщений: 2540
    • Просмотр профиля
$REPLY - башизм.
Да, есть такое дело. Я спотыкался об этот косяк.
Для универсальности надо делать
read LINE
и использовать $LINE
, а не надеяться, что сделав
read
, в $REPLY будет причитанное значение.

Оффлайн thunderamur

  • Автор темы
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 6748
  • Ubuntu 16.04
    • Просмотр профиля
#!/bin/bash
...
$ sh test
Это плохая привычка.
ну-ну... развивайте мысль ))

Пользователь решил продолжить мысль 14 Март 2011, 15:21:36:
Всем спасибо!

#!/bin/bash
while read str; do
echo $str | awk '{ print $1 }';
echo "/";
echo $str | awk '{ print $3 }';
done < somefile

thunder@admin:~/bin$ cat somefile
12 adkfj 324 ak
32 dkj 23 dk
84 dkfj 232 ka
thunder@admin:~/bin$ ./test
12
/
324
32
/
23
84
/
232
thunder@admin:~/bin$
« Последнее редактирование: 15 Март 2011, 03:22:09 от ⚡ Thunde® ⚡ »

Оффлайн ArcFi

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 15194
    • Просмотр профиля
    • aetera.net
ну-ну... развивайте мысль ))
Указываете в шабанге один интерпретатор, а запускаете другим.
Скрипт на python/sed/perl ведь не станете скармливать sh.

thunder@admin:~/bin$ ./test
Вот, это другое дело.

 

Страница сгенерирована за 0.056 секунд. Запросов: 24.