Portál AbcLinuxu, 25. dubna 2024 17:08


Dotaz: jak vybrat jen část textu, ne celý řádek

21.4.2014 14:00 nowis
jak vybrat jen část textu, ne celý řádek
Přečteno: 262×
Odpovědět | Admin
Zdravím vás a přeji hezký sváteční den,

chtěl jsem se zeptat, jak provést pomocí regexu výběr určité částu řádku (pro účel uložení do databáze). Vstupní soubor je postfixový maillog. řádky které mě zajímají jsem si pomocí grepu dal do zvláštního souboru. Řádky vypadají takto:

Apr 20 23:14:07 mail postfix/cleanup[7510]: 3FHEXAA40662: warning: header Subject: Monitoring cehosi - Prodej-BYTY (1) from unknown[10.0.0.1]; from=|odesilatel@neco.cz| to=|monitoring@necojineho.cz| proto=ESMTP helo=|ucet.srv.cz|

Jde mi o to, vysekat z toho řádku jen Datum, čas, odesílatele, příjemce a předmět.

Nechci ani tak pomoci s regexy, jako spíše s nástrojem, kterým to provést. U žádného jsem totiž neobjevil, že by výstupem mohl být jen určitá část řádku, vždy zobrazí celý řádek…

Díky
Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

21.4.2014 14:16 potato
Rozbalit Rozbalit vše Re: jak vybrat jen část textu, ne celý řádek
Odpovědět | | Sbalit | Link | Blokovat | Admin
Pokud je ta věc souvislá, stačí nejjednodušší grep -o. To tady asi nebude. Jinak je zapotřebí v sedu/awk/perlu/čemkoli provést nahrazení typu
s/^.*(část1).*(část2)....*$/\1 \2.../
tedy nahrazení celého řádku vybranými částmi.
21.4.2014 14:33 Nowis
Rozbalit Rozbalit vše Re: jak vybrat jen část textu, ne celý řádek
...a bylo by možné ten vybraný kus uložit rovnou ve skriptu do proměnné? Přijde mi zbytečné přepisovat řádky, ale nevím jak na to…

Díky

21.4.2014 16:51 Nowis
Rozbalit Rozbalit vše Re: jak vybrat jen část textu, ne celý řádek
tak nevím, jestli jsem to udělal správně, ale udělal jsem to takto:

predmet=`sed -n '2 s/^.*ubject: \(.*\) from.*;.*$/\1/p' filename`

(ukládá to do proměnné $predmet vybraný text z druhého řádku). Je to velká prasárna?
21.4.2014 17:39 Kriegel
Rozbalit Rozbalit vše Re: jak vybrat jen část textu, ne celý řádek
netuším, co všechno s tím pak hodláš dělat, nicméně bych asi zkusil použít něco sofistikovanějšího, třeba perl...
#!/usr/bin/perl
# perl log_parse.pl /var/log/maillog

use strict;
use warnings;

# $1 month
# $2 day
# $3 time
# $4 subject
# $5 from
# $6 to

while(<>){
	chomp;
	if (/^(.+)\s+(\d+)\s([0-9:]+)\s.*warning: header Subject: (.*) from .*; from=<(.+)> to=<(.*)>/) {
		print  "$1|$2|$3|$5|$6|$4\n";
	}
}

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.