0

以下命令不会从奇数行中选择第 2 个字符串,也不会从奇偶行中选择第 4 个字符串。 show_statistic.sh | grep -A 1 vlan | awk '{ if ( ( NR % 2 ) == 1 ) { print $2 } else { print $4 } }'
它打印每行的第二个和第四个字符串。我做错了什么?

4

2 回答 2

2

看起来您的预期结果来自包含“vlan”的行和以下行。

您的代码将使用唯一的响应,但响应不止一个,您的不同结果将被分隔为仅包含“--”的行,如 grep 中所述:

  -A NUM
      Places  a  line  containing  a  group  separator  (--)   between
      contiguous  groups  of  matches.  With the -o or --only-matching
      option, this has no effect and a warning is given.

因此,有了这一行,您将需要第 1、4、7 行的第二个参数......以及第 2、5、8 行的第四个参数......

所以你的代码可以是:

show_statistic.sh | grep -A 1 vlan | awk '{  if ( ( NR % 3 ) == 1 ) { print $2 } else { if ( NR % 3 == 2 ) { print $4 } } }'

我写了一个小文本文件来测试:

1line here
2foo
vlan 2a 3a 4a 5a
1 2 3 4 5
bar

line here
vlan 2a 3a 4a 5a
1 2 3 4 5
line here
baz

结果是:

$ grep -A 1 vlan file| awk '{  if ( ( NR % 3 ) == 1 ) { print $2 } else { if ( NR % 3 == 2 ) { print $4 } } }'
2a
4
2a
4
于 2012-12-14T15:05:03.337 回答
2

如果您的 shell 命令的输出遵循@Pierre-LouisLaffont 创建的示例文件的布局,那么这是您应该使用的完整命令:

$ awk 'f{print $4;f=0} /vlan/{print $2;f=1}' file
2a
4
2a
4

When if finds vlan it prints the 2nd field and sets a flag to say vlan was found. On the next line it prints the 4th field and resets the flag. Couldn't be much simpler.

于 2012-12-14T16:22:11.750 回答