从awk打印后如何解析出一段数据
假设文件中有一行文本,如下所示:从awk打印后如何解析出一段数据,awk,Awk,假设文件中有一行文本,如下所示: -config1=/path/to/config1.cfg -config2=/path/toconfig2.cfg -input=/path/to/file.txt -output=/path/to/file.out 如何让awk只解析出-input=/path/to/file.txt 现在我正在做: echo $data | awk -F"-input=" '{print $2}' 然后它返回到我上面的整行 有没有不使用cut命令就可以执行此操作的方法?
-config1=/path/to/config1.cfg -config2=/path/toconfig2.cfg -input=/path/to/file.txt -output=/path/to/file.out
如何让awk只解析出-input=/path/to/file.txt
现在我正在做:
echo $data | awk -F"-input=" '{print $2}'
然后它返回到我上面的整行
有没有不使用cut命令就可以执行此操作的方法?并不是说我不能使用它,而是我在尽量避免使用很多fork/exec
编辑:我匆忙地输入了这个问题。我真正想得到的是输入文件的名称。在我的示例中,这将是file.txt
。我使用-input=
作为awk的一个delimeter,因为起初我认为我想要/path/to/file.txt
。这返回给我/path/to/file.txt-output=/path/to/file.out
。这是我不想要的
后来我意识到我真的只是想要/需要输入文件的名称
对不起 将分隔符设置为
-input=
,是否有特殊原因?如果文件/目录名中没有空格,可以使用
echo $data | awk -F\ '{print $3}'
或者
echo $data | grep -o "\-input=[^\ ]*"
回应您的评论:要仅获取
file.txt
,您可以在第一个或第二个命令后面链接另一个|grep-o“[^/]*$”
。是否有特殊原因将分隔符设置为-input=
?如果文件/目录名中没有空格,可以使用
echo $data | awk -F\ '{print $3}'
或者
echo $data | grep -o "\-input=[^\ ]*"
回应您的评论:要仅获取
file.txt
,您可以在第一个或第二个命令后面链接另一个|grep-o“[^/]*$”
。我不理解您的示例的全部内容,我得到:
$ echo $data | awk -F"-input=" '{print $2}'
/path/to/file.txt -output=/path/to/file.out
如果你愿意,你可以awk/grep/awk。但是,如果您可以访问sed,这并不比您拨打awk的费用高:
echo $data | sed -n 's/^.*-input=\(.*\) \(.*\)$/\1/p'
假设您确实需要该值,否则只需将分组更改为:
echo $data | sed -n 's/^.*\(-input=.*\) \(.*\)$/\1/p'
我不能完全理解你的例子,我得到:
$ echo $data | awk -F"-input=" '{print $2}'
/path/to/file.txt -output=/path/to/file.out
如果你愿意,你可以awk/grep/awk。但是,如果您可以访问sed,这并不比您拨打awk的费用高:
echo $data | sed -n 's/^.*-input=\(.*\) \(.*\)$/\1/p'
假设您确实需要该值,否则只需将分组更改为:
echo $data | sed -n 's/^.*\(-input=.*\) \(.*\)$/\1/p'
请注意,OP通过问题中尚未反映的意见更改了要求:
- 不应捕获
前缀-input=
- 实际上,应该只捕获路径的文件名组件(在示例数据中仅捕获
)file.txt
-p
选项的GNUgrep
(以启用PCRE(Perl兼容正则表达式)支持),则只需一个命令即可:
echo "$data" | grep -Po '(^| )-input=([^ /]*/)*\K[^ ]*'
注意:假定文件路径不包含嵌入的空格
激活PCRE支持-P
仅输出正则表达式匹配的内容-o
- 正则表达式中的
只会删除目前为止匹配的所有内容,只会导致文件名组件获得输出。\K
更具体地说,正则表达式的组件包括:
在输入的最开始或前面至少有一个空格时匹配文本(^ |)-input=
-input=
匹配任意数量的路径组件(任意长度的字符串不包含空格或([^/]*/)*
,以/
结尾)/
- 如前所述,
会删除目前为止匹配的所有内容\K
然后构成返回的匹配项(实际上是路径的文件名组件):直到字符串的下一个空格或结尾的任何非空格字符序列[^]*
- 不应捕获
前缀-input=
- 实际上,应该只捕获路径的文件名组件(在示例数据中仅捕获
)file.txt
-p
选项的GNUgrep
(以启用PCRE(Perl兼容正则表达式)支持),则只需一个命令即可:
echo "$data" | grep -Po '(^| )-input=([^ /]*/)*\K[^ ]*'
注意:假定文件路径不包含嵌入的空格
激活PCRE支持-P
仅输出正则表达式匹配的内容-o
- 正则表达式中的
只会删除目前为止匹配的所有内容,只会导致文件名组件获得输出。\K
更具体地说,正则表达式的组件包括:
在输入的最开始或前面至少有一个空格时匹配文本(^ |)-input=
-input=
匹配任意数量的路径组件(任意长度的字符串不包含空格或([^/]*/)*
,以/
结尾)/
- 如前所述,
会删除目前为止匹配的所有内容\K
然后构成返回的匹配项(实际上是路径的文件名组件):直到字符串的下一个空格或结尾的任何非空格字符序列[^]*
echo“$data”| awk'{print$3}'
??除非您的文件名/路径有空格。awk正在按设计工作$2当设置-F“-input=”时,将去掉FS值,并将FS右侧的所有内容打印为$2。其他建议是关于更好地思考这个问题的方法。祝您好运。您已经更改了答案注释中的要求,其中您说您不仅不需要-input=
前缀,而且实际上只需要路径的文件名组件。请更新您的问题,并说明以后要求如何更改,以免使旧答案无效。echo“$data”| awk'{print$3}'
??除非您的文件名/路径有空格。awk正在按设计工作$2当设置-F“-input=”时,将去掉FS值,并将FS右侧的所有内容打印为$2。这个