2016-06-28 2 views
1

Мне часто приходится искать конкретные строки в большом наборе файлов журнала с . И я получаю много результатов, о том, что я должен прокрутить много.Простой способ упорядочить результат grep по времени (обратный)?

Сегодня результаты grep Результаты поиска в алфавитном порядке. Я бы хотел получить мои результаты grep отменить отсортировано по времени, как ls -ltr будет делать.

Я знаю, что могу взять результат ls -ltr и grep файл по файлу. Я делаю это вот так:

ls -ltr ${my_log_dir}\* | awk '{print $9}' |xargs grep ${my_pattern} 

Но мне интересно: есть ли более простой способ?

PS: Я использую ksh на AIX.

+0

@fedorqui, добавил мой фактический *** комплекс *** способ сделать это. Хорошо, это уже просто –

+0

Умм, это сложно. Парсинг - это не очень хорошая идея. Тем не менее, альтернативы, которые приходят мне на ум, это такие вещи, как использование 'find' для печати даты и времени, а затем выполнить' grep' и удалить часть datetime. Немного уродливый. – fedorqui

+0

@fedorqui, если я просто использую 'ls -tr', мне не нужен синтаксический анализ, но' ' xargs' получить все и заказать результаты? –

ответ

2

Решение, которое я нашел (спасибо Федорки), было просто использовать ls -tr. Предполагается, что результаты будут переданы в правильном порядке через | до xargs, что позволит затем сделать grep.

Мое заблуждение состояло в том, что с тех пор, как я нахожусь ls, результаты приходят не как один список столбцов, а как список из нескольких столбцов, он не может работать как вход для xargs.

Вот самое простое решение на сегодняшний день, так как это позволяет избежать какого-либо awk разбора:

ls -tr ${my_log_dir}\* | xargs grep ${my_pattern} 

я проверил, и каждый результат ls -t передается xargs, даже если они не выглядят, как я ожидал, что они будут входить легко в нем:

srv:/papi/tata $ ls -t 
addl  ieet  rrri  
ooij  lllr  sss  
srv:/papi/tata $ ls -t |xargs -I{} echo {} 
addl 
ieet 
rrri  
ooij 
lllr 
sss 
1

Это тоже будет работать использовать find команду: -

find -type f -print0 | xargs -r0 stat -c %y\ %n | sort -r | awk '{print $4}' | sed "s|^\./||" 
  • -print0 в находке для сохранения файлов, содержащих специальные символы (пробелы, табуляции)
  • статус печати файла (stat с %y (время последнего модификация) и %n (% n Имя файла) с выходом, имеющим новое разделение (-c)
  • Обратный сортировать результат предыдущей mmand. (-r для обратного)
  • awk '{print $4}' печати только имя файла (может быть оптимизирована при необходимости)
  • Удаления ведущего ./ из файловых имен.
+0

HI Inian, Спасибо за вашу помощь. Он говорит мне: * find: 0652-017 -print0 не является допустимым вариантом. *. С какой оболочкой/ОС вы работаете? Me it is: ksh/AIX –

+0

Работает отлично на 'find (GNU findutils) 4.4.2. если ваши файлы не имеют специальных символов или пробелов на них, вы также можете попробовать 'find -type f -print | xargs -r stat -c% y \% n | sort -r | awk '{print $ 4}' | sed "s |^\ ./ ||" ', который в основном удаляет флаг' -print0' – Inian

+0

Извините, но я не могу проверить его здесь, на своем компьютере. –

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