shell skript von zeile x bis y ausgeben

AMD_Rulez

Lieutenant
Registriert
Feb. 2010
Beiträge
582
hallo,

mir fehlt eine funktion, welche aus einer datei alle zeilen ab bspw. dem tag 15 bis zum tag 17 ausgibt.
aufbau der datei ist bspw. folgender:

cat /pfad/zur/datei
17:00:02 benutzer 15 blabla

heißt die angabe zum tag befindet sich an 3ter position in der datei.


hat jemand eine lösung, ich stehe zumindest auf dem schlauch.

danke
 
Das kann ein Shell Guru bestimmt in einer Zeile sed/awk lösen. Ich würde das mit einem Python Skript in etwa wie folgt machen:

Code:
#!/usr/bin/python

f = open(/path/to/file.txt)

for line in f:
    parts = line.split(" ")
    day = int(parts[2])

    if day >= 15 && day <= 17:
        print line

f.close()

Natürlich könnte man das noch ein wenig optimieren, z.B. das das Skript nicht abstürzt wenn in der dritten Position kein parsebarer integer steht aber ich glaube die Idee ist klar.
 
Zuletzt bearbeitet:
blicke nur leider nicht durch bei awk.

datei sieht meinetwegen so aus:
12:00:02 ooo 14 blabla
13:00:02 zzz 15 blabla
14:00:02 yyy 16 blabla
15:00:02 xxx 17 blabla

das skript soll nun alle zeilen ausgeben ab awk '$3 == 15 { print $0}' datei bis zu awk '$3 == 17 { print $0}' datei

wo ist mein denkfehler
 
warum setzt Du das nicht in eine logisch verknüpfte Bedingung wie "$3 > 15 && $3 < 17"?

Code:
cat ${DATEI} | awk '{ if ( $3 >= 15 && $3 <= 17 ) print $0 }'
 
Zuletzt bearbeitet: (korrektur: ge && le statt gt && lt)
klar logisch...:)

die nächste frage auf die ich keine antwort finde ist: wie rufe ich variablen innheralb einer awk anweisung auf?

a="1"
awk '$5 == $a' datei
awk '$5 == a' datei
awk '$5 == `echo $a`' datei

gehen alle drei nicht...
 
das hier: Hilfsvariablen für awk definieren

Code:
awk '{ if ( $5 = a ) print $0 }' a="$VAR"

Was hast Du denn insgesamt vor? Dieses Stückwerk könnte irgendwann zu einer recht lustigen Konstruktion ausarten.
 
Zuletzt bearbeitet:
awk -v ist die richtige lösung.

es sollen shell variablen an awk übergeben werden, mit denen ein bestimmter inhalt eines files ausgegeben wird.
hier mal meine magische zeile, vllt lässt sich ja erkennen was ich vorhabe:

Code:
sed 's/  / /g' datei.txt |awk -v jahr1=$jahr1 -v monat1=$monat1 -v tag1=$tag1 -v jahr2=$jahr2 -v monat2=$monat2 -v tag2=$tag2 '$5 == monat1 && $6 == tag1 && $8 == jahr1 ,$5 == monat2 && $6 == tag2 && $8 == jahr2'
 
Boa, das sieht aber komisch aus. :)
Und: ersetzt du " " durch " "? Dann müsstest du im unteren Beispiel IFS="__" setzen (_ steht für ein Leerzeichen, das Forum erlaubt mir keine zwei Leerzeichen).

Schau mal..
Code:
#!/bin/bash
while read line
do
IFS=' ' read -a line_exp <<< "${line}";
case ${line_exp[2]} in
    [13-16]* ) echo ${line_exp[2]} ;;
esac
done < liste.txt
Das würde das dritte "Wort" ausgeben, wenn es zwischen 13 und 16 ist.
Oder...
Code:
#!/bin/bash
while read line
do
IFS=' ' read -a line_exp <<< "${line}";

# Ausgabe der Zeile, wenn erstes Wort "bla" beinhaltet:
[[ "${line_exp[0]}" =~ "bla" ]] && echo ${line}

# Ausgabe der Zeile, wenn drittes Wort eine Zahl zwischen 13-16 ist:
[[ ${line_exp[2]} >=13 && ${line_exp[2]} <=16 ]] && echo ${line}

done < liste.txt

Ist zwar was länger, aber vielleicht einfacher zu lesen. :D
 
Zuletzt bearbeitet:
das sed kann man natürlich weglassen. ich hatte nur für eine datei benötigt, in der ich eben die doppelten entfernen musste. im prinzip ging es ja nur um die awk anweisung.

deine version funktioniert natürlich auch:)
bin aber eher noch anfänger auf dem gebiet
 
Zuletzt bearbeitet:
Man könnte auch einen Perl Einzeiler verwenden

Code:
perl -ane 'print if $F[2]==15..$F[2]==17' /path/file
 
in bash:
Code:
while read -a x;do [[ ${x[2]} =~ 1[567] ]]&&echo ${x[*]};done </pfad/zur/datei
 
Zuletzt bearbeitet:
Zurück
Oben