Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Mit awk Variablen und Array setzen

Frage Linux

Mitglied: Alucard7

Alucard7 (Level 1) - Jetzt verbinden

15.04.2011, aktualisiert 15:16 Uhr, 4943 Aufrufe, 14 Kommentare

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 ;)

Mit freundlichen Grüßen Alucard7
Mitglied: micneu
19.04.2011 um 11:46 Uhr
hier das habe ich mal in ksh bei mir getsetet auf einem debian 6

01.
date "+%m %Y" | awk '{ cm=$1; cy=$2; print cy " " cm}'
nur verstehe ich noch nicht was genau das ziel sein soll?
was soll das ergebnis liefern?
welche informationen, was willst du damit machen?

Gruß michael
Bitte warten ..
Mitglied: Alucard7
19.04.2011 um 20:14 Uhr
Hi micneu,

um es ein bisschen aufzuklären:
Ich will ein script schreiben, das anhand des Datums Einträge findet, die gelöscht werden sollen.
Dabei handelt es sich um Druckaufträge in einer Warteschlange, das aber nur so nebenbei.
Das Problem an diesem Ansatz ist, die Variablen aus awk heraus zu kriegen. Diese sollen später nämlich in der Form "| grep "(cm\..\cy)" ..." verwendet werden, um die angesprochenen Einträge zu finden.
Im späteren Verlauf muss ich auch leider mehrere Einträge der Warteschlange vergleichen und die richtigen ID's, die zum löschen benötigt werden, heraus filtern, wieder in Variablen.
Hier wollte ich zudem mit Arrays arbeiten, da das die schickste Variante ist(schön wäre: " awk '{array[$1]=$2}' ". Problem entsteht durch die Ausgabe der Einträge in mehreren Zeilen:
Bsp.:
datum name rank ...
04\12\11 test.print 123 ...
status id ...
queued 345678 ....

=> weitere Ausgabe in anderem Format um ID und RTank zu verbinden, da ID und Rank/datum nie in einer Zeile stehen
queued 345678 test.print 123 ....

Am Ende soll dann einem Array auf den Index(Rank) die ID gelegt werden => delete ${array[123]}

Ich hoffe ich konnte es etwas verständlicher machen, ich sehe aber wenig Möglichkeiten, dass Array aus awk herauszubekommen.

Mit freundlichen Grüßen Alucard7
Bitte warten ..
Mitglied: micneu
20.04.2011 um 09:51 Uhr
du kannst eigentlich das ganze in awk ausführen.
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
Bitte warten ..
Mitglied: Alucard7
20.04.2011 um 11:52 Uhr
Hi,
könntest du das ein bisschen konkreter beschreiben?
Ich verstehe nicht ganz wie ich das praktisch verwenden kann.

Zudem ist die ksh, zumindest die von AIX, Array fähig, habe ich schon mehrfach getestet.

Mit freundlichen Grüßen Alucard7
Bitte warten ..
Mitglied: micneu
20.04.2011 um 13:47 Uhr
schau mal bitte in dein pm rein

gruß michael
Bitte warten ..
Mitglied: micneu
26.04.2011 um 09:12 Uhr
Guten Morgen,

hier habe erstmal ein kleinen zwischen stand.

01.
#! /usr/bin/awk -f 
02.
BEGIN { 
03.
	print "Anzahl Argumente in ARGC : " , ARGC-1 
04.
	if(ARGC-1 < 2){ 
05.
		print "Bitte 2 dateien angeben" 
06.
		exit 1 
07.
08.
	DATEI1=ARGV[1] 
09.
	DATEI2=ARGV[2] 
10.
	#print DATEI1 
11.
	#print DATEI2 
12.
	print "________________" 
13.
14.
# HauptPRG 
15.
16.
	suchedatei1() 
17.
 
18.
19.
END { 
20.
	close (DATEI2) 
21.
	print "ende des scripts" 
22.
23.
function suchedatei1(){ 
24.
    FS=" " 
25.
    	line[NR]=$0 
26.
    	lineDatum[NR]=$1 
27.
    	lineDatei[NR]=$3 
28.
        suche1=match($0, "02/22") 
29.
        if(suche1){ 
30.
        	print "Treffer Datum: " NR, lineDatum[NR]  
31.
            print "Line: " NR-1, line[NR-1] 
32.
            #print "Treffer Name Datei1: " NR-1, lineDatei[NR-1] 
33.
            TREFFER = lineDatei[NR-1] 
34.
            print TREFFER 
35.
			suchedatei2() 
36.
            print "==============" 
37.
38.
		 
39.
40.
function suchedatei2(){ 
41.
	FS=" " 
42.
#	print "2. datei" 
43.
	while (getline < DATEI2) { 
44.
		Zeile[NR]=$0 
45.
		ZeileDateiID[NR]=$2 
46.
		ZeileDateiName[NR]=$3 
47.
		suche2=match($0, TREFFER) 
48.
		if (suche2){ 
49.
			#print "Komplette Zeile: "Zeile[NR] 
50.
			print "DateiID: "ZeileDateiID[NR] 
51.
			print "DateiName: "ZeileDateiName[NR] 
52.
53.
54.
       close (DATEI2) 
55.
56.
 
gruß michael
Bitte warten ..
Mitglied: micneu
26.04.2011 um 10:31 Uhr
habe es noch etwas angepasst.
das aktuelle datum wird ermittelt, und zum suchen wird dann der vormonat genommen.

01.
#! /usr/bin/awk -f 
02.
## 
03.
## bitte gawk installieren 
04.
## 
05.
BEGIN { 
06.
	print "Anzahl Argumente in ARGC : " , ARGC-1 
07.
	if(ARGC-1 < 2){ 
08.
		print "Bitte 2 dateien angeben" 
09.
		exit 1 
10.
11.
	DATEI1=ARGV[1] 
12.
	DATEI2=ARGV[2] 
13.
	#print DATEI1 
14.
	#print DATEI2 
15.
	MONAT = strftime ("%m") 
16.
	TAG = strftime ("%d") 
17.
	VORMONAT = strftime ("%m")-1  
18.
	if (length(VORMONAT) == 1){ 
19.
		VORMONAT = 0VORMONAT 
20.
21.
	#print MONAT, TAG, VORMONAT 
22.
	print "________________" 
23.
24.
# HauptPRG 
25.
26.
	suchedatei1() 
27.
 
28.
29.
END { 
30.
	print "ende des scripts" 
31.
32.
function suchedatei1(){ 
33.
    FS=" " 
34.
   	line[NR]=$0 
35.
   	lineDatum[NR]=$1 
36.
   	lineDatei[NR]=$3 
37.
    #suche1=match($0, "03/08") 
38.
    suche1=match($0, VORMONAT"/") 
39.
    if(suche1){ 
40.
       	print "Treffer Datum: " NR, lineDatum[NR]  
41.
        #print "Line: " NR-1, line[NR-1] 
42.
        #print "Treffer Name Datei1: " NR-1, lineDatei[NR-1] 
43.
        TREFFER = lineDatei[NR-1] 
44.
        print TREFFER 
45.
		suchedatei2() 
46.
        print "==============" 
47.
48.
49.
function suchedatei2(){ 
50.
	FS=" " 
51.
#	print "2. datei" 
52.
	while (getline < DATEI2) { 
53.
		Zeile[NR]=$0 
54.
		ZeileDateiID[NR]=$2 
55.
		ZeileDateiName[NR]=$3 
56.
		suche2=match($0, TREFFER) 
57.
		if (suche2){ 
58.
			#print "Komplette Zeile: "Zeile[NR] 
59.
			print "DateiID: "ZeileDateiID[NR] 
60.
			print "DateiName: "ZeileDateiName[NR] 
61.
62.
63.
	close (DATEI2) 
64.
}
gruß michael
Bitte warten ..
Mitglied: Alucard7
26.04.2011 um 19:08 Uhr
Hi michael,

Vielen Dank für die schnelle Antwort.
Sobald ich Zeit habe morgen, werde ich mir das genauer ansehen und testen ;)

Mit freundlichen Grüßen Alucard7
Bitte warten ..
Mitglied: Alucard7
27.04.2011 um 17:10 Uhr
Hi michael,

ich hab dein Script mal ein bisschen durchgetestet, musste aber leider feststellen, dass in meiner Shell nicht alles so einfach geht:

Da mir nur awk und nicht gawk zur Verfügung steht und der Verwaltungstechnische Aufwand dafür zu groß ist, musss ich auf diese Zeit Funktion verzichten.
Zudem besteht das Porblem, dass ich bei:
line[NR]=$0 lineDatum[NR]=$1 lineDatei[NR]=$3;
auch wieder die mehrfachzeilen erhalte: 1 Eintrag besteht ja aus 3 Zeilen, wovon jedes z.B. 3 Feld dann in einer Ausgabe ausgegeben wird.

Aus diesen Gründen ist mein Ansatz, die Datumsberechnung im normalen Script zu halten und die einzelnen Zeilen mit grep herauszufiltern.
Diese Ausgabe dann in Dateien umleiten und wieder filtern und umleiten.
Am Ende dann die Ergebnisse auslesen und verabreiten, was soweit ganz gut funktioniert, wenn auch nicht so toll aussieht ;) :
01.
cm=`date '+%m'` 
02.
cy=`date '+%y'` 
03.
 
04.
pruef=`echo $cm | sed 's/.$//'` 
05.
if [[ "$pruef" = "0" ]]; then 
06.
  if [[ "$cm" = "01" ]]; then 
07.
    km=12; 
08.
    ky=`expr $cy -1 `; 
09.
  else 
10.
    zwm=`echo $cm | sed 's/^.//'`; 
11.
    km=`expr $zwm - 1`; 
12.
    km=0$km; 
13.
    ky=$cy; 
14.
  fi 
15.
else 
16.
  if [[ "$pruef" = "10" ]]; then 
17.
    km=09; 
18.
    ky=$cy; 
19.
  else 
20.
    km=`expr $cm - 1`; 
21.
    ky=$cy; 
22.
  fi 
23.
fi 
24.
 
25.
ls /pfad | sed 's/.*:\(.*\)\$.*/\1/' | sort | uniq >> pqs 
26.
 
27.
for i in `cat pqs`; do 
28.
  qchk -L -P$i | egrep -i -v "(cm/../cy|km/../ky|queue|/var/spool|down)" | awk 'NR>4{print $3}' >> zwi 
29.
  qchk -W -P$i | awk 'NR>3{print $7,$2}' >> zwi2 
30.
 
31.
  for j in `cat zwi`; do awk -v pru=$j '{if (pru==$1) print $2}' zwi2 >> erg; done 
32.
  for k in `cat erg`; do echo $k; done 
33.
  rm zwi 
34.
  rm zwi2 
35.
  rm erg 
36.
done
Durch einige ungünstige Umstände konnte ich das noch nicht richtig in der Praxis testen, werde ich asap aber nachholen.

Mit freundlichen Grüßen Alucard7
Bitte warten ..
Mitglied: micneu
28.04.2011 um 21:27 Uhr
läuft auf deinem server perl?
werde versuchen das ganze mal in perl umzusetzen.
die daten zum testen habe ich ja noch.
oder muss das unbedungt in awk sein?

gruß michael
Bitte warten ..
Mitglied: Alucard7
29.04.2011 um 00:31 Uhr
mit perl hab ich mich bisher ncoh nicht befast, kann nciht genau sagen ob perl vorhanden ist.
Werd aber zeitnah bescheid geben, wies aussieht.
Ich bin immer für andere Lösungsmöglichkeiten offen ;)

Grüße Alucard7
Bitte warten ..
Mitglied: micneu
29.04.2011 um 13:55 Uhr
hier mein anfang in perl (noch nicht fertig):

01.
#!/usr/bin/perl 
02.
use strict; 
03.
use warnings; 
04.
 
05.
our($quelldatei, @Zeilen, $i, $DATEI1INHALT, $CEP, $CEP2); 
06.
our($quelldatei2, @Zeilen2, $i2, $DATEI1INHALT2, $CEP3, $CEP4); 
07.
 
08.
$quelldatei = $ARGV[0] or die 'Bitte Quelldatei angeben!'; 
09.
open "Q", "<$quelldatei" or die "Datei $quelldatei wurde nicht gefunden"; 
10.
 
11.
$quelldatei2 = $ARGV[1] or die 'Bitte Quelldatei2 angeben!'; 
12.
open "Q2", "<$quelldatei2" or die "Datei $quelldatei2 wurde nicht gefunden"; 
13.
 
14.
foreach (<Q>) { 
15.
    push @Zeilen, $_; 
16.
17.
 
18.
foreach (<Q2>) { 
19.
    push @Zeilen2, $_; 
20.
21.
 
22.
for ($i=0; $i<=$#Zeilen; $i++){ 
23.
    if ($Zeilen[$i] =~ /02\//){ 
24.
        $CEP = $i-1; 
25.
        $CEP2 = $i+1; 
26.
        print $Zeilen[$CEP]."\n"; 
27.
        print "$Zeilen[$i]\n"; 
28.
        print $Zeilen[$CEP2]."\n"; 
29.
        print "===========================\n"; 
30.
31.
32.
print "ist erledigt\n"; 
33.
 
es fehlt noch die datums funktion und das prüfen auf die ID.

gruß michael
Bitte warten ..
Mitglied: micneu
29.04.2011 um 14:25 Uhr
so hier mit der Datums funktion:

01.
#!/usr/bin/perl 
02.
use strict; 
03.
use warnings; 
04.
 
05.
our($quelldatei, @Zeilen, $i, $DATEI1INHALT, $CEP, $CEP2); 
06.
our($quelldatei2, @Zeilen2, $i2, $DATEI1INHALT2, $CEP3, $CEP4, $vormonat); 
07.
 
08.
## Datum bearbeiten 
09.
##   0      1     2     3     4     5       6       7     8 
10.
our($sec, $min, $hour, $day, $mon, $year, $wday, $yday, $isdat ) = localtime(time); 
11.
# Wenn man nur den Monat braucht: 
12.
($mon) = (localtime(time))[4]; 
13.
$mon+=1; 
14.
$mon = $mon < 10 ? $mon = "0".$mon : $mon; 
15.
$vormonat = $mon-1; 
16.
## 
17.
 
18.
$quelldatei = $ARGV[0] or die 'Bitte Quelldatei angeben!'; 
19.
open "Q", "<$quelldatei" or die "Datei $quelldatei wurde nicht gefunden"; 
20.
 
21.
$quelldatei2 = $ARGV[1] or die 'Bitte Quelldatei2 angeben!'; 
22.
open "Q2", "<$quelldatei2" or die "Datei $quelldatei2 wurde nicht gefunden"; 
23.
 
24.
foreach (<Q>) { 
25.
    push @Zeilen, $_; 
26.
27.
 
28.
foreach (<Q2>) { 
29.
    push @Zeilen2, $_; 
30.
31.
 
32.
for ($i=0; $i<=$#Zeilen; $i++){ 
33.
    if ($Zeilen[$i] =~ /$vormonat\//){ 
34.
        $CEP = $i-1; 
35.
        $CEP2 = $i+1; 
36.
        print $Zeilen[$CEP]."\n"; 
37.
        print "$Zeilen[$i]\n"; 
38.
        print $Zeilen[$CEP2]."\n"; 
39.
        print "===========================\n"; 
40.
41.
42.
print "ist erledigt\n"; 
43.
 
gruß michael
Bitte warten ..
Mitglied: micneu
02.05.2011 um 11:30 Uhr
wird zwar nicht mehr benötigt
aber so ist es vollständig:

01.
#!/usr/bin/perl 
02.
## ---------------------------------------------------------------------------- 
03.
## Script Name: 	 
04.
## CreationDate: 	29.04.2011 
05.
## Last Modified:	02.05.2011 
06.
## Copyright: 		MN (c)2011 
07.
## Purpose: 			zeilenweise einlesen von textdateien in ein arry: (Drucker Queue) 
08.
## ---------------------------------------------------------------------------- 
09.
use strict; 
10.
use warnings; 
11.
 
12.
our($quelldatei, @Zeilen, $i, $DATEI1INHALT, $CEP1, $CEP2, $T, @L, $L); 
13.
our($quelldatei2, @Zeilen2, $i2, $DATEI1INHALT2, $CEP3, $CEP4, $vormonat); 
14.
our($L1, $L2, $L3, $L4, $L5, $L6); 
15.
our($L_1, $L_2, $L_3, $L_4, $L_5, $L_6); 
16.
 
17.
sub DATUM { 
18.
	## Datum bearbeiten 
19.
	##	 0		1	  2		3	  4		5		6		7	  8 
20.
	our($sec, $min, $hour, $day, $mon, $year, $wday, $yday, $isdat ) = localtime(time); 
21.
	# Wenn man nur den Monat braucht: 
22.
	($mon) = (localtime(time))[4];	 
23.
	$mon+=1; 
24.
	$mon = $mon < 10 ? $mon = "0".$mon : $mon; 
25.
	$vormonat = $mon-1; 
26.
	## 
27.
	return $mon; 
28.
29.
DATUM; 
30.
 
31.
$quelldatei = $ARGV[0] or die 'Bitte Quelldatei angeben!'; 
32.
open "Q", "<$quelldatei" or die "Datei $quelldatei wurde nicht gefunden"; 
33.
 
34.
$quelldatei2 = $ARGV[1] or die 'Bitte Quelldatei2 angeben!'; 
35.
open "Q2", "<$quelldatei2" or die "Datei $quelldatei2 wurde nicht gefunden"; 
36.
 
37.
foreach (<Q>) { 
38.
	push @Zeilen, $_; 
39.
40.
 
41.
 
42.
foreach (<Q2>) { 
43.
	push @Zeilen2, $_; 
44.
45.
 
46.
for ($i=0; $i<=$#Zeilen; $i++){ 
47.
	if ($Zeilen[$i] =~ /$vormonat\//){ 
48.
		$CEP1 = $i-1; 
49.
		$T = $Zeilen[$CEP1]; 
50.
		$CEP2 = $i+1; 
51.
		print $Zeilen[$CEP1]."\n"; 
52.
		print "$Zeilen[$i]\n"; 
53.
		print $Zeilen[$CEP2]."\n"; 
54.
		print "===========================\n"; 
55.
		($L1,$L2,$L3,$L4,$L5,$L6) = split( /\s+/, $T); 
56.
		for ($i2=0; $i2<=$#Zeilen2; $i2++){ 
57.
			if ($Zeilen2[$i2] =~ /$L4/){ 
58.
				($L_1,$L_2,$L_3,$L_4,$L_5,$L_6) = split( /\s+/, $Zeilen2[$i2]); 
59.
				print "ID: ".$L_3. "\n"; 
60.
61.
62.
63.
64.
print "ist erledigt\n"; 
65.
 
gruß michael
Bitte warten ..
Neuester Wissensbeitrag
Ähnliche Inhalte
PHP
gelöst Php regex und Array (5)

Frage von Thomas91 zum Thema PHP ...

C und C++
gelöst Anzahl der Buchstaben in einem String Element Array C++ (3)

Frage von Protected zum Thema C und C ...

Batch & Shell
gelöst Variablen Zusammenbauen 2.0 ( Batch ) (6)

Frage von clragon zum Thema Batch & Shell ...

Batch & Shell
Variable setzen können während timeout (3)

Frage von DontFlameMeITryMyBest zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (33)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...