(O+P)ut

アウトプット



(O+P)ut

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

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

スポンサーリンク

やりたいこと

一文字の区切り文字を複数指定したい。
例えば「< または >」という区切り文字で文字列を分割する等。

やり方

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

例えば、冒頭の例であれば以下。

$ 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

と記載します。

以下、補足です。

補足

一行の中で区切り文字で表現されているテキストから
特定の値を取り出すコマンドとして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 $表示したい項目}'で値を取得しにいきます。
以上、ご参考ください。