Mit awk Variablen und Array setzen
Hi an alle,
ich habe ein Problem unter Unix/Aix und zwar versuche ich in einem ksh script Informationen auszulesen mit awk und diese dann in Variablen zu schreiben.
Zum einen soll mit:
date '+%m %y' | awk '{cm=$1; cy=$2}'
der jeweilige monat und das jahr in die variablen cm und cy geschreiben werden, sodass diese weiter in dem script verwendet werden können.
Fals dies gelingt, soll später, mit awk(oder auch mit anderen möglichkeiten) ein Array befüllt werden.
Mein Beispiel-Ansatz ist:
lpstat -l -p$printer | awk 'NR>3{arr[$1]=$2}'
Jedoch funktionieren beide Aufrufe nicht und ich hoffe es liegt nur an der falschen Syntax von meinen awk Aufrufen, sonst wäre ich für andere Varianten sehr dankbar.
Ich hoffe ich habe mich klar genug ausgedrückt, bei Unklarheiten einfach fragen ;)
mfg Alucard7
Zum einen soll mit:
date '+%m %y' | awk '{cm=$1; cy=$2}'
der jeweilige monat und das jahr in die variablen cm und cy geschreiben werden, sodass diese weiter in dem script verwendet werden können.
Fals dies gelingt, soll später, mit awk(oder auch mit anderen möglichkeiten) ein Array befüllt werden.
Mein Beispiel-Ansatz ist:
lpstat -l -p$printer | awk 'NR>3{arr[$1]=$2}'
Jedoch funktionieren beide Aufrufe nicht und ich hoffe es liegt nur an der falschen Syntax von meinen awk Aufrufen, sonst wäre ich für andere Varianten sehr dankbar.
Ich hoffe ich habe mich klar genug ausgedrückt, bei Unklarheiten einfach fragen ;)
mfg Alucard7
Please also mark the comments that contributed to the solution of the article
Content-Key: 164686
Url: https://administrator.de/contentid/164686
Printed on: May 4, 2024 at 15:05 o'clock
14 Comments
Latest comment
du kannst eigentlich das ganze in awk ausführen.
mit
mit
jetz noch eine frage, ich mache nicht so viel mit der "KSH" kann die überhaubt mit arrays umgehen? die bash kann es.
also ich habe gerade mal wikipedia gelesen und so wie ich es deute kann die normale ksh keine arrays.
http://de.wikipedia.org/wiki/Korn-Shell
gruß michael
mit
system("befehl")
kannst du dann alle befehle die es in der ksh ausführen lassen.mit
system("befehl | getline")
kannst du die ausgabe mit awk weiter verarbeiten.jetz noch eine frage, ich mache nicht so viel mit der "KSH" kann die überhaubt mit arrays umgehen? die bash kann es.
also ich habe gerade mal wikipedia gelesen und so wie ich es deute kann die normale ksh keine arrays.
http://de.wikipedia.org/wiki/Korn-Shell
gruß michael
Guten Morgen,
hier habe erstmal ein kleinen zwischen stand.
gruß michael
hier habe erstmal ein kleinen zwischen stand.
#! /usr/bin/awk -f
BEGIN {
print "Anzahl Argumente in ARGC : " , ARGC-1
if(ARGC-1 < 2){
print "Bitte 2 dateien angeben"
exit 1
}
DATEI1=ARGV[1]
DATEI2=ARGV[2]
#print DATEI1
#print DATEI2
print "________________"
}
# HauptPRG
{
suchedatei1()
}
END {
close (DATEI2)
print "ende des scripts"
}
function suchedatei1(){
FS=" "
line[NR]=$0
lineDatum[NR]=$1
lineDatei[NR]=$3
suche1=match($0, "02/22")
if(suche1){
print "Treffer Datum: " NR, lineDatum[NR]
print "Line: " NR-1, line[NR-1]
#print "Treffer Name Datei1: " NR-1, lineDatei[NR-1]
TREFFER = lineDatei[NR-1]
print TREFFER
suchedatei2()
print "=============="
}
}
function suchedatei2(){
FS=" "
# print "2. datei"
while (getline < DATEI2) {
Zeile[NR]=$0
ZeileDateiID[NR]=$2
ZeileDateiName[NR]=$3
suche2=match($0, TREFFER)
if (suche2){
#print "Komplette Zeile: "Zeile[NR]
print "DateiID: "ZeileDateiID[NR]
print "DateiName: "ZeileDateiName[NR]
}
}
close (DATEI2)
}
gruß michael
habe es noch etwas angepasst.
das aktuelle datum wird ermittelt, und zum suchen wird dann der vormonat genommen.
gruß michael
das aktuelle datum wird ermittelt, und zum suchen wird dann der vormonat genommen.
#! /usr/bin/awk -f
##
## bitte gawk installieren
##
BEGIN {
print "Anzahl Argumente in ARGC : " , ARGC-1
if(ARGC-1 < 2){
print "Bitte 2 dateien angeben"
exit 1
}
DATEI1=ARGV[1]
DATEI2=ARGV[2]
#print DATEI1
#print DATEI2
MONAT = strftime ("%m")
TAG = strftime ("%d")
VORMONAT = strftime ("%m")-1
if (length(VORMONAT) == 1){
VORMONAT = 0VORMONAT
}
#print MONAT, TAG, VORMONAT
print "________________"
}
# HauptPRG
{
suchedatei1()
}
END {
print "ende des scripts"
}
function suchedatei1(){
FS=" "
line[NR]=$0
lineDatum[NR]=$1
lineDatei[NR]=$3
#suche1=match($0, "03/08")
suche1=match($0, VORMONAT"/")
if(suche1){
print "Treffer Datum: " NR, lineDatum[NR]
#print "Line: " NR-1, line[NR-1]
#print "Treffer Name Datei1: " NR-1, lineDatei[NR-1]
TREFFER = lineDatei[NR-1]
print TREFFER
suchedatei2()
print "=============="
}
}
function suchedatei2(){
FS=" "
# print "2. datei"
while (getline < DATEI2) {
Zeile[NR]=$0
ZeileDateiID[NR]=$2
ZeileDateiName[NR]=$3
suche2=match($0, TREFFER)
if (suche2){
#print "Komplette Zeile: "Zeile[NR]
print "DateiID: "ZeileDateiID[NR]
print "DateiName: "ZeileDateiName[NR]
}
}
close (DATEI2)
}
gruß michael
hier mein anfang in perl (noch nicht fertig):
es fehlt noch die datums funktion und das prüfen auf die ID.
gruß michael
#!/usr/bin/perl
use strict;
use warnings;
our($quelldatei, @Zeilen, $i, $DATEI1INHALT, $CEP, $CEP2);
our($quelldatei2, @Zeilen2, $i2, $DATEI1INHALT2, $CEP3, $CEP4);
$quelldatei = $ARGV or die 'Bitte Quelldatei angeben!';
open "Q", "<$quelldatei" or die "Datei $quelldatei wurde nicht gefunden";
$quelldatei2 = $ARGV[1] or die 'Bitte Quelldatei2 angeben!';
open "Q2", "<$quelldatei2" or die "Datei $quelldatei2 wurde nicht gefunden";
foreach (<Q>) {
push @Zeilen, $_;
}
foreach (<Q2>) {
push @Zeilen2, $_;
}
for ($i=0; $i<=$#Zeilen; $i++){
if ($Zeilen[$i] =~ /02\//){
$CEP = $i-1;
$CEP2 = $i+1;
print $Zeilen[$CEP]."\n";
print "$Zeilen[$i]\n";
print $Zeilen[$CEP2]."\n";
print "===========================\n";
}
}
print "ist erledigt\n";
es fehlt noch die datums funktion und das prüfen auf die ID.
gruß michael
so hier mit der Datums funktion:
gruß michael
#!/usr/bin/perl
use strict;
use warnings;
our($quelldatei, @Zeilen, $i, $DATEI1INHALT, $CEP, $CEP2);
our($quelldatei2, @Zeilen2, $i2, $DATEI1INHALT2, $CEP3, $CEP4, $vormonat);
## Datum bearbeiten
## 0 1 2 3 4 5 6 7 8
our($sec, $min, $hour, $day, $mon, $year, $wday, $yday, $isdat ) = localtime(time);
# Wenn man nur den Monat braucht:
($mon) = (localtime(time))[4];
$mon+=1;
$mon = $mon < 10 ? $mon = "0".$mon : $mon;
$vormonat = $mon-1;
##
$quelldatei = $ARGV or die 'Bitte Quelldatei angeben!';
open "Q", "<$quelldatei" or die "Datei $quelldatei wurde nicht gefunden";
$quelldatei2 = $ARGV[1] or die 'Bitte Quelldatei2 angeben!';
open "Q2", "<$quelldatei2" or die "Datei $quelldatei2 wurde nicht gefunden";
foreach (<Q>) {
push @Zeilen, $_;
}
foreach (<Q2>) {
push @Zeilen2, $_;
}
for ($i=0; $i<=$#Zeilen; $i++){
if ($Zeilen[$i] =~ /$vormonat\//){
$CEP = $i-1;
$CEP2 = $i+1;
print $Zeilen[$CEP]."\n";
print "$Zeilen[$i]\n";
print $Zeilen[$CEP2]."\n";
print "===========================\n";
}
}
print "ist erledigt\n";
gruß michael
wird zwar nicht mehr benötigt
aber so ist es vollständig:
gruß michael
aber so ist es vollständig:
#!/usr/bin/perl
## ----------------------------------------------------------------------------
## Script Name:
## CreationDate: 29.04.2011
## Last Modified: 02.05.2011
## Copyright: MN (c)2011
## Purpose: zeilenweise einlesen von textdateien in ein arry: (Drucker Queue)
## ----------------------------------------------------------------------------
use strict;
use warnings;
our($quelldatei, @Zeilen, $i, $DATEI1INHALT, $CEP1, $CEP2, $T, @L, $L);
our($quelldatei2, @Zeilen2, $i2, $DATEI1INHALT2, $CEP3, $CEP4, $vormonat);
our($L1, $L2, $L3, $L4, $L5, $L6);
our($L_1, $L_2, $L_3, $L_4, $L_5, $L_6);
sub DATUM {
## Datum bearbeiten
## 0 1 2 3 4 5 6 7 8
our($sec, $min, $hour, $day, $mon, $year, $wday, $yday, $isdat ) = localtime(time);
# Wenn man nur den Monat braucht:
($mon) = (localtime(time))[4];
$mon+=1;
$mon = $mon < 10 ? $mon = "0".$mon : $mon;
$vormonat = $mon-1;
##
return $mon;
}
DATUM;
$quelldatei = $ARGV or die 'Bitte Quelldatei angeben!';
open "Q", "<$quelldatei" or die "Datei $quelldatei wurde nicht gefunden";
$quelldatei2 = $ARGV[1] or die 'Bitte Quelldatei2 angeben!';
open "Q2", "<$quelldatei2" or die "Datei $quelldatei2 wurde nicht gefunden";
foreach (<Q>) {
push @Zeilen, $_;
}
foreach (<Q2>) {
push @Zeilen2, $_;
}
for ($i=0; $i<=$#Zeilen; $i++){
if ($Zeilen[$i] =~ /$vormonat\//){
$CEP1 = $i-1;
$T = $Zeilen[$CEP1];
$CEP2 = $i+1;
print $Zeilen[$CEP1]."\n";
print "$Zeilen[$i]\n";
print $Zeilen[$CEP2]."\n";
print "===========================\n";
($L1,$L2,$L3,$L4,$L5,$L6) = split( /\s+/, $T);
for ($i2=0; $i2<=$#Zeilen2; $i2++){
if ($Zeilen2[$i2] =~ /$L4/){
($L_1,$L_2,$L_3,$L_4,$L_5,$L_6) = split( /\s+/, $Zeilen2[$i2]);
print "ID: ".$L_3. "\n";
}
}
}
}
print "ist erledigt\n";