Superuser

Autor Thema: shell Programmierung  (Gelesen 7972 mal)

uwe

  • Gast
shell Programmierung
« am: 11. März 2009, 12:02:16 »
Hallo

Ich habe nachfolgende Problemstellung welche ich mittels script erkennen möchte.
- Es wird mehrmals täglich ein File erstellt welches Zeile für Zeile (up to 2000) informationen  enthält die anschliessend an den IBM Hosts übermittelt werden.
- Es kann durch Fehleingabe vorkommen, dass eine Zeile dieses Files (Record) die maximal zulässige Anzahl Char (in meinem Fall 579) übersteigt was dazu führt, dass der Batch Job auf dem Host dann abbricht.

Ziel:
Ich möchte erkennen wenn eine Zeile dieses Files die maximale länge von 579 Char überschreitet.

ich habe dazu einen grep der das könnte, aber mir erscheint das nicht sehr effizient
    grep -v '^............579 mal einen Punkt.......$' Filename
listet mir alle Zeilen auf welche mehr als 579 Char pro Zeile haben.

Frage:
Hat jemand eine Idee wie sich das besser realisieren lassen könnte?

Für eure Hilfe bereits besten Dank
Gruss Uwe


sonnenblen.de - Das unabhängige Sun User Forum

shell Programmierung
« am: 11. März 2009, 12:02:16 »

Offline erisch

  • Sobl Moderator
  • Sobl Guru
  • *****
  • Beiträge: 758
  • TurboSPAAAAAG
    • erisch.homeunix.net
Re: shell Programmierung
« Antwort #1 am: 11. März 2009, 12:28:33 »
gibts fuer regexps nicht quantifizierer? Ich dachte schon.

guck mal hier: http://www.regenechsen.de/phpwcms/index.php?regex_allg_quant

Mfg. erisch

Offline DukeNuke2

  • Sobl Guru
  • *****
  • Beiträge: 571
  • Soulman
    • Wo die Sonne lacht
Re: shell Programmierung
« Antwort #2 am: 11. März 2009, 12:46:28 »
kann man mit nem kleinen script lösen...

while read LINE
do
 echo $LINE | wc -c
done < $1

einfach das script aufrufen mit dem zu zählenden file als argument...

Offline Drusus

  • Sobl Master
  • ****
  • Beiträge: 424
  • Intentionally left blank
Re: shell Programmierung
« Antwort #3 am: 11. März 2009, 12:53:30 »
Moin,

Wenn es nur darum geht ob in der Eingabedatei (hier $FILENAME) eine Zeile zu lang ist:
if [ `cut -c579- $FILENAME | uniq | wc -l` != 1 ]; then
        echo "Some line is too long or input file empty"
        exit 1
fi

Tschau,
  Drusus.

Offline dornroeschen

  • Sobl Junior
  • **
  • Beiträge: 64
Re: shell Programmierung
« Antwort #4 am: 11. März 2009, 13:05:46 »
Als Filter:

nawk 'length <= 580'

blendet alle Zeilen aus, die einschließlich Newline länger als 580 Zeichen sind.

Rainer

Offline dominik

  • Sobl Bachelor
  • ***
  • Beiträge: 182
  • Me, myself & I
    • Meine Heimseite
Re: shell Programmierung
« Antwort #5 am: 11. März 2009, 13:40:39 »
Eigentlich wollte ich was Kluges sagen, aber Edith wies mich darauf hin, dass das Kluge wohl doch nicht sooo klug war ;)


gruss
Dominik
« Letzte Änderung: 11. März 2009, 13:49:02 von dominik »

uwe

  • Gast
Re: shell Programmierung
« Antwort #6 am: 11. März 2009, 14:08:40 »
Hallo Leute

Besten Dank für die vielen Beiträge, mache mich gleich an die Arbeit und prüfe ob ich die Vorschläge umsetzen kann

Danke und Gruss
Uwe

uwe

  • Gast
Re: shell Programmierung
« Antwort #7 am: 11. März 2009, 14:19:32 »
Moin,

Wenn es nur darum geht ob in der Eingabedatei (hier $FILENAME) eine Zeile zu lang ist:
if [ `cut -c579- $FILENAME | uniq | wc -l` != 1 ]; then
        echo "Some line is too long or input file empty"
        exit 1
fi

Tschau,
  Drusus.


Hallo Drusus

Kann ich auch eine Ausgabe der Zeile, welche betroffen ist, ausgeben?

mfg uwe

Offline meik

  • Sobl Bachelor
  • ***
  • Beiträge: 187
Re: shell Programmierung
« Antwort #8 am: 11. März 2009, 19:00:27 »
Moin,

Wenn es nur darum geht ob in der Eingabedatei (hier $FILENAME) eine Zeile zu lang ist:
if [ `cut -c579- $FILENAME | uniq | wc -l` != 1 ]; then
        echo "Some line is too long or input file empty"
        exit 1
fi

Ich würde das eher mit awk machen, da reicht ein Programm (statt drei) und man kann bei der ersten Zeile abbrechen, die zu lang ist:

if ! awk 'length > 579 {exit 1}' $FILENAME ; then
        echo "Some line is too long"
        exit 1
fi
Zitat

Hallo Drusus

Kann ich auch eine Ausgabe der Zeile, welche betroffen ist, ausgeben?

mfg uwe

Einfach die aktuelle Zeile ausgeben, bevor du das Programm verläßt:

if awk 'length > 579 {print ; exit 1}' $FILENAME ; then
 echo "Alles okay"
else
 echo "Zeile zu lang!"
fi

MfG, Meik

uwe

  • Gast
Re: shell Programmierung
« Antwort #9 am: 12. März 2009, 16:53:23 »
Moin,

Wenn es nur darum geht ob in der Eingabedatei (hier $FILENAME) eine Zeile zu lang ist:
if [ `cut -c579- $FILENAME | uniq | wc -l` != 1 ]; then
        echo "Some line is too long or input file empty"
        exit 1
fi

Ich würde das eher mit awk machen, da reicht ein Programm (statt drei) und man kann bei der ersten Zeile abbrechen, die zu lang ist:

if ! awk 'length > 579 {exit 1}' $FILENAME ; then
        echo "Some line is too long"
        exit 1
fi
Zitat

Hallo Drusus

Kann ich auch eine Ausgabe der Zeile, welche betroffen ist, ausgeben?

mfg uwe

Einfach die aktuelle Zeile ausgeben, bevor du das Programm verläßt:

if awk 'length > 579 {print ; exit 1}' $FILENAME ; then
 echo "Alles okay"
else
 echo "Zeile zu lang!"
fi

MfG, Meik



Hallo Meik

Beim vorgeschlagenen awk wäre es für mich sehr vorteilhaft wenn ich den output von print verwerten könnte (sms). Ich komme aber nicht dahinter wie ich das a) in ein file redirecten  oder b) in eine variable umlenken könnte. Hast Du einen Vorschlag?
gruss uwe


sonnenblen.de - Das unabhängige Sun User Forum

Re: shell Programmierung
« Antwort #9 am: 12. März 2009, 16:53:23 »

Offline meik

  • Sobl Bachelor
  • ***
  • Beiträge: 187
Re: shell Programmierung
« Antwort #10 am: 12. März 2009, 18:02:53 »
Zitat
Hallo Meik

Beim vorgeschlagenen awk wäre es für mich sehr vorteilhaft wenn ich den output von print verwerten könnte (sms). Ich komme aber nicht dahinter wie ich das a) in ein file redirecten  oder b) in eine variable umlenken könnte. Hast Du einen Vorschlag?
gruss uwe

Backquotes, je nach Shell kann man das noch reichlich variieren:

line=`awk 'length > 579 {print ; exit 1}' $FILENAME`
if [ $? -ne 0 ] ; then
 echo "Zeile zu lang: $line " | send_sms
fi

Das ist aber eigentlich das kleine Einmaleins der Shell-Programmierung. Vielleicht solltest du mal etwas Zeit und ein paar Euro in ein Buch zum Thema investieren. ;-)