말했다? 특정 부분을 마스킹하면서 보고서 텍스트 파일에서 모든 서식(예: 줄 바꿈 및 공백)을 제거합니다.

말했다? 특정 부분을 마스킹하면서 보고서 텍스트 파일에서 모든 서식(예: 줄 바꿈 및 공백)을 제거합니다.

저는 공백과 줄 바꿈을 포함하여 텍스트 파일에서 모든 서식을 제거한 다음 콜론을 파이프로 바꿔야 하는 프로젝트를 진행하고 있습니다. 어느 정도 진전이 있었지만 무시해야 할 부분을 가릴 수 있는 방법을 찾을 수 없습니다. 저는 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 One 라이너를 사용하면:

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>'

설명: 1부: :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'끝에 추가 할 수 있습니다.

귀하의 계획이 무엇인지 잘 모르겠습니다. 하지만 여기에서 이를 구현할 수는 있을 것입니다.

관련 정보