Как перенести данные между двумя строками в файл Linux - PullRequest
3 голосов
/ 29 апреля 2019

Я хочу получить строки между forwarders { и }; это IP-адрес, ниже приведен пример файла, который имитирует мои данные ..

// Red Hat BIND Configuration Tool
//
// THIS IS THE SLAVE DDNS SERVER -
//

// Currently running in chroot environment
// Prefix all file names below with /var/named/chroot
options {
        directory "/var/named";
        dump-file "/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        recursion yes;
        check-names master ignore;
        check-names slave ignore;
        check-names respocope ignore;
        max-journal-size 2M;
        allow-query { any; };
        allow-update {
                key copdcop1.example.com.;
                key copdcop2.example.com.;
                key copdcop3.example.com.;
                key copdcop4.example.com.;
        };

        forward only;
        forwarders {
      192.168.174.131;     // cop-no1
      192.155.98.74;        // cop-jn1
      192.168.2.40;       // cop-sad1
      192.168.2.56;       // cop-s1
      192.43.4.70;        // cop-che1
      192.20.28.8;      // copdcop1
        };

Желаемый результат:

      192.168.174.131;     // cop-no1
      192.155.98.74;        // cop-jn1
      192.168.2.40;       // cop-sad1
      192.168.2.56;       // cop-s1
      192.43.4.70;        // cop-che1
      192.20.28.8;      // copdcop1

Я в порядке с любым решением: shell, python или awk.

Я пробовал с помощью sed, но безуспешно ..

sed -n '"/forwarders {"/,/"};"' dns.txt

Однако, нижеприведенный код awk работает ..

awk '/forwarders {/{flag=1;next}/};/{flag=0}flag' dns.txt

Ответы [ 3 ]

4 голосов
/ 29 апреля 2019
sed -n '/forwarders {/,/};/{//!p}' file

Учитывая ваш образец его вывод:

      192.168.174.131;     // cop-no1
      192.155.98.74;        // cop-jn1
      192.168.2.40;       // cop-sad1
      192.168.2.56;       // cop-s1
      192.43.4.70;        // cop-che1
      1192.20.28.8;      // copdcop1
2 голосов
/ 29 апреля 2019

Это действительно зависит от того, насколько файл может измениться.

Но это подойдет для вашего примера:

 awk '/forwarders {/{flag=1;next}/};/{flag=0}flag' /path/to/file

Для вашего примера:

  192.168.174.131;     // cop-no1
  192.155.98.74;        // cop-jn1
  192.168.2.40;       // cop-sad1
  192.168.2.56;       // cop-s1
  192.43.4.70;        // cop-che1
  192.20.28.8;      // copdcop1
1 голос
/ 29 апреля 2019

РЕДАКТИРОВАТЬ: Так как OP запросил вывод в одну строку, поэтому добавьте следующее решение сейчас.

awk 'BEGIN{OFS=","} /}/{found=""} /forwarders {/{found=1} found && match($0,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/){gsub(/ +/," ");val=(val?val OFS:"")$0}END{print val}'  Input_file

ИЛИ не одна форма решения лайнера.

awk '
BEGIN{
  OFS=","
}
/}/{
  found=""
}
/forwarders {/{
  found=1
}
found && match($0,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/){
  gsub(/ +/," ")
  val=(val?val OFS:"")$0
}
END{
  print val
}'  Input_file

ИЛИ, как уже упоминалось ранее, чтобы напечатать что-нибудь внутри блока пересылки, попробуйте:

awk '/}/{found=""} /forwarders {/{found=1;next} found{gsub(/ +/," ");val=(val?val OFS:"")$0} END{print val}'  Input_file


Не могли бы вы попробовать выполнить следующее (учитывая, что вам нужно тольконапечатайте IP-адреса внутри тега).

awk '/}/{found=""} /forwarders {/{found=1} found && match($0,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/)'  Input_file

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

awk '/}/{found=""} /forwarders {/{found=1;next} found'  Input_file
...