在awk中更改FS以匹配不是文件路径的任何内容

时间:2018-06-15 17:14:55

标签: regex bash awk

我正在尝试使用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命令,这也是有帮助的。注意:垃圾中可以存储任意数量的文件路径。

3 个答案:

答案 0 :(得分:3)

使用GNU awk和RT

$ awk 'BEGIN{RS="([^ ]*/[^ ]*)+"}{print RT}' file
/opt/dir/file
/usr/local/bin
[here be a nasty empty line]

RT #与记录分隔符RS表示的文本匹配的输入文本。每次读取记录时都会设置它。

编辑:您也可以将{GNU awk splitseps一起使用(\/后注意/...\/.../}:

$ awk ' {
    split($0,a,/([^ ]*\/[^ ]*)+/,seps)
    for(i in seps)
        print seps[i]
}' file
/opt/dir/file
/usr/local/bin

答案 1 :(得分:3)

如果要从某些文本中提取特定模式,请使用grep。要查找包含斜杠的所有单词:

grep -o '[^[:blank:]]*/[^[:blank:]]*'

使用GNU grep的pcre模式更容易阅读:

grep -oP '\S*/\S*'

其中\S\s(空白)的补充

答案 2 :(得分:0)

关注awk也可以为您提供帮助,在match使用简单的awk开箱即用的实用工具。

awk '
{
while(match($0,/\/[a-zA-Z]+\/[^ ]*/)){
   print substr($0,RSTART,RLENGTH);
   $0=substr($0,RSTART+RLENGTH+1)}
}'  Input_file

说明: 现在也为上述代码添加说明。

awk '
{
while(match($0,/\/[a-zA-Z]+\/[^ ]*/)){  ##Starting a while loop here which will run till a match is found for REGEX present in match function
                                        ##in match function REGEX is there to match any kind of path which has slash in it and will match it till a space will come.
   print substr($0,RSTART,RLENGTH);     ##Printing the sub string on matched regex on current line subsring starts from RSTART to RLENGTH values.
                                        ##where RSTART and RLENGTH are match out of the box variables which will SET once a match found on match REGEX.
   $0=substr($0,RSTART+RLENGTH+1)}      ##Re-setting value of current line to substring which starts from value of till match found next character to till last of the line.
}'  Input_file                          ##Mentioning Input_file name here.