以下命令不从奇数行中选择第二个字符串,从奇数偶数行中选择第4个字符串。
show_statistic.sh | grep -A 1 vlan | awk '{ if ( ( NR % 2 ) == 1 ) { print $2 } else { print $4 } }'
它打印每一行的第二和第四个字符串。我做错了什么?
答案 0 :(得分:2)
看起来您的预期结果来自包含" vlan"以及以下几个。
您的代码将使用唯一的响应,但响应比一个响应更多,您的不同结果将被分开bi bi line onlyig only" - "如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
答案 1 :(得分:2)
如果shell命令的输出遵循@Pierre-LouisLaffont创建的示例文件的布局,那么这是您应该使用的完整命令:
$ awk 'f{print $4;f=0} /vlan/{print $2;f=1}' file
2a
4
2a
4
当if找到vlan时,它打印第二个字段并设置一个标志,表示找到了vlan。在下一行,它打印第4个字段并重置标志。可能不会简单得多。