如何从 lftp 日志文件中提取 pdf 名称?

如何从 lftp 日志文件中提取 pdf 名称?

我有这样一个日志:

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

我只需要提取“test160511.pdf”并放入单独的日志文件。

有可能的?

答案1

grep与 PCRE 一起使用( -P):

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

例子:

$ grep -Po '.*/\K[^\s]+(?=\s+->)' <<<'2016-05-11 07:09:54 ftp://[email protected]/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://[email protected]/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

答案2

另一个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

在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

解释

命令:

  • /按分格符(斜线)分割文件内容:

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

    并查找包含以下内容的部分pdf

    for s in open("/home/jacob/Bureaublad/pd.txt").read().split("/") if "pdf" in s
    
  • 随后,分裂用分格器查找找到的字符串.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

相关内容