как разделить каждую строку в строке csv на строки

Да, вы можете настроить вход в Logstash с помощью чего-то вроде:

input {
      tcp {
          port => 5000
          type => syslog
      }
}
0
28.08.2019, 15:16
2 ответа
$ echo machine23,machine094,machine73,machine83 | tr ',' '\n'
machine23
machine094
machine73
machine83

или если вы действительно хотели сделать это в awk (, возможно, потому что вы хотите выполнить дальнейшую обработку в awk):

$ echo machine23,machine094,machine73,machine83 | \
  awk -F',' -v OFS='\n' '{$1=$1;$0=$0;print}'
machine23
machine094
machine73
machine83

Здесь используется хитрый прием awk: если вы измените любое поле (, даже установив его равным самому себе, как в $1=$), а затем установите $0=$0, awk переформатирует всю строку ввода -, заменив исходные разделители полей (FS, запятая в данном случае )с разделителем выходных полей (OFS, новая строка в данном случае ).

5
28.01.2020, 02:14

Во-первых, в духе обучения, вот фиксированная версия вашей собственной логики (, завернутая и разделенная для удобства чтения):

$ echo machine23,machine094,machine73,machine83 \
    |awk -F"," '{ for (i = 1; i <= NF; i++) { printf "%-20s\n", $i } }'
machine23           
machine094          
machine73           
machine83           

Поскольку вы использовали %-20s, это добавляет немного пробела в конце (выберите приведенный выше вывод, чтобы увидеть его ), но все, что я сделал, это переместил printf "\n"в printfвнутри forпетля.

Поскольку в вашей версии было так мало пробелов, вот код -решение для игры в гольф с использованием вашей логики:

echo machine23,machine094,machine73,machine83|awk -F, '{while(i<NF)print$++i}'

 

Вот решение awk, не зависящее от поля -, использующее глобальную замену без использования цикла:

$ echo machine23,machine094,machine73,machine83 |awk '{ gsub(/,/,"\n"); print }'
machine23
machine094
machine73
machine83

Это имитирует следующее решение sed:

$ echo machine23,machine094,machine73,machine83 |sed 's/,/\n/g'
machine23
machine094
machine73
machine83

В обоих случаях запятые просто заменяются символами новой строки, точно так же, как решение cas'а tr .

Вот решение grep:

$ echo machine23,machine094,machine73,machine83 |grep -o '[^,]*'
machine23
machine094
machine73
machine83

Здесь grep показывает только(-o)соответствующий текст без запятой -, причем каждый элемент находится в отдельной строке.

1
28.01.2020, 02:14

Теги

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