从文本文件中获取具有随机目录名的有效路径

从文本文件中获取具有随机目录名的有效路径

如何从字符串中获取有效路径?

例如,我有以下文本,file.txt它将始终使用以下模式以随机路径生成:

Some error occurred. rerun the script with "-d" option and check the output and logfile: /tmp/du_resp_16929.

路径/tmp/du_resp_XXXXX末尾有随机数(标记为XXXXX)。获取路径的最佳方法是什么?

我知道如何使用 awk 像下面这样来获取字符串的末尾,但有时路径可能位于中间或开头。

awk ‘{print $(NF)}’ file.txt | sed 's/\.$//' 

输出:

/tmp/du_resp_16929

因此,我认为上述并不是最好的解决方案。

答案1

grep 选项使用-oP正则表达式完成该工作/tmp/du_resp_\d+
其中\d+表示 1 位或多位数字。

 grep -oP '/tmp/du_resp_\d+' file.txt
/tmp/du_resp_16929

答案2

以下命令将隔离与您的/tmp/du_resp_XXXXX模式匹配的子字符串:

grep -Eo '/tmp/du_resp_[0123456789]{5}'

笔记:

  • 使用 GNU 3.7 测试grep
  • 如果一行输入中有很多匹配项,那么您将在单独的输出行中获得每个匹配项。
  • du_resp_123456将为您提供du_resp_12345。替换{5}{5,}以匹配5位或更多数字。
  • [0123456789]是匹配 ASCII 数字的简单模式。[0-9][[:digit:]]\d 不等同于它. 使用您真正想要的那个。

答案3

这里,有些东西适用于您的示例,
但可能需要针对其他形式的内容进行调整:

$ sed < file.txt -re 's,^.* (/tmp/[^ .]+).*,\1,'
/tmp/du_resp_16929

根据您生成随机部分(XXXXX)的方式,您可能不仅会得到数字,还会得到其他字符,[^ .]查找下一个空格或.字符/tmp/并停止在那里包含字符。

此正则表达式适用于更多随机名称,例如由创建mktemp

$ for ((i=1; i<5; i++)) ; 执行 mktemp -u /tmp/du_resp_XXXXX ; 完成
/tmp/du_resp_0Mdw6
/tmp/du_resp_D1xlI
/tmp/du_resp_EjsZU
/tmp/du_resp_cYWB9

$

相关内容