공백과 줄 바꿈을 포함하여 텍스트 파일에서 모든 서식을 제거한 다음 콜론을 파이프로 바꿔야 하는 프로젝트를 진행 중입니다. 어느 정도 진전을 이루었지만 무시해야 할 부분을 가릴 수 있는 방법을 찾을 수 없습니다. 저는 sed를 처음 접했고 Bash 스크립팅의 초보자 수준에 불과하며 실제로 sed가 작업에 적합한 도구인지 완전히 확신하지 못합니다(아마도 vi? 저는 일반적으로 Nano를 사용합니다). 포맷하려는 파일은 다음과 유사합니다.
== LUN mysql05-dbdat02 ==
LUNName: mysql05-dbdat02
CollectionStartTime: 2012-09-20T15:43:03-04:00
CollectionEndTime: 2012-09-20T15:43:34-04:00
Capacity
CurrentCapacity: 512
IOOperations
Reads: 100
Writes: 0
ReadsPerSecond: 0.000000
WritesPerSecond: 0.000000
ReadMBPerSecond: 0.000
WriteMBPerSecond: 0.000
TotalMBPerSecond: 0.000
NonOptimizedIOPerSecond: 0.000000
CacheHitPercentage: 0.000
PerformanceMetrics
TotalIOsPerSecond: 0.000
ReadIOsPerSecond: 0.000
WriteIOsPerSecond: 0.000
TotalMBPerSecond: 0.000
ReadMBPerSecond: 0.000
WriteMBPerSecond: 0.000
Performance
== LUN mysql05-dbdat02 ==
LUNName: mysql05-dbdat02
CollectionStartTime: 2012-09-20T15:43:03-04:00
CollectionEndTime: 2012-09-20T15:43:34-04:00
Capacity
CurrentCapacity: 512
IOOperations
Reads: 100
Writes: 0
ReadsPerSecond: 0.000000
WritesPerSecond: 0.000000
ReadMBPerSecond: 0.000
WriteMBPerSecond: 0.000
TotalMBPerSecond: 0.000
NonOptimizedIOPerSecond: 0.000000
CacheHitPercentage: 0.000
PerformanceMetrics
TotalIOsPerSecond: 0.000
ReadIOsPerSecond: 0.000
WriteIOsPerSecond: 0.000
TotalMBPerSecond: 0.000
ReadMBPerSecond: 0.000
WriteMBPerSecond: 0.000
Performance
출력은 다음과 같아야 합니다.
cm-data-unity01|LUNNam=cm-data-unity01|CollectionStartTim=2012-09-20T15:43:03-04:00|CollectionEndTim=2012-09-20T15:43:34-04:00|Capacity|CurrentCapacit=2048|IOOperations|Read=10|Write=90|ReadsPerSecon=8.000000|WritesPerSecon=76.000000|ReadMBPerSecon=0.430|WriteMBPerSecon=0.542|TotalMBPerSecon=0.973|NonOptimizedIOPerSecon=85.000000|CacheHitPercentag=0.000|PerformanceMetrics|TotalIOsPerSecon=84.000|ReadIOsPerSecon=8.000|WriteIOsPerSecon=76.000|TotalMBPerSecon=0.973|ReadMBPerSecon=0.430|WriteMBPerSecon=0.542|Performance|
또는 모두 한 줄에 있습니다.
나는 다음과 같이 형식을 지정하기 위해 매우 간단한 Bash 스크립트를 작성했습니다.
# Author Christopher George Bollinger
# Comments: This script will modify the snippet.txt file.
# This script is meant to, first, take a specific bit of unformatted data and remove all line breaks and non-printable characters.
# Following this, the script is to replace any appropriate colons (those being used as delimiters) and replace them with the equals (=) character.
#!/bin/bash
echo "This script will remove line breaks, remove non-printable characters, and will replace colons used as field delimiters with the equals '(=)' character."
cp snippet.txt snippetwork.txt
RmLB ()
{
tr -d '\n' < snippetwork.txt > snippetwork1.txt
}
RmNonPrint ()
{
tr -cd "[:print:]" < snippetwork1.txt > snippetwork2.txt
}
RplcW ()
{
sed 's/: /=/g' snippetwork2.txt > snippetwork3.txt
}
RmWtSpc ()
{
tr -s ' ' '|' < snippetwork3.txt > snippetgood.txt
sed 'd/(?:[a-z]=) /'
}
QuChek ()
{
cat snippetgood.txt
read -p "Is this satisfactory? (Y/n)" Choice
case $Choice in
Y|y)
mv snippetgood.txt snippet.txt
rm -f snippetwork*
rm -f snippetgood.txt
;;
N|n)
exit
;;
*)
echo "Invalid Input."
;;
esac
}
read -p "Would you like to begin? (Y/n)" YorN
case $YorN in
Y|y)
RmLB
RmNonPrint
RplcW
RmWtSpc
QuChek
;;
N|n)
exit
;;
*)
echo "Invalid Selection"
;;
esac
출력을 제외한 어떤 기능이 옳지 않은지는 다음과 같습니다.
==|LUN|mysql05-dbdat02|==|LUNName=|mysql05-dbdat02|CollectionStartTime=|2012-09-20T15:43:03-04:00|CollectionEndTime=|2012-09-20T15:43:34-04:00|Capacity|CurrentCapacity=|512|IOOperations|Reads=|100|Writes=|0|ReadsPerSecond=|0.000000|WritesPerSecond=|0.000000|ReadMBPerSecond=|0.000|WriteMBPerSecond=|0.000|TotalMBPerSecond=|0.000|NonOptimizedIOPerSecond=|0.000000|CacheHitPercentage=|0.000|PerformanceMetrics|TotalIOsPerSecond=|0.000|ReadIOsPerSecond=|0.000|WriteIOsPerSecond=|0.000|TotalMBPerSecond=|0.000|ReadMBPerSecond=|0.000|WriteMBPerSecond=|0.000|Performance|==|LUN|mysql05-dbdat02|==|LUNName=|mysql05-dbdat02|CollectionStartTime=|2012-09-20T15:43:03-04:00|CollectionEndTime=|2012-09-20T15:43:34-04:00|Capacity|CurrentCapacity=|512|IOOperations|Reads=|100|Writes=|0|ReadsPerSecond=|0.000000|WritesPerSecond=|0.000000|ReadMBPerSecond=|0.000|WriteMBPerSecond=|0.000|TotalMBPerSecond=|0.000|NonOptimizedIOPerSecond=|0.000000|CacheHitPercentage=|0.000|PerformanceMetrics|TotalIOsPerSecond=|0.000|ReadIOsPerSecond=|0.000|WriteIOsPerSecond=|0.000|TotalMBPerSecond=|0.000|ReadMBPerSecond=|0.000|WriteMBPerSecond=|0.000|Performance|
문제는 등호 뒤에 나타나는 파이프입니다. 누구든지 이 문제를 해결하기 위한 올바른 방향을 알려주거나 설명을 위한 온라인 리소스를 알려주시면 정말 감사하겠습니다.
재미있는 점은 즉각적인 요청은 위의 예와 같은 형식을 지정하고 이를 Unix cli 그래프 도구에 공급하는 것입니다(제 생각에는 gnuplot입니다). 내가 이해한 바에 따르면 gnuplot에서는 형식이 열에 있어야 합니다. 언급한 바와 같이, 이것은 나에게 새로운 영역이며 어떤 조언이라도 주시면 진심으로 감사하겠습니다.
답변1
나는 당신이 무엇을 하려는지 잘 모르겠습니다. 첫 번째 입력 파일을 사용하여 다음 출력을 생성합니다.
LUNName=mysql05-dbdat02|CollectionStartTime=2012-09-20T15:43:03-04:00|CollectionEndTime=2012-09-20T15:43:34-04:00|Capacity|CurrentCapacity=512|IOOperations|Reads=100|Writes=0|ReadsPerSecond=0.000000|WritesPerSecond=0.000000|ReadMBPerSecond=0.000|WriteMBPerSecond=0.000|TotalMBPerSecond=0.000|NonOptimizedIOPerSecond=0.000000|CacheHitPercentage=0.000|PerformanceMetrics|TotalIOsPerSecond=0.000|ReadIOsPerSecond=0.000|WriteIOsPerSecond=0.000|TotalMBPerSecond=0.000|ReadMBPerSecond=0.000|WriteMBPerSecond=0.000|Performance|
이 Perl 하나의 라이너를 사용하면 다음과 같습니다.
perl -pe 's/\n/|/;s/\s*//g; s/:/=/; END{print "\n"}' file
다음과 같이 할 수도 있습니다.
sed -r 's/\s*//g; s/:/=/;' file | tr '\n' '|'
답변2
sed -e ':a;N;$!ba;s/\n/\|/g;s/: */=/g;s/ *//g' '<yourinputfilehere>' > '<youroutputfilehere>'
설명: 첫 번째 부분: :a;N;$!ba;s/\n/\|/g
모든 줄바꿈을 제거하고 | 구문에 대한 더 나은 설명은 다음과 같습니다.https://stackoverflow.com/questions/1251999/sed-how-can-i-replace-a-newline-n
두 번째 부분은 ;s/: */==/g
모든 콜론과 그 뒤에 하나 이상의 공백을 ==로 바꿉니다.
세 번째 부분은 ;s/ *//g
모든 단수 또는 다중 공백을 제거합니다.
분명히 입력 파일과 출력 파일을 교체해야 합니다. 출력 파일에서 디버그 출력을 피하려면 2> '/dev/null'
끝에 추가할 수 있습니다.
귀하의 계획이 귀하의 의견에 어떻게 반영되었는지 잘 이해하지 못했지만 여기에서 이를 구현할 수 있을 것입니다.