
このコマンドには問題はありません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つの区切り文字として扱い、先行スペースを無視します。
フィールド区切り文字を次のように設定して、FS
awkを同様に機能させることができます[ ]
。
$ 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
それをアップストリームに送信してユーティリティをより多様にし、さまざまな実際のシナリオで利用できるようにしたいと思います。