Сохранить строку с пробелами в команде чтения - PullRequest
0 голосов
/ 30 июня 2019

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

Как этот;

"Name","Type","FC Ports","iSCSI Ports","User Group","Cluster","Performance Class"
"mnlas-esxq01","default","100000051EC20A95,100000051EC20A96,100000051EC21AC3,100000051EC21AC4","","","MNLASDMZ CL-1","none"
"mnlas-esxa02","default","100000051EC20D3A,100000051EC20D3B,100000051EC2218D,100000051EC2218E","","","MNLASDMZ CL-1","none"
"mnlas-esx916","default","21000024FF4DDC20,21000024FF4DDC21,21000024FF490CFC,21000024FF490CFD","","","MNLASPRODSCCM CL-1","none"
"mnlas-esx417","default","21000024FF4DDBE8,21000024FF4DDBE9,21000024FF490F56,21000024FF490F57","","","MNLASPRODSCCM CL-1","none"
"mnlas-esx111","default","21000024FF4DDC56,21000024FF4DDC57,21000024FF490F00,21000024FF490F01","","","MNLASPRODSCCM CL-1","none"
"mnlas-p-xca09.pr.int.ptc.com","default","21000024FF514CF4,21000024FF514CF5","","","MNLAS P-xca CL-1","none"
"mnlas-p-xca10.pr.int.ptc.com","default","21000024FF514ED2,21000024FF514ED3","","","MNLAS P-xca CL-1","none"
"mnlas-p-xca11.pr.int.ptc.com","default","21000024FF514FB6,21000024FF514FB7","","","MNLAS P-xca CL-1","none"
"mnlas-esx403.ad.cibc.com","default","10008C7CFF702490,10008C7CFF702491,10008C7CFF702494,10008C7CFF702495,10008C7CFF652604,10008C7CFF652605,10008C7CFF20D0A8,10008C7CFF20D0A9","","","MNLASPRODSQL CL-1","none"
"mnlas-esx401.ad.cibc.com","default","10008C7CFF702484,10008C7CFF702485,10008C7CFF7023F4,10008C7CFF7023F5,10008C7CFF21B3E8,10008C7CFF21B3E9,10008C7CFF65203E,10008C7CFF65203F","","","MNLASPRODSQL CL-1","none"

Как видите, длины тоже разные.

Моя цель - отобразить Name, порты и кластер iSCSI, но иногда некоторые поля также пусты.

Как мне правильно отформатировать его и использовать grep, чтобы найти имя хоста, которое будет выглядеть следующим образом.

Name            iSCSI Ports                               Cluster
mnlas-esxq01    100000051EC20A95,100000051EC20A96         MNLASDMZ CL-1 

Кстати, порты iSCSI имеют тенденцию быть немного длиннее из-за количества портов, поэтому поле CLuster должно корректироваться

Я пытался использовать эту команду, но она не сработала. Это говорит

sh-4.2# cat temp/testS | grep -i esx401 | while read "Name" "Type" "iSCSI Ports" "User Group" "Cluster" "Performance Class";do echo $Name $"iSCSI Ports" $Cluster;done
sh: read: `iSCSI Ports': not a valid identifier

Я также пытался определить ее для переменной, но она не работала.

Любая помощь будет оценена.

Ответы [ 2 ]

1 голос
/ 01 июля 2019

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

while IFS=$'\r' read -r name type fcports scsi user cluster remainer; do
   printf "%-40s %-20s %-20s\n" "${name}" "${scsi}" "${cluster}"
   # or use ${fcports} to show output like your example
done < <(sed 's/","/\r/g' file.csv | tr -d '"')
1 голос
/ 30 июня 2019

Вот определение «имени», которое оболочка использует для переменных и имен функций:

name

Слово, состоящее из только буквы, цифры и подчеркивания и начинающиеся с буквы или подчеркивания.Имена используются как имена переменных и функций оболочки.Также называется идентификатором.

2 Определения

Нельзя использовать пробелы в имени переменной.

Учитывая это, файлы CSV иногда довольно сложны для работы.Достаточно сложно, что вы должны использовать правильный анализатор CSV. - хороший набор инструментов:

csvcut -c "Name,iSCSI Ports,Cluster" file.csv
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...