【问题标题】:awk command with BEGIN does not work for me带有 BEGIN 的 awk 命令对我不起作用
【发布时间】:2014-10-25 02:50:42
【问题描述】:

这是我正在尝试编写的简单 awk 命令

grep "Inputs - " access.log | awk 'BEGIN { FS = "Inputs -" } ; { print $2 }'

我正在尝试使用“Input -”查找所有行的文件 access.log,并尝试 awk “Input -”之后的部分。这给出了以下错误

awk: syntax error near line 1 
awk: bailing out near line 1

我很困惑这是什么问题,这应该可以工作!!!!

以下方法我也试过了,还是不行

grep "Inputs - " L1Access.log | awk -F='Inputs' '{print $1}'

这是一个示例输入文本文件

This is line number 1. I dont want this line to be part of grep output
This is line number 2. I want this line to be part of grep output. This has "Input -", I want to display only the part after "Input -" from this line using awk

【问题讨论】:

  • 你想完成什么?
  • 如果您向我们展示您的输入样本并解释您正在尝试做什么,这将更加有用。像这样一起使用 grep 和 awk 的理由很少。
  • 添加了示例输入文本
  • 你有两个“输入 - ”。 “输入 - ”之后的部分是你想要的吗?
  • 行中的第一次出现

标签: awk


【解决方案1】:

您的问题无法在此处重现:

kent$  cat f
foo - xxx
foo - yyy
foo - zzz
fooba
kent$  grep 'foo - ' f| awk 'BEGIN { FS = "foo -"};{print $2}' 
 xxx
 yyy
 zzz

您的 awk 代码一定有问题。此外,如果你想用grepawk 来提取Inputs - 之后的部分,你可以使用grep 一次性完成:

kent$  grep -Po 'foo - \K.*' f
xxx
yyy
zzz

【讨论】:

    【解决方案2】:

    既然你说你想要第一个实例“输入 -”之后的所有内容,并且你的 grep 是不必要的:

    nawk -F"Inputs -" 'BEGIN {OFS="Inputs -"} {line=""}; { for(i=2;i<=NF;i++) line=line OFS $i} {print line}' test
    

    您自己的答案只会打印出第二个元素。如果您有多个“输入 -”,您将丢失该行的其余部分。如果您不想在输出中使用第二个(或第三个..)“输入 -”,您可以使用:

    nawk -F"Input -" '{ for(i=2;i<=NF;i++) print $i}' test
    

    【讨论】:

    • 两者都不适合我。原因是如果行有多个' - '。我也希望能够有一个超过 1 个字符的字段分隔符
    • 您说您想要“输入 - ”之后的所有内容。记录中是否有多个“输入-”?您还说您想要一个多于一个字符的字段分隔符。我在这里使用的字段分隔符是三个“ - ”,但我看不出你会“想要”什么。请添加您的更复杂记录的示例,以便我们为您提供适当的帮助。
    【解决方案3】:

    好的,伙计们,我明白我的问题是什么了。我正在使用 solaris,而在 solaris 中,awk 没有正则表达式的功能,这意味着它不支持字段分隔符中超过 1 个字符。所以我用了nawk

    请参考这篇文章 Stackoverflow post

    grep "Inputs - " L1Access.log | nawk 'BEGIN { FS = "Inputs -" }  { print $2 }'
    

    这行得通。

    【讨论】:

      【解决方案4】:

      您不清楚要获得什么。这是一个示例文件:

      cat file
      test Inputs - more data
      Here is nothing to get
      yes Inputs - This is what we need Inputs - but what about this?
      

      然后您可以使用awk 获取数据:

      awk -F"Inputs - " 'NF>1 {print $2}' file
      more data
      This is what we need
      

      还是这样?

      awk -F"Inputs - " 'NF>1 {print $NF}' file
      more data
      but what about this?
      

      通过将分隔符设置为Inputs - 并测试NF&gt;1,它只会打印带有Inputs - 的行

      【讨论】:

      • 就像我在其他 cmets 中所说的那样,awk -F 仅适用于 solaris 中的单字符字段分隔符。您所说的可能在其他操作系统中可以正常工作,但在solaris 中则不行。你必须在 solaris 中使用 nawk
      • @user1241438 有什么理由不在 solaris 中使用 nawk 吗?
      猜你喜欢
      • 2016-03-18
      • 1970-01-01
      • 2022-08-22
      • 2012-01-11
      • 1970-01-01
      • 2020-03-01
      • 2021-10-17
      • 1970-01-01
      • 2013-08-02
      相关资源
      最近更新 更多