awk を含むコマンド別名の使用

awk を含むコマンド別名の使用
alias ip="ifconfig eth0 | grep '255$' | awk '{print '\$2'}'"

aliasパラメータなしでコマンドを使用すると、次の結果が得られます。

alias ip='ifconfig eth0 | grep '\' '255$'\'' | awk '\''{print '\''$2'\''}'\'''

しかし、実行するip

inet xxx.xxx.x.xxx netmask xxx.xxx.xxx.x broadcast xxx.xxx.x.xxx

を実行すると、ifconfig eth0 | grep '255$' | awk '{print '\$2'}'同じIPだけが正常に取得できますxxx.xxx.x.xxx

私はこの状況が混乱しています。助けてください?

ベストアンサー1

そのすべての引用地獄の後にあなたが実行することになるのはawk '{print }'。これは、エイリアス割り当てでは、\$2バックスラッシュが拡張を防止する二重引用符で囲まれた文字列にあるためです$2。ただし、エイリアスを使用すると、インタラクティブシェルで空になる可能性がある現在の場所引数に引用符が解放され、$2拡張されます。$2引数のないコマンドはprint入力行全体を印刷します。

最も見やすいものは次のとおりですset -x

$ set -x
$ ip
+ grep '255$'
+ /sbin/ifconfig eth0
+ awk '{print }'
        inet ...  netmask 255.0.0.0  broadcast 10.255.255.255

(そしてそのインターフェイスのネットマスクが間違っているようです。)

関数を使用すると、このようなことを行う方が簡単です。コマンド全体を引用する必要がないからです。

myip() {
    ifconfig eth0 | grep '255$' | awk '{print $2}'
}

しかし、awkgrepが行うことを行うことは可能です。おそらく一致してはいけませんが、キーワードは一致する必要が255ありますinet

myip() {
    ifconfig eth0 | awk '/inet/ {print $2}'
}

またはもっと明確に言えば:

myip() {
    ifconfig eth0 | awk '$1 == "inet" {print $2}'
}

これは行の一致も/inet/防ぎますinet6

ipこれは別のユーティリティ

おすすめ記事