Bash работа с файлами

Discussion in 'Linux, Freebsd, *nix' started by tester_new, 15 Jan 2014.

  1. tester_new

    tester_new Elder - Старейшина

    Joined:
    12 Feb 2012
    Messages:
    292
    Likes Received:
    41
    Reputations:
    24
    Есть файл some.txt с блоками текста которые разделены пробелами

    Пример:

    Задача: Если в блоке(блок: от пустой строки до пустой строки) текста есть подстрока 'value' то найти и считать значение test которое находиться в первой строке и записать его в файл res.txt и.т.д для всех блоков в файле.
     
  2. taha

    taha Elder - Старейшина

    Joined:
    20 Aug 2006
    Messages:
    399
    Likes Received:
    330
    Reputations:
    251
    хорошая задачка)) для прокачки очень важного админского скила

    итак, дано:
    txt.txt
    Code:
    111111test
    1111value
    1111111111
    1111111111
    
    222222test
    2222222222
    22222value
    2222222222
    
    333333test
    2222222222
    2222222222
    222222222
    
    444444test
    2222222222
    22222value
    2222222222
    
    решение:
    Code:
    [email protected]:~$ cat txt.txt | sed -nre '1h;/^$/!{ba;};N;h;:a;/^.*value$/{g;p;}'
    111111test
    
    222222test
    
    444444test
    
     
    1 person likes this.
  3. tester_new

    tester_new Elder - Старейшина

    Joined:
    12 Feb 2012
    Messages:
    292
    Likes Received:
    41
    Reputations:
    24
    Не сочтите за наглость)

    Подскажите как тут лучше сделать, нужно взять строку из файла result.txt найти ее в файле base.txt и записать данные которые расположены после ";" (после ; могут быть как буквы так и цифры разного регистра) из этой строки в файл finish.txt
    Вот как я пробую это сделать. но что то не разобрался с циклам for в bash.
    Файл result.txt содержит ip адреса.


    Пример Файла:
    Файл base.txt содержит записи вида:

    Пример файла:

     
  4. taha

    taha Elder - Старейшина

    Joined:
    20 Aug 2006
    Messages:
    399
    Likes Received:
    330
    Reputations:
    251
    Навскидку

    Code:
    [[email protected] ~]$ cat results.txt 
    1.1.1.1
    11.11.11.11
    22.22.22.22
    99.12.122.129
    196.196.196.196
    [[email protected] ~]$ cat base.txt 
    2.2.2.2;blabla
    11.11.11.11;TeSt_Some2_inFo
    3.3.3.3;blabla
    4.4.4.4;blabla
    99.12.122.129;Some2_inFo55
    5.5.5.5;blabla
    [[email protected] ~]$ cat results.txt | while read line; do sed -rne "s/$line;(.*)/\1/p" base.txt >> finish.txt; done
    [[email protected] ~]$ cat finish.txt 
    TeSt_Some2_inFo
    Some2_inFo55
    
     
  5. tester_new

    tester_new Elder - Старейшина

    Joined:
    12 Feb 2012
    Messages:
    292
    Likes Received:
    41
    Reputations:
    24
    Скажите а может быть что у меня sed 'урезанный?' я пробую этот скрипт на хостинге.
     
  6. taha

    taha Elder - Старейшина

    Joined:
    20 Aug 2006
    Messages:
    399
    Likes Received:
    330
    Reputations:
    251
    если уж отработало:
    Code:
    cat txt.txt | sed -nre '1h;/^$/!{ba;};N;h;:a;/^.*value$/{g;p;}'
    
    то
    Code:
    cat results.txt | while read line; do sed -rne "s/$line;(.*)/\1/p" base.txt >> finish.txt; done
    
    уж точно должно...

    1. также можешь попробовать без перенаправления в finish.txt (все совпадения попрут на консоль)
    2. можешь посмотреть, отрабатывает ли регулярка и как (я не брал в расчёт, что вначале будет что-то кроме ip; )
    sed -ne "/$line;.*/p" base.txt
    cat base.txt | sed -ne "/$line;.*/p"

    ЗЫ:
    команду и вывод в студию
    может не в седе проблемы, а в чём-то другом

    PS2:

    Code:
    [email protected]:~$ bash -x ./sh.sh 
    
    Отладка скриптов Bash
     
    #6 taha, 20 Jan 2014
    Last edited: 20 Jan 2014
    1 person likes this.
Loading...