12

lastコマンドの出力を再フォーマットしようとしていますlast -adn 10 | head -n -2 | awk -F' {2,}' '{ print "USER:",$1,"IP:",$5 }'

>> last -adn 10 | head -n -2
root     pts/0        Tue Jul 10 13:51   still logged in    10.102.11.34
reboot   system boot  Fri Jun 22 09:37         (18+04:19)   0.0.0.0

出力を次のようにしたいと思います。

>>last -adn 10 | head -n -2 | awk -F' {2,}' '{ print "USER:",$1,"IP:",$5 }'
USER: root IP: 10.102.11.34 TIME: Tue Jul 10 13:51

ここに記載されているすべての方法を試しましたが、なぜこれがうまくいかないのかわかりません。そのコマンドを実行すると、行全体が $1 に格納され、その他は空白になります。

4

2 に答える 2

4

デフォルトでは、gawk は区間式を有効にしません。--re-intervalフラグで有効にできます。他のバージョンの awk は、それらをまったくサポートしていない場合もあります。

フラグを有効にできない場合は、より明示的な一致を使用できます。例えば:

$ echo 'foo  bar baz' |
    awk -F'[[:space:]][[:space:]][[:space:]]*' '{print $2}'
bar baz
于 2012-07-10T15:56:08.843 に答える
3

@WilliamPursellのコメント/提案に基づく更新:

これの代わりに:

awk -F' {2,}' '{ print "USER:",$1,"IP:",$5 }'

これを試して:

awk 'BEGIN{FS="   *"}{ print "USER:",$1,"IP:",$5 }'

私のために働いているようで、'BEGIN{FS=" "}...正確に2つのスペースでのみ分割する以前のソリューションの欠点を修正します。

FS3つのスペースと、に設定されています*。これは、最後のスペースが0回以上発生する可能性があることを意味します。

于 2012-07-10T16:04:02.980 に答える