LINUX.ORG.RU

Захват данных из файла для дольнейшего использывания.

 , , , ,


0

1

Друзья, вопросик есть....заранее извиняйте, спросить особо не у кого.

вопрос по BASH скриптам.

1. есть у меня данные в файле 1.txt:

address NAME teltype pin tel access

_______ OLEG L 877 1 15 100

_______ MASHA sh 877 1 7 97

_______ marina go sjr 877 11 6 95

_______ forkin sir 877 6 23 85

_______ SerG 333 877 1 22 65

2. в этой таблице мне нужны только имена (они тут расположены по уровню доступа, с верху в низ, и мне это на руку)

а. вопрос: какой командой я могу «захватить» только имена, для дальнейшего использования в коде по очереди? *то есть - сначала захватывается «OLEG L», используется в другом скрипте, после окончания процесса использования - выберется «MASHA sh» и процесс повторяется с ней... и т.д. пока не доходит до конца и скрипт заканчивается.

б. в случае неудачной проверки, как можно скриптом добавить ещё один столбец, допустим под названием «NOMBER», в котором будет вписываться значение «check».

c. и последний вопрос, как использовать командой только те имена где в желаемом столбце написано «check»?

Заранее спасибо.



Последнее исправление: gogogordy (всего исправлений: 9)

воу! у тебя таблица база данных в текстовом файле
колонки
address NAME teltype pin tel access
в терминах баз данных файл называются поля.
строчки - это строчки и соотв. у каждого поля - значения.
нужно циклом(курсором) идти построчно по файлу, и парсить его, раскладывая данные для нужных полей в нужные переменные.

если аддресс без пробелов можно воспользоваться awk или цикл while а парсить и в переменные будет раскладывать read.

cat 1.txt |  while read address NAME teltype pin tel access 
do 
echo "тут что то делается именем $NAME его teltype=$teltype pin=$pin tel=$tel access=$access"
# разбиение делается по группам пробельных символов. если в address были пробелы всё может сдвинуться. 

done


примеров на awk - валом. не смотря на возможности awk, в основномон сейчас используется для подобного пасинга строк

если там есть пробелы, то придется гемороиться с разбиеним.
ps по нынешним временам это можно назвать работа с nosql бд, можно будет написать про это в резюме).

bl ★★★
()

Чем разделены поля? Пробелами или табуляциями? Если второе, то просто

cut -f2 "1.txt"

С учётом откусывания первой строки с заголовками задача б) решается примерно так:

paste 1.txt <(
  echo "NOMBER";
  tail -n+2 1.txt | cut -f2 | while read name; do
    if [ "MASHA sh" = "$name" ]; then
      echo "check"
    else
      echo
    fi
  done) > r.txt

Красиво напечатать табличку:

$ column -ts$'\t' r.txt
address  NAME           teltype  pin  tel  access  NOMBER
_______  OLEG L         877      1    15   100     
_______  MASHA sh       877      1    7    97      check
_______  marina go sjr  877      11   6    95      
_______  forkin sir     877      6    23   85      
_______  SerG 333       877      1    22   65      

c)

$ awk -F$'\t' '$7=="check"{print $2}' < r.txt
MASHA sh

Если же поля разделены пробелами, то ведь и части имени разделены пробелами и будет путаница, которую, при некоторой осторожности, можно преодолеть.

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

большущие вам всем спасибо за ответы! очень сильно помогли - 2 последних вопроса закрыты.

вопрос первые ещё всё таки как то мне не понятен.

таблица у меня состоит из пробелов, а не через табы. в соответствии с этим -

вопрос: какую команду предложите использовать чтоб разобрать беспорядок, причём без человеческого вмешательство?

подумал, удаляя командой заранее известные мне сочетания символов (чтоб столбец имени стал первым столбцом). пробовал командой:

 cat 1.txt | tr -d "[:blank:]" - удаляет все пробелы.

а мне нужно только там где пробелов больше 2ух, либо где определённое слово, например только слово «address». вопрос как?

ещё раз спасибо

gogogordy
() автор топика
Ответ на: комментарий от gogogordy

а мне нужно только там где пробелов больше 2ух

Не надёжно. Люди, которые набивали данные могли использовать сколько угодно пробелов (у меня мама так везде делает, мол так лучше видно): вася пупкин

Кроме того, непонятно, что в первом столбце. Если там реальный адрес, то как парсить проспект белых вася черных 1 2 3 4?

Пока могу такое предложить:

$ fffuuu.txt 
address NAME teltype pin tel access 
 _______ OLEG L 877 1 15 100 
 _______ MASHA sh 877 1 7 97 
 _______ marina go sjr 877 11 6 95 
 _______ forkin sir 877 6 23 85
 _______ SerG 333 877 1 22 65
$ sed -E 's/^\s*([^ ]+) (.+) ([[:digit:]]+) ([[:digit:]]+) ([[:digit:]]+) ([[:digit:]]+)\s*$/\1\t\2\t\3\t\4\t\5\t\6/' fffuuu.txt 
address NAME teltype pin tel access 
_______ OLEG L  877     1       15      100
_______ MASHA sh        877     1       7       97
_______ marina go sjr   877     11      6       95
_______ forkin sir      877     6       23      85
_______ SerG 333        877     1       22      65

legolegs ★★★★★
()
Последнее исправление: legolegs (всего исправлений: 1)
Ответ на: комментарий от legolegs

супер! благодарю!

нет, адрес там не указан. только полоски.

sed -E 's/^\s*([^ ]+) (.+) ([[:digit:]]+) ([[:digit:]]+) ([[:digit:]]+) ([[:digit:]]+)\s*$/\1\t\2\t\3\t\4\t\5\t\6/' fffuuu.txt 

вряд ли я бы сам такое написал )

gogogordy
() автор топика
Ответ на: комментарий от bl

cat 1.txt | while read address

Вот это вот «| while ...» - это запуск отдельного bash-скрипта. Вытащить из него полученные значения в основной код можно только через файлы или там базы данных - в общем, через внешние для обоих скриптов хранилища.

По-уму, надо упихать данные в табличку SQL, а потом основным скриптом SQL-запросами вытаскивать данные.

slamd64 ★★★★★
()
Последнее исправление: slamd64 (всего исправлений: 1)
Ответ на: комментарий от slamd64

По-уму, надо упихать данные в табличку SQL, а потом основным скриптом SQL-запросами вытаскивать данные.

Он зачёт не получит за такое. Ибо сразу будет понятно, что раз SQL ещё не проходили, то либо умничает (что проверяется на раз), либо делал не сам :)

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

По-уму, надо упихать данные в табличку SQL, а потом основным скриптом SQL-запросами вытаскивать данные.

Тут главное - по полям разделить, а что будет на выходе - SQL или, скажем, аккуратный CSV, уже вторично.

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

Он зачёт не получит за такое.

Контрольный пример не похож на то, что обычно дают для зачётов. Слишком, я бы сказал, «грязный» и жизненный.

Больше похоже, что ТС этот файл получил в результате какой-нибудь сетевой «рыбалки» (kali в тегах намекает).

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

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

Через эхо и пайп все прекрасно вытаскивается.

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

Вот это вот «| while ...» - это запуск отдельного bash-скрипта.

Это так, но в данном случае уродство именно в дурацком использовании cat, о котором твердят всё время существования этой команды. Ну не нужно оно! И пайп и субшел сразу отпадают автоматом.

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

хаха! порадовали ))

это не зачёт и не улов от рыбалок ))))

я, так сказать, новечёк самоучка. а кали поставил по скольку большинство «инструкций» находящихся в и-нете по кали. ...легче научиться...

учусь этому по той-же причине что учился и паять.

поставил перед собой задачу, написать определённый скрипт который включает в себя много задач - в конечном счёте - и научусь, и полезный скриптик будет ))

то что вы видете перед собой это часть кода из большого скрипта. а файл это grep данных из консули полученные другими командами.

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