从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
选项的GNU
grep
(以启用PCRE(Perl兼容正则表达式)支持),则只需一个命令即可:

echo "$data" | grep -Po '(^| )-input=([^ /]*/)*\K[^ ]*'
注意:假定文件路径不包含嵌入的空格

  • -P
    激活PCRE支持
  • -o
    仅输出正则表达式匹配的内容
  • 正则表达式中的
    \K
    只会删除目前为止匹配的所有内容,只会导致文件名组件获得输出。
    更具体地说,正则表达式的组件包括:
    • (^ |)-input=
      在输入的最开始或前面至少有一个空格时匹配文本
      -input=
    • ([^/]*/)*
      匹配任意数量的路径组件(任意长度的字符串不包含空格或
      /
      ,以
      /
      结尾)
    • 如前所述,
      \K
      会删除目前为止匹配的所有内容
    • [^]*
      然后构成返回的匹配项(实际上是路径的文件名组件):直到字符串的下一个空格或结尾的任何非空格字符序列

请注意,OP通过问题中尚未反映的意见更改了要求:

  • 不应捕获
    -input=
    前缀
  • 实际上,应该只捕获路径的文件名组件(在示例数据中仅捕获
    file.txt
如果您有支持
-p
选项的GNU
grep
(以启用PCRE(Perl兼容正则表达式)支持),则只需一个命令即可:

echo "$data" | grep -Po '(^| )-input=([^ /]*/)*\K[^ ]*'
注意:假定文件路径不包含嵌入的空格

  • -P
    激活PCRE支持
  • -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。这个