使用BEGIN的awk命令对我不起作用

时间:2014-10-24 13:43:40

标签: awk

这是我想写的简单的awk命令

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

我正在尝试使用"输入 - "来查找所有行的文件access.log。并尝试在"输入 - "之后唤醒该部分。这会出现以下错误

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

4 个答案:

答案 0 :(得分:1)

既然你说你想要在第一个实例“输入 - ”之后的所有内容,并且因为你的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 :(得分: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代码肯定有问题。此外,如果你想grepawkInputs -之后提取部分,你可以使用grep一次性完成:

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

答案 2 :(得分:0)

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

请参阅这篇文章 Stackoverflow post

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

这很有效。

答案 3 :(得分:0)

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

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>1,它只会打印Inputs -