Portál AbcLinuxu, 7. května 2025 22:21
Potřebuji od někoho zkušeného nejjednodužší způsob jak přečíst log.log ve kterém jsou takovéto řádky :
23.05.2013 04:47:15 MJ7HST
24.01.2013 01:23:37 Y02HAL
18.02.2013 03:38:05 RY7HRO
10.04.2013 23:48:43 NL4SNE
01.05.2013 09:47:33 MJ7HST
datum , čas , uživatel (různá délka jména ale žádné mezery)
potřebuji vypsat pouze poslední záznam každého uživatele (filtr posledního logu pro všechny uživatele)
Napadá někoho elegantní řešení (awk , sed nebo kdo ví co na to použít) ?
Děkuju ...
Řešení dotazu:
cat log.log | awk '{print $3";"$1";"$2}' | sort -r
udělá :
GM1GVM;12.02.2012;14:30:14
D1SKY;16.09.2012;23:08:01
DX0ML;15.01.2013;08:08:39
ale jak dál bez dlouhého patlání v IF a pracovních proměnných ?
#/bin/bash function print_last_log() { if [ $USER != $3 ]; then echo $1 $2 $3 USER=$3 fi } sort -k3 -k1.7nr -k1.4nr -k1nr -k2r log.log | \ while read LINE; do print_last_log $LINE done
#!/usr/bin/env perl use strict; use warnings; my %lastlog; open (my $fh,"<","./log.log"); while (<$fh>){ chomp; my ($date, $time, $user) = split " ", $_; $lastlog{$user} = $date." ".$time; } close $fh; print "$_\t$lastlog{$_}\n" foreach (keys %lastlog);
23.05.2013 04:47:15 MJ7HST 23.05.2013 04:47:18 MJ7HST 24.01.2013 01:23:37 Y02HAL 18.02.2013 03:38:05 RY7HRO 10.04.2013 23:48:43 NL4SNE 01.05.2013 09:47:33 MJ7HST 24.01.2013 01:25:37 Y02HAL 26.01.2013 01:25:37 Y02HAL 10.05.2013 23:48:43 NL4SNE
cat log.log | sort -k 3 -rk 1 -k 2 | uniq -s 20Vystup:
26.01.2013 01:25:37 Y02HAL 18.02.2013 03:38:05 RY7HRO 10.05.2013 23:48:43 NL4SNE 23.05.2013 04:47:18 MJ7HST
cat test.txt | sed -r 's/(.+)\.(.+)\.(.+)/\2\.\1\.\3/' | sort -k 3 -rk 1 -k 2 | uniq -s 20Ten sed by mohl byt samozrejme prisnejsi..
Děkuji za nápady , určitě něco použiji .
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.