hjälp med ash och/eller awk

Här diskuterar vi skal, kommandon och klassiska linuxverktyg.
Användarvisningsbild
per9000
Inlägg: 931
Blev medlem: 07 maj 2007, 11:06
OS: Ubuntu
Utgåva: 23.04 Lunar Lobster
Ort: Västerås
Kontakt:

hjälp med ash och/eller awk

Inlägg av per9000 »

Hej Kära Ubuntu-forumet,

jag sitter och analyserar en log-fil och vill bygga om den lite. Jag sitter i en BusyBox-miljö och har inte Python, Perl eller ens en kompilator för den hårdvara jag sitter på. Å andra sidan har jag grep, awk och ash så jag borde klara mig bra.

Jag vill stycka log-filen till fler mindre filer för att lättare titta på dem. Jag har börjat med grep för att plocka ut de rader jag är intresserad av från log-filen. Raderna innehåller något av orden Input, Action eller State med mellanslag o kolon före o efter.

Kod: Markera allt

grep "\:\ Input\:\ \|\:\ Action\:\ \|\:\ State\:\ " LOGFILE
Nu ser raderna ut på detta sätt:

Kod: Markera allt

20100330 20:08:35  2 ModulABC-123: Input: bla bla bla1
20100330 20:08:35  3 ModulABC-123: Action: bla bla bla2
20100330 20:08:35  3 ModulABC-123: State: bla bla bla3
20100330 20:08:35  2 ModulY: Input: bla bla bla4
20100330 20:08:35  3 ModulY: Action: bla bla bla5
20100330 20:08:35  3 ModulY: State: bla bla bla6
20100330 20:08:35  2 ModulY: Input: bla bla bla7
20100330 20:08:35  3 ModulY: Action: bla bla bla8
Det jag vill är att raderna med ModulABC-123 kommer till filen LOGFILE-ModulABC-123.log och raderna med ModulY i LOGFILE-ModulY.log och jag tror att detta borde gå med ash och eller awk.

Tacksam för all hjälp.

/Per
--
Per Erik Strandberg
Yet Another IT Consultant
Användarvisningsbild
Osprey
Inlägg: 6310
Blev medlem: 06 apr 2008, 00:09
OS: Ubuntu
Ort: Göteborg/Mölndal/Falkenberg
Kontakt:

Re: hjälp med ash och/eller awk

Inlägg av Osprey »

per9000 skrev:Det jag vill är att raderna med ModulABC-123 kommer till filen LOGFILE-ModulABC-123.log och raderna med ModulY i LOGFILE-ModulY.log och jag tror att detta borde gå med ash och eller awk.
Visst går det väl att fixa med awk, men varför använder du inte grep för det också..?
Agera genom att ta och behålla initiativet, ta de risker detta kräver...
http://www.enargo.com/it/
OpenVMS Shark - i Linux finns inte SYS$CMKRNL...
Användarvisningsbild
per9000
Inlägg: 931
Blev medlem: 07 maj 2007, 11:06
OS: Ubuntu
Utgåva: 23.04 Lunar Lobster
Ort: Västerås
Kontakt:

Re: hjälp med ash och/eller awk

Inlägg av per9000 »

Jag använder gärna grep för det också, men jag har väl advanced beginner skills i grep. Alla tips emottages tacksamt.

Anyway, detta funkar men ger mig filnamn med kolon i

Kod: Markera allt

grep "\:\ Input\:\ \|\:\ Action\:\ \|\:\ State\:\ " LOGFILE | head -n 10 | awk -F " " '{ print $0  > "output_"$4".log" }'
Så nu borde jag bara polera bort det.

/Per
--
Per Erik Strandberg
Yet Another IT Consultant
Användarvisningsbild
per9000
Inlägg: 931
Blev medlem: 07 maj 2007, 11:06
OS: Ubuntu
Utgåva: 23.04 Lunar Lobster
Ort: Västerås
Kontakt:

Re: hjälp med ash och/eller awk

Inlägg av per9000 »

Allt snyggare än detta mottages tacksamt :)

Kod: Markera allt

grep "\:\ Input\:\ \|\:\ Action\:\ \|\:\ State\:\ " LOGFILE | awk -F " " '{ print $0  > "output_"substr($4,0,length($4)-1)".log" }'
I princip är det tre saker
* grep plockar fram de rader jag vill ha
* awk plockar ut hela strängen i position 4, men plockar ut substrängen utan sista tecknet
* printa hela raden till filen output_NAMN.log

Per är glad!
--
Per Erik Strandberg
Yet Another IT Consultant
Användarvisningsbild
uppsalanet
Fadder
Inlägg: 257
Blev medlem: 29 sep 2008, 22:05
OS: Ubuntu
Utgåva: 24.04 Noble Numbat LTS
Ort: Uppsala

Re: hjälp med ash och/eller awk

Inlägg av uppsalanet »

Kod: Markera allt

for i in `ls tt.log`; do
cat $i|grep "ModulY" $i >> 1.txt
cat $i|grep "123" $i >> 2.txt
done
//Fredrik
Senast redigerad av 2 uppsalanet, redigerad totalt 31 gång.
Användarvisningsbild
Osprey
Inlägg: 6310
Blev medlem: 06 apr 2008, 00:09
OS: Ubuntu
Ort: Göteborg/Mölndal/Falkenberg
Kontakt:

Re: hjälp med ash och/eller awk

Inlägg av Osprey »

Det är väl snyggt så som det är! :)

En annan variant är att plocka bort kolonet med split, men om det är snyggare eller inte är ju ganska subjektivt...
Agera genom att ta och behålla initiativet, ta de risker detta kräver...
http://www.enargo.com/it/
OpenVMS Shark - i Linux finns inte SYS$CMKRNL...
Användarvisningsbild
uppsalanet
Fadder
Inlägg: 257
Blev medlem: 29 sep 2008, 22:05
OS: Ubuntu
Utgåva: 24.04 Noble Numbat LTS
Ort: Uppsala

Re: hjälp med ash och/eller awk

Inlägg av uppsalanet »

Jo det är det är nog snyggare som det var...

Du kan nog använda awk hela vägen om du vill. If-else fungerar super i awk när du delat upp strängen i $.
Skicka med en del av orginal loggen sp blir det lättare att titta på problemet.
//Fredrik
Användarvisningsbild
per9000
Inlägg: 931
Blev medlem: 07 maj 2007, 11:06
OS: Ubuntu
Utgåva: 23.04 Lunar Lobster
Ort: Västerås
Kontakt:

Re: hjälp med ash och/eller awk

Inlägg av per9000 »

Mitt problem är dels att jag inte vet namnen på alla olika moduler i kolumn 4, dvs. det är olika i olika loggar och nya kan tillkomma, så jag kan inte bara lista dem som du föreslår Fredrik, men det hade varit mest läsbart (och som pythonista tycker jag att readability counts så jag hade föredragit din lösning).

Nu är det testat på målmaskinen och till slut lyckades jag få in $1 istället för ett hårdkodad filnamn. Dessutom fick jag smaka på filändelser i windows och att det är beskt (^M någon?). Resultatet blev...

Kod: Markera allt

#!/bin/sh
grep "\:\ Input\:\ \|\:\ Action\:\ \|\:\ State\:\ " $1 | awk -F " " '{ print $0  >> "output_"substr($4,0,length($4)-1)".log" }'
Kanske läge att köpa en AWK bok - någon som smakat på http://oreilly.com/catalog/9781565922259 ?

/Per
--
Per Erik Strandberg
Yet Another IT Consultant
Användarvisningsbild
per9000
Inlägg: 931
Blev medlem: 07 maj 2007, 11:06
OS: Ubuntu
Utgåva: 23.04 Lunar Lobster
Ort: Västerås
Kontakt:

[LÖST] Re: hjälp med ash och/eller awk

Inlägg av per9000 »

löst
--
Per Erik Strandberg
Yet Another IT Consultant
Användarvisningsbild
Osprey
Inlägg: 6310
Blev medlem: 06 apr 2008, 00:09
OS: Ubuntu
Ort: Göteborg/Mölndal/Falkenberg
Kontakt:

Re: hjälp med ash och/eller awk

Inlägg av Osprey »

Fördelen du kan få med split istället för substr är att den tar namnet före kolonet, oavsett om kolonet är följt av något annat. Så på så sätt blir du inte beroende av att det bara är ett enda sista tecken, men å andra sidan så är din lösning (ett steg) kompaktare... :)
Agera genom att ta och behålla initiativet, ta de risker detta kräver...
http://www.enargo.com/it/
OpenVMS Shark - i Linux finns inte SYS$CMKRNL...
Användarvisningsbild
uppsalanet
Fadder
Inlägg: 257
Blev medlem: 29 sep 2008, 22:05
OS: Ubuntu
Utgåva: 24.04 Noble Numbat LTS
Ort: Uppsala

Re: hjälp med ash och/eller awk

Inlägg av uppsalanet »

Sista inlägget för mig innan jag släpper dig :)
awk -v för att läsa in variablar till awk sedan har du en *.ini fil som du administrerar vad du vill söka efter.
//Fredrik
Användarvisningsbild
per9000
Inlägg: 931
Blev medlem: 07 maj 2007, 11:06
OS: Ubuntu
Utgåva: 23.04 Lunar Lobster
Ort: Västerås
Kontakt:

Re: hjälp med ash och/eller awk

Inlägg av per9000 »

uppsalanet skrev:[...] awk -v för att läsa in variablar till awk [...]
Jag satt och tittade i Unix in a nutshell's* kapitel om awk och såg precis det du tipsar om awk -v filename=$1 som hade varit snyggt när det gäller filerna jag ska skriva till. Så jag tackar för tipset!

/Per

* Den är kanon! Se http://oreilly.com/catalog/9780596100292
--
Per Erik Strandberg
Yet Another IT Consultant
Användarvisningsbild
uppsalanet
Fadder
Inlägg: 257
Blev medlem: 29 sep 2008, 22:05
OS: Ubuntu
Utgåva: 24.04 Noble Numbat LTS
Ort: Uppsala

Re: hjälp med ash och/eller awk

Inlägg av uppsalanet »

Jag har tydligen svårt att släppa detta :) jag skulle nog göra något i stil med detta:

Kod: Markera allt

#!/usr/bin/ksh
#####################################################################################
#	Scriptname: search_log.sh
#
#	Usage:Read ini file words from $READ_INI
#			Search logfile for match $READ_LOGFILE
#			Create new logfile with match $NEW_LOG
#
#
#
#####################################################################################
umask 000

READ_INI="/your/path/to/ini/search_me.ini"
READ_LOGFILE="/your/path/to/search/log/bigfile.log"
NEW_LOG="/your/path/to/new/log/file/parsedLogfile_`date '+%d'`.log"

exec >>$NEW_LOG
exec 2>&1

echo "======================================\n`date`\n" 

cat $READ_INI | while read ini_word; do
	echo "Serching $READ_LOGFILE for \"$ini_word\""
		awk -F " " -v ini_word="$ini_word" '
		 BEGIN { }
		 		{
			 	if ( ini_word == $5 )
			 		{
				 	#Here you will add your special awk statement :-)
				 	{printf "%s\n",$0}
			 		}
		 		}
		 END { }' $READ_LOGFILE >> $NEW_LOG	
	done
Om du vill göra det mer transparent så kan du skriva om det lite.
När du exikverar skriptet, istället för att ange variablarna i skriptet så skicka in dom runtime:

Kod: Markera allt

sh ./search_log.sh "/your/path/to/ini/search_me.ini" "/your/path/to/search/log/bigfile.log"
och i skriptet jobbar med $1 och $2. Men men vad vet jag...

Hälsningar
Fredrik
Skriv svar

Återgå till "Terminalforum"