この場合、なぜcut -d ''が空白で動作しないのですか?

この場合、なぜcut -d ''が空白で動作しないのですか?

このコマンドには問題はありませんcut

wolf@linux:~$ echo ab cd ef
ab cd ef

wolf@linux:~$ echo ab cd ef | cut -d ' ' -f 1
ab

wolf@linux:~$ echo ab cd ef | cut -d ' ' -f 2
cd

ただし、別の入力で同じコマンドを試しても、期待した出力は出ません。

wolf@linux:~$ ip address show eth0 | grep 'inet '
    inet 10.10.10.10/24 brd 10.10.10.255 scope global dynamic eth0

wolf@linux:~$ ip address show eth0 | grep 'inet ' | cut -d ' ' -f 1

wolf@linux:~$ ip address show eth0 | grep 'inet ' | cut -d ' ' -f 2

2番目の例の問題は何ですか?

awk奇妙なことに、同じ入力が問題なく動作するようです。

wolf@linux:~$ ip address show eth0 | awk '/inet / {print $1}'
inet

wolf@linux:~$ ip address show eth0 | awk '/inet / {print $2}'
10.10.10.10/24

答え1

cut連続した空白があっても、各区切り文字には意味があります。これはawkスペースに分割するデフォルト値とは異なりますが、複数のスペースを1つの区切り文字として扱い、先行スペースを無視します。

フィールド区切り文字を次のように設定して、FSawkを同様に機能させることができます[ ]

$ ip add show lo | awk -F'[ ]' '$5 == "inet" {print $6}'
127.0.0.1/8

FS単一の空白自体がデフォルトの特殊操作を表示するため、正規表現のように設定する必要があります。

たとえば、GNU awkのマニュアルでは、次のように言います。フィールド区切り文字で

答え2

grep出力の行は4つのスペースで始まり、5番目のフィールドを選択すると最初の文字列が表示されます。

admin:~ # ip address show eth0 | grep 'inet ' | cut -d " " -f 5
inet

答え3

私が作ったパッチフィールドモードで動作し、複数の連続した区切り文字を単一の区切り文字として扱う新しい-mコマンドラインオプションが追加されました。cutこれは基本的にOPの問題をかなり効率的な方法で解決します。私はまた、このパッチがcoreutilsプロジェクトにマージされることを望み、数日前にこのパッチのアップストリームを送信しました。

いくつかありますもっと考えるスペース関連の機能を追加することについてのフィードバックを持ち、cutこれらすべてにフィードバックを提供することをお勧めします。より多くのパッチを実装し、cutそれをアップストリームに送信してユーティリティをより多様にし、さまざまな実際のシナリオで利用できるようにしたいと思います。

関連情報