САС, Получение последнего имени файла - PullRequest
3 голосов
/ 09 ноября 2010

Это проблема САС.

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

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

Я думаю, это было бы так просто. На данный момент, я сделал это в КК, и это почти работает. Но у меня есть проблемы с командами SED в 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 в новый файл? Как это можно сделать максимально просто?

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

Ответы [ 3 ]

2 голосов
/ 09 ноября 2010

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

ls *.log | sort -t, -k2 -n | tail -1
1 голос
/ 20 сентября 2015

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

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

    : * && echo $_
    

    man bash говорит:

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

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

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

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

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

1 голос
/ 09 ноября 2010

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: На самом деле вы также можете избавиться от хвоста, выполнив это в sed:

getLastLineOfLog.sh

#!/bin/bash

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