Portál AbcLinuxu, 6. listopadu 2025 05:46
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.