У меня есть такой журнал:
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» и поместить в отдельный файл журнала.
Это возможно?
В остроте 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
Другой 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
: только распечатайте уникальные строки. Используя 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