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