在awk中更改FS以匹配不是文件路径的任何内容
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在awk中更改FS以匹配不是文件路径的任何内容相关的知识,希望对你有一定的参考价值。
我正在尝试使用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
命令,这也是有帮助的。注意:垃圾中可以存储任意数量的文件路径。
如果要从某些文本中提取特定模式,请使用grep。要查找包含斜杠的所有单词:
grep -o '[^[:blank:]]*/[^[:blank:]]*'
使用GNU grep的pcre模式更容易阅读:
grep -oP 'S*/S*'
其中S
是s
(空白)的补充
使用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的split
和seps
(从/
开始注意/.../.../
):
$ awk ' {
split($0,a,/([^ ]*/[^ ]*)+/,seps)
for(i in seps)
print seps[i]
}' file
/opt/dir/file
/usr/local/bin
以下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.
以上是关于在awk中更改FS以匹配不是文件路径的任何内容的主要内容,如果未能解决你的问题,请参考以下文章
使用 awk sub 以数字方式为字符串添加前缀而不更改计数状态最多 5 个匹配“在每行具有多个匹配项的文本文件中”
最近学shell,在awk里,在语句的啥位置用正则表达式?例如 awk 'BEGIN FS=";" $4~/root/' testfile