Извлечь строки из текстового файла на основе параметра в одну строку

He desarrollado collectnode, que usa el protocolo winrmpara conectarse con Windows.

primero :crea un archivo de hosts:

# cat hosts.file


    [group1:vars] 
    nodetype=windows



    [group1] 
    server1
    server2
    server3
    server4
    server5

segundo :configurar la credencial en CollectNode

# collectnode --configure
Do you want to change the localhost User ? [y/n]: n
Do you want to change the UNIX/LINUX User used the connect to the servers? [y/n]: n
Do you want to change the WINDOWS User used the connect to the servers? [y/n]: y
Enter user name: Administrator
Enter password:
Enter domain|realm [none]: none
Enter transport mode (basic|ntlm|kerberos) [kerberos]: ntlm
Current path: /var/log/
Do you want to change the current path for log file? [y/n]: n

tercero :Ejecute cualquier comando que necesite en estos servidores:

# collectnode --file hosts.file --command='whatever command you need'

https://collectnode.com/executing-commands-on-remote-windows-from-linux-terminal/

1
30.06.2017, 22:05
4 ответа

Это можно сделать с помощью идиоматического awk:

awk '$1=$1' RS= OFS= infile

Выход:

timestamp=201706291035.....;line 2;line 3;line 4;line 5;line 6;line 7;
timestamp=201706291038.....;line 2;line 3;line 4;line 5;line 6;

Пояснение

Здесь много всего упаковано. В основном есть три шага:

  1. Сначала ввод разбивается на записи на основе разделителя записей(RS).
  2. Каждая запись разбивается на поля на основе разделителя полей(FS).
  3. При печати разделитель полей вывода(OFS)используется в качестве разделителя полей.

Когда awk анализирует входные данные, действует несколько неявных правил. Данные считываются по одной записи за раз, записи разделяютсяRS(по умолчанию\n). Когда RSпусто, как в приведенном выше примере, пустая строка разделяет записи. Таким образом, каждый раздел считывается как запись.

Чтобы заставить awkзаменить FSна OFS, мы устанавливаем первое поле $1на себя.

Редактировать

Как отметил steeldriver , ОП хочет удалить конечные точки с запятой -. Беззастенчиво скопировано:

awk '{ sub(/;$/,"",$NF); $1=$1 } 1' RS= OFS= infile
4
28.04.2021, 23:59

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

perl -pe 'chomp unless /^$/'

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

perl -pe 'chomp; print "\n" if $. > 1 && /^timestamp=/; print }{ print "\n"'
0
28.04.2021, 23:59

Самый короткий ответ для варианта использования будет:

awk '$1=$1' > "single.txt" RS= test.txt

Поскольку RSобъяснил Тор, нам нужно только RSздесь, чтобы получить наш результат.

0
28.04.2021, 23:59

Это можно сделать следующим образом:

perl -lF';\n?' -00ne '$,=";"; print @F' yourfile

Выход

timestamp=201706291035.....;line 2;line 3;line 4;line 5;line 6;line 7
timestamp=201706291038.....;line 2;line 3;line 4;line 5;line 6

Работа

  1. Опции Perl

    a)-l=> ORS="\n" + RS = "\n"

    b)-F';\n?'=> сделает FS точкой с запятой, за которой следует необязательный перевод строки.

    c)-00=> сделает RS=, тем самым включив режим абзаца.

    d)-n=> включит неявное чтение файла -в + явная печать.

  2. Main:$,=;сделает OFS точкой с запятой, @F— это поля, которые были вырезаны из текущей записи $_на основе FS.

1
28.04.2021, 23:59

Теги

Похожие вопросы