Как я могу извлечь pdf имена из файла журнала lftp?

У меня есть такой журнал:

2016-05-11 07:09:54 ftp://test@test.dyndns.info/test1/fool/1999/How/05%20May/test160511.pdf -> /test/keep/more/use/05/test160511.pdf 0-28442281 33.5 KiB/s

Мне нужно извлечь только «test160511.pdf» и поместить в отдельный файл журнала.

Это возможно?

2
задан 11 May 2016 в 11:15

3 ответа

В остроте Python:

python3 -c '[print(p+".pdf") for p in [s.split(".pdf")[0] for s in open("logfile").read().split("/") if ".pdf" in s]]'

где "logfile" путь к Вашему файлу журнала, между двойными кавычками. Пример, с помощью входа вопроса, где /home/jacob/Bureaublad/pd.txt мой файл журнала:

$ python3 -c '[print(p+".pdf") for p in [s.split(".pdf")[0] for s in open("/home/jacob/Bureaublad/pd.txt").read().split("/") if "pdf" in s]]'
test160511.pdf
test160511.pdf

Объяснение

Команда:

  • разделяет содержание файла dellimeter / (наклонная черта):

    open("logfile").read().split("/") 
    

    и ищет разделы, содержащие pdf:

    for s in open("/home/jacob/Bureaublad/pd.txt").read().split("/") if "pdf" in s
    
  • Впоследствии, это разделяет найденные строки dellimeter .pdf, и сохраняет первый раздел, который является разделом между / и pdf.

  • впоследствии, расширение добавляется:

    print(p+".pdf")
    

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

Только уникальные имена файлов?

Если Вы не хотите повторять имена файлов с несколькими случаями:

python3 -c '[print(p+".pdf") for p in set([s.split(".pdf")[0] for s in open("logfile").read().split("/") if "pdf" in s])]'

От того же примера:

$ python3 -c '[print(p+".pdf") for p in set([s.split(".pdf")[0] for s in open("/home/jacob/Bureaublad/pd.txt").read().split("/") if "pdf" in s])]'
test160511.pdf
1
ответ дан 11 May 2016 в 21:15

Другой grep решение (file содержит пример от Вашего вопроса):

$ grep -oP '/\K[^/]+\.pdf' file
test160511.pdf
test160511.pdf

Для уникальных имен только:

$ grep -oP '/\K[^/]+\.pdf' file | sort -u
test160511.pdf

Объяснение

  • -o : распечатайте только подобранную часть строки.
  • -P : используйте Perl совместимые регулярные выражения (PCRE)
  • /\K[^/]+\.pdf : соответствие a / и затем отбросьте его (это что \K делает, этот путь / не включен в вывод). Затем соответствуйте одному или нескольким не -/ символы ([^/]+), сопровождаемый .pdf. . означает "любой символ" в регулярных выражениях, так соответствовать литералу ., необходимо выйти из него: \.
  • sort -u : только распечатайте уникальные строки.
3
ответ дан 11 May 2016 в 21:15

Используя grep с PCRE (-P):

grep -Po '.*/\K[^\s]+(?=\s+->)'

Пример:

$ grep -Po '.*/\K[^\s]+(?=\s+->)' <<<'2016-05-11 07:09:54 ftp://test@test.dyndns.info/test1/fool/1999/How/05%20May/test160511.pdf -> /test/keep/more/use/05/test160511.pdf 0-28442281 33.5 KiB/s'
test160511.pdf
<час>

Или sed:

sed -r 's#.*/([^[:blank:]]+)[[:blank:]]+->.*#\1#'

Пример:

$ sed -nr 's#.*/([^[:blank:]]+)[[:blank:]]+->.*#\1#p' <<<'2016-05-11 07:09:54 ftp://test@test.dyndns.info/test1/fool/1999/How/05%20May/test160511.pdf -> /test/keep/more/use/05/test160511.pdf 0-28442281 33.5 KiB/s'
test160511.pdf
<час>

можно сохранить вывод с помощью оператора > перенаправления вывода:

grep .... >/where/to/save.log

Так в этом случае:

grep -Po '.*/\K[^\s]+(?=\s+->)' <<<'your_string' >output.log

можно использовать промежуточную переменную также:

temp=$(grep -Po '.*/\K[^\s]+(?=\s+->)' <<<'your_string')

и затем сохраните:

echo "$temp" >output.log
0
ответ дан 11 May 2016 в 21:15
  • 1
    Вы могли вдаваться в подробности о том, как я мог сделать это? Спасибо. – Simon 23 October 2017 в 16:12

Другие вопросы по тегам:

Похожие вопросы: