【发布时间】:2018-06-15 17:14:55
【问题描述】:
我正在尝试使用 awk 从程序的输出中提取文件路径。这是我第一次使用 awk,我听说它对这种事情有好处,所以我点击了 GNU 手册:https://www.gnu.org/software/gawk/manual/gawk.html(awk 符号链接到我机器上的 gawk)
我正在尝试更改 FS 以使分隔符匹配任何不是文件路径的内容。我在输入中硬编码了 2 个文件路径的情况下对此进行了尝试:
awk -F '[^(\\/.)*]' '{print $1; print $2}'
我认为[^(\\/.)*] 会将 FS 设置为匹配任何与文件路径不匹配的文本。我认为括号会阻止正则表达式被视为单个字符,例如[^abcd]。路径可以随心所欲,因此是星号。这不起作用。
我的输入看起来像这样:
a whole bunch of random garbage oooh! a file /opt/dir/file and perhaps some more garbage and another file! /usr/local/bin
我希望这样的输出:
/opt/dir/file
/usr/local/bin
我将在 Bash 变量中捕获此预期输出。
有人知道如何正确执行此操作吗?如果我通过了--posix 命令,这是否正确也会有所帮助。注意:垃圾中可以存储任意数量的文件路径。
【问题讨论】:
-
如何区分文件路径和其他垃圾?您正在寻找的模式到底是什么?
-
@melpomene 文件路径的格式都是
/dir1/dir2/dir3/file。垃圾是程序输出的无关信息,可以包括版本号等,但绝不包括任何看起来像文件路径的东西,除非它实际上打印了文件路径。我的目标是让垃圾成为字段分隔符,这样我就可以遍历字段并打印它们,或者对它们做一些事情。 -
我不明白您所说的“看起来像文件路径”是什么意思。
a whole bunch of random garbage oooh! a file是有效的目录名称。您认为它看起来不像文件路径,但我确实如此(并且 unix 同意)。所以你能做的最好的事情就是匹配一些有效目录名称的子集,我试图弄清楚这个子集到底是什么。 -
@melpomene 所有路径都从根目录开始,因此
/dir1/dir2/dir3/file将是一个路径,但garbage out put that isnt a file path /dir1/dir2/dir3/file some more crap /dir1/dir2/dir3/file2仅包含两个文件路径。与任意长的/序列以及它们之间的文本不匹配的所有内容都不是路径。回想起来,路径将以空格结尾,所以/dir1/dir2/dir3/file -
@melpomene 将要部署的系统没有 perl。