(O+P)ut

ITエンジニアのアウトプット録



(O+P)ut

OutPut Log by SE

【Linux】cutコマンドで複数の区切り文字を使いたい

cutコマンドを使う人が欲しいのは区切り文字で挟まれた値である*1

結論

awkを用いて実現させます

例えば<>を区切り文字、
つまり「<」と「>」それぞれを区切り文字として認識して欲しい場合は
awk -F'[<>]' と書き、
区切った項目のN番目を出力する際にはprint $Nと記載します

$ echo "<root><x><0><0></root></bin/bash>" | awk  -F'[<>]' '{print $2,$10}'
root /root

以下、補足です。

補足

一行の中で区切り文字で表現されているテキストから
特定の値を取り出すコマンドとしてcutコマンドがあります。

例えば、コロン「:」の区切り文字で5つ目を取り出したければ以下のように入力すれば取得できます。

$ echo "root:x:0:0:/root:/bin/bash" | cut -d':' -f5
/root

複数の項目を取り出すことも可能ですし、

$ echo "root:x:0:0:/root:/bin/bash" | cut -d':' -f1,2,5,7
root:x:/root:/bin/bash

複数項目を取り出す際の出力の区切り文字も --output-delimiterで変更可能です。

$ echo "root:x:0:0:/root:/bin/bash" | cut -d':' -f1,2,5,6 --output-delimiter='#'
root#x#/root#/bin/bash

このように便利なコマンドcutですが、
例えばコロンではなくhtmlタグのように以下のような構造の場合はcutでは苦戦します。

$ echo "<root><x><0><0></root></bin/bash>" | cut -d'>' -f1
<root


要は < または > という区切り文字の複数指定がしたい時です

cutコマンドでは複数の区切り文字は使えませんので、
別コマンドであるawkを採用することにします。

awk -F'[区切り文字]' '{print $表示したい項目}'
で値が取得できます。

例えば、冒頭の例ですが

$ echo "<root><x><0><0></root></bin/bash>" | awk  -F'[<>]' '{print $2}'
root

複数指定であれば

$ echo "<root><x><0><0></root></bin/bash>" | awk  -F'[<>]' '{print $2,$4}'
root x

区切り文字がデフォルトではスペースなので変更したい場合は

$ echo "<root><x><0><0></root></bin/bash>" | awk  -F'[<>]' 'BEGIN{OFS="#"}{print $2,$4}'
root#x

といった具合です。

以上、ご参考ください。

*1:ドリルを買う人が欲しいのは「穴」である というマーケティングの格言より