我有这样一个日志:
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