0

次のコマンドは、奇数行から 2 番目の文字列を選択し、偶数行から奇数行から 4 番目の文字列を選択しません。 show_statistic.sh | grep -A 1 vlan | awk '{ if ( ( NR % 2 ) == 1 ) { print $2 } else { print $4 } }'
各行の 2 番目と 4 番目の文字列を出力します。私は何を間違えましたか?

4

2 に答える 2

2

シェル コマンドからの出力が @Pierre-LouisLaffont によって作成されたサンプル ファイルのレイアウトに従っている場合、使用する必要がある完全なコマンドは次のとおりです。

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

vlan が見つかった場合は、2 番目のフィールドを出力し、vlan が見つかったことを示すフラグを設定します。次の行で、4 番目のフィールドを出力し、フラグをリセットします。これ以上簡単なことはありません。

于 2012-12-14T16:22:11.750 に答える
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 番目の引数が必要になり、2、5、8 行目の 4 番目の引数が必要になります。

したがって、コードは次のようになります。

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 に答える