Sed? Alle Formatierungen, also Zeilenumbrüche und Leerzeichen, aus einer Berichtstextdatei entfernen und dabei bestimmte Teile ausblenden

Sed? Alle Formatierungen, also Zeilenumbrüche und Leerzeichen, aus einer Berichtstextdatei entfernen und dabei bestimmte Teile ausblenden

Ich arbeite an einem Projekt, bei dem ich alle Formatierungen aus einer Textdatei entfernen muss, einschließlich Leerzeichen und Zeilenumbrüchen, und dann alle Doppelpunkte durch Pipes ersetzen muss. Ich habe einige Fortschritte gemacht, kann aber keine Möglichkeit finden, die Teile auszublenden, die ignoriert werden müssen. Ich bin neu bei sed und habe nur Anfängerkenntnisse in Bash-Skripting. Außerdem bin ich mir nicht ganz sicher, ob sed das richtige Tool für diese Aufgabe ist (vielleicht vi? Normalerweise verwende ich Nano). Die Datei, die ich zu formatieren versuche, ähnelt dieser

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

und die Ausgabe muss ungefähr so ​​aussehen:

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|

oder alles in einer Zeile.

Ich habe ein sehr einfaches Bash-Skript geschrieben, um es zu formatieren, etwa so

# 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

Welche Funktionen, außer dass die Ausgabe nicht ganz richtig ist, es gibt:

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

das Problem sind die Pipes, die nach den Gleichheitszeichen erscheinen. Wenn mir jemand sagen könnte, wie ich das richtig mache, oder mir sogar eine Online-Ressource zur Klärung nennen könnte, wäre ich sehr dankbar.

Das Lustige ist, dass das Endergebnis darin besteht, dass die unmittelbare Anforderung zwar darin besteht, wie im obigen Beispiel zu formatieren, dies aber in ein Unix-CLI-Grafiktool (ich vermute, es ist Gnuplot) einzuspeisen. So wie ich es verstehe, erfordert Gnuplot eine Formatierung in Spalten. Wie bereits erwähnt, ist dies Neuland für mich und ich wäre für jeden Ratschlag sehr dankbar.

Antwort1

Ich bin mir nicht ganz sicher, was Sie versuchen. Mit Ihrer ersten Eingabedatei erstelle ich diese Ausgabe:

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|

Mit diesem Perl-Einzeiler:

perl -pe 's/\n/|/;s/\s*//g; s/:/=/; END{print "\n"}' file

Sie können es auch hiermit tun:

sed -r 's/\s*//g; s/:/=/;' file | tr '\n' '|'

Antwort2

 sed -e ':a;N;$!ba;s/\n/\|/g;s/:  */=/g;s/ *//g' '<yourinputfilehere>' > '<youroutputfilehere>'

Erklärung: der erste Teil: :a;N;$!ba;s/\n/\|/gentfernt alle Zeilenumbrüche und ersetzt sie durch | eine bessere Erklärung der Syntax finden Sie hier:https://stackoverflow.com/questions/1251999/sed-wie-kann-ich-eine-neue-Zeile-ersetzen-n

der 2. Teil ;s/: */==/gersetzt alle Doppelpunkte gefolgt von einem oder mehreren Leerzeichen durch ==

der 3. Teil ;s/ *//gentfernt alle Singular- oder Multiple-Leerzeichen.

offensichtlich müssen Ihre Eingabe- und Ausgabedatei ersetzt werden. Wenn Sie Debug-Ausgaben in Ihrer Ausgabedatei vermeiden möchten, können Sie 2> '/dev/null'am Ende hinzufügen

Ich habe nicht wirklich verstanden, was Ihr Plan mit Ihrem Input war, aber Sie sollten in der Lage sein, ihn von hier aus umzusetzen.

verwandte Informationen