2015-08-06 2 views
-1

При запуске скрипта проверки, я получаю о/р, как показано ниже,Как я могу сортировать вывод из awk-скрипта?

-rw-rw-r-- 1 noper sbcprd 9175 Aug 6 03:36 opLogDir  
-rw-rw-r-- 1 soper sbcprd 9104 Aug 6 03:04 opLogDir  
-rw-rw-r-- 1 moper sbcprd 9561 Aug 6 02:18 opLogDir  
-rw-rw-r-- 1 woper sbcprd 9561 Aug 6 05:06 opLogDir  
-rw-rw-r-- 1 boper sbcprd 9834 Aug 6 03:34 opLogDir  
-rw-rw-r-- 1 xoper sbcprd 9873 Aug 6 00:50 opLogDir 
-rw-rw-r-- 1 doper sbcprd 9479 Aug 6 04:12 opLogDir 

Теперь я могу выбрать из него данные и сортировать с помощью:

check | awk '{print $3,$8,$6,$7}'| sort 

и получить о/р, как показано ниже ,

boper 03:34 Aug 6 
doper 04:12 Aug 6 
moper 02:18 Aug 6 
noper 03:36 Aug 6 
soper 03:04 Aug 6 
woper 05:06 Aug 6 
xoper 00:50 Aug 6 

Сортирует o/p по столбцу # 1.

Как я могу сортировать o/p в соответствии с таймингами (столбец № 2)?

+0

следует отметить, если дата может отличаться или нет? В вашем примере все они «6 августа». ИМО, это будет важной информацией для решений. – Kent

+1

Что такое 'check'? Потому что, если это просто 'ls', вам лучше полагаться на его параметры вместо анализа его вывода. Например, 'ls -lt' будет сортироваться на основе времени модификации. – fedorqui

+0

Ваш вопрос вопроса, т.е. очень вводящий в заблуждение - вы спрашиваете, как сортировать текст по 2-й колонке, а не как сортировать с помощью awk. Тот факт, что текст был создан из awk-скрипта, совершенно не имеет значения. –

ответ

2

Используйте команду sort. sort -k 2

Хотя, учитывая это выглядит как ls выхода, вероятно, можно изменить check иметь ls -lt сортировать по временным меткам вместо этого.

Если вам требуется нечто более обширное (например, это сортировка по дате и времени), то это сложнее - вам нужно будет использовать что-то, что может анализировать временную метку во время unix.

т.д .:

#!/usr/bin/env perl 
use strict; 
use warnings; 
use Time::Piece; 

my $year = Time::Piece->localtime -> year; 

for (<DATA>) { 
    my ($mon, $day, $time) = (split)[5,6,7]; 
    my $timestamp = Time::Piece->strptime("$mon $day $time $year", '%b %d %H:%M %Y'); 
    print $timestamp -> epoch,"\n"; 
} 

__DATA__ 
-rw-rw-r-- 1 noper sbcprd 9175 Aug 6 03:36 opLogDir  
-rw-rw-r-- 1 soper sbcprd 9104 Aug 6 03:04 opLogDir  
-rw-rw-r-- 1 moper sbcprd 9561 Aug 6 02:18 opLogDir  
-rw-rw-r-- 1 woper sbcprd 9561 Aug 6 05:06 opLogDir  
-rw-rw-r-- 1 boper sbcprd 9834 Aug 6 03:34 opLogDir  
-rw-rw-r-- 1 xoper sbcprd 9873 Aug 6 00:50 opLogDir 
-rw-rw-r-- 1 doper sbcprd 9479 Aug 6 04:12 opLogDir 

Или с сортировочной логики, построенной междунар:

#!/usr/bin/env perl 
use strict; 
use warnings; 
use Time::Piece; 

my $year = Time::Piece->localtime -> year; 

sub sort_by_timestamp { 
    my ($amon, $aday, $atime) = (split(" ", $a))[5,6,7]; 
    my ($bmon, $bday, $btime) = (split(" ", $b))[5,6,7]; 
    my $at = Time::Piece->strptime("$amon $aday $atime $year", '%b %d %H:%M %Y'); 
    my $bt = Time::Piece->strptime("$bmon $bday $btime $year", '%b %d %H:%M %Y'); 

    return $at <=> $bt; 
} 


print sort { sort_by_timestamp } <DATA>; 

__DATA__ 
-rw-rw-r-- 1 noper sbcprd 9175 Aug 6 03:36 opLogDir  
-rw-rw-r-- 1 soper sbcprd 9104 Aug 6 03:04 opLogDir  
-rw-rw-r-- 1 moper sbcprd 9561 Aug 6 02:18 opLogDir  
-rw-rw-r-- 1 woper sbcprd 9561 Aug 6 05:06 opLogDir  
-rw-rw-r-- 1 boper sbcprd 9834 Aug 6 03:34 opLogDir  
-rw-rw-r-- 1 xoper sbcprd 9873 Aug 6 00:50 opLogDir 
-rw-rw-r-- 1 doper sbcprd 9479 Aug 6 04:12 opLogDir 

Примечание - по понятным причинам, это не будет работать очень хорошо, когда вы охватывают год.

+0

Спасибо, Sobrique. Это сработало. – PRK

0

Если вы не знаете, -k вариант, вы можете сделать это, поместив $8 в первую очередь:

awk '{print $8,$3,$6,$7}' 
+0

Это тоже сработало. Спасибо вам, что вы тоже! – PRK

Смежные вопросы