2010-11-09 2 views
2

Это вопрос SED.SED, Получение последнего имени файла

Я работаю в Quartz Composer (Mac OSX) сценарий:

  1. Открыть последний .log из каталога.
  2. Получение последней текстовой строки этого файла и удаление его 24 первых символов.
  3. Показать последней строке каждый раз, когда новый создается внутри последней .log

Я думаю, что это будет так просто. В этот момент я сделал это в КК, и он почти работает. Но у меня есть проблемы с командами СЭД в обоих getFileName.sh и getLastLineOfLog.sh

getFileName.sh

#!/bin/bash 

cd /Users/Me/ 
/bin/echo `ls -tr *.log | tail -1` 

Что мне нужно здесь, чтобы открыть последний .log файл, с этой структурой имен 127.0.0.1, NUMBER.log является секцией NUMBER и содержит 5 цифр. Чем выше число, тем больше файл .log. Теперь он открывает только первый файл .log.

Вы знаете, как писать в SED правильные команды для этого, пожалуйста?

getLastLineOfLog.sh

#!/bin/bash 

/usr/bin/tail -1 /Users/Me/$1 | sed 's/^.\{24\}//' > /Users/Me/$1.log 
echo `/usr/bin/tail -1 /Users/Me/$1.log` 

В этом втором файле, я пытался получить последний файл загруженного .log и эхо его без его 24 первых символов. Он работает, но создает новый .log.log. (и т. д.) каждый раз, когда функция проходит, что я хотел бы избежать.

Нужно ли выводить результаты команд SED в новый файл? Как это можно сделать как можно проще?

Заранее спасибо.

ответ

2

если вы хотите сортировать по имени файла:

ls *.log | sort -t, -k2 -n | tail -1 
+0

Большое спасибо vlabrecque. – Pablo

1

getFileName.sh

#!/bin/bash 

cd /Users/Me/ 
ls -tr *.log | tail -1 

Вам не нужно echo, как echo выводит свои аргументы.

getLastLineOfLog.sh

#!/bin/bash 

/usr/bin/tail -1 /Users/Me/$1 | sed 's/^.\{24\}//' 

Точно так же здесь, у вас уже есть только последняя строка, так что вам не нужен другой tail.

EDIT: На самом деле вы можете избавиться от хвоста, а, делая это в СЭД:

getLastLineOfLog.ш

#!/bin/bash 

sed -ne'$s/^.\{24\}//p' /Users/Me/$1 
+0

ls -tr будет сортировать по времени изменения, а не по имени файла. –

+0

Сделайте 'ls -rtl', чтобы проверить, что время модификации; Я думаю, они не соответствуют порядку имени файла. –

+0

Привет, Дуглас, спасибо за ваш ответ. Но теперь в первом случае он работает как раньше, загружая первый, а не последний файл. То есть У меня 127.0.0.1,50454.log и 127.0.0.1,50604.log, и он открывает первый. Мне нужно открыть последний .log-файл. Вы знаете, как организовать команды SED для открытия последних файлов .log? Еще раз спасибо. – Pablo

1

Я знаю, что это очень старый вопрос, но здесь есть два способа получить последний файл в Баш только так и без труб :

  • Первый метод:

    : * && echo $_ 
    

    man bash говорит:

    $_ расширяется до последнего аргумента предыдущей команды, после расширения.

    Так вот, необходимо выполнить команду : (ничего не делает) со всеми файлами в качестве аргументов, а затем вы получаете последний из них с $_.

  • Второй метод:

    for lastfile in *; do : ; done 
    echo "$lastfile" 
    

    Таким образом, вы не делаете ничего, но назначение каждого файла в lastfile так, в конце концов, вы будете иметь последний файл (по алфавиту говорить), сохраненную в lastfile.

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