#author("2017-12-16T02:23:40+09:00","","") #navi(../) * 複数のスペースで区切られている文字列を抜き出す方法 [#u1c3f823] 本記事は、cut,awkコマンドで複数のスペースで区切られた特定の位置の文字列を抜き出す方法について記します。 #contents #htmlinsertpcsp(linux_ads_top.html,linux-sp.html) * 関連記事 [#r19615a2] -[[特定のカラムを削除し表示する・awkコマンド>逆引きシェルスクリプト/特定のカラムを削除し表示する・awkコマンド]] -[[特定のカラムを削除し表示する・awkコマンド>逆引きシェルスクリプト/特定のカラムを削除し表示する・awkコマンド]] -[[awkコマンドの区切り文字をカンマに変更>逆引きシェルスクリプト/awkコマンドの区切り文字をカンマに変更]] -[[awkの出力をカンマ区切りにする方法>逆引きシェルスクリプト/awkの出力をカンマ区切りにする方法]] -[[指定したフィールドを取り出す・cut>逆引きUNIXコマンド/指定したフィールドを取り出す・cut]] -[[複数スペースが区切りとなっているファイルをCSVに変換する>逆引きUNIXコマンド/複数スペースが区切りとなっているファイルをCSVに変換する]] * 使用するテキストデータ(スペースインデント) [#j67bf20f] 以下のようなスペースインデントされたテキストファイルを使用します。 #ref(sp.txt) redhat centos fedora debian ubuntu mint windows10 windows8.1 windows7 freebsd netbsd openbsd hp-ux solaris aix * awkを使って特定位置の文字列を抜き出す [#af6f8f4a] awkの場合は、スペースが続いていても気にする必要はありません。~ 以下のコマンド例は2番目の文字列を抜き取ることができます。 cat sp.txt | awk '{ print $2 }' centos ubuntu windows8.1 netbsd solaris print $2 の $2を$1にすれば1番目の文字列を抽出します。~ $3にすれば3番目の文字列を抽出することができます。~ 順番を逆にするのであれば、以下のようにすれば実現できます。 $ cat sp.txt | awk '{ print $3" "$2" "$1 }' fedora centos redhat mint ubuntu debian windows7 windows8.1 windows10 openbsd netbsd freebsd aix solaris hp-ux * cutを使って特定位置の文字列を抜き出す [#vdc0362a] 文字列と文字列の区切りにスペースが複数あるので、連続するスペースを1つのスペースにするため、~ trコマンドを使用します。~ trの-sオプションを使い、複数スペースを一つのスペースに変換させます。~ その後、cutコマンドで区切り文字にスペースを指定し2番目のフィールドを抽出しています。 $ cat sp.txt | tr -s ' ' ' ' | cut -d" " -f 2 centos ubuntu windows8.1 netbsd solaris trの-sオプションがわかりづらいと思いますので、以下のようにしても実現できます。~ trの-sオプションを使って、複数スペースを,に置換してみます。 -tr -s コマンドで連続するスペースをカンマに置換します。 cat sp.txt | tr -s ' ' , redhat,centos,fedora debian,ubuntu,mint windows10,windows8.1,windows7 freebsd,netbsd,openbsd hp-ux,solaris,aix #br -cutコマンドで区切り文字にカンマを指定し3番目の文字列(フィールド)を抽出します。 cat sp.txt | tr -s ' ' , | cut -d , -f 3 fedora mint windows7 openbsd aix 上記の通り、trとcutを組み合わせることにより、連続するスペースを一つのスペースにしたり、~ カンマに置換し、cutコマンドにより指定した位置(フィールド)の文字例を抽出することができます。 * tabの場合 [#r909e44f] #ref(tab.txt) redhat centos fedora debian ubuntu mint windows10 windows8.1 windows7 freebsd netbsd openbsd hp-ux solaris aix tabの場合は、以下のようにすればcutで実現できます。~ awkの場合は、スペースもタブの同じ動作になります。 $ cat tab.txt | tr -s '\t' ',' redhat,centos,fedora debian,ubuntu,mint windows10,windows8.1,windows7 freebsd,netbsd,openbsd hp-ux,solaris,aix $ cat tab.txt | tr -s '\t' ',' | cut -d, -f2 centos ubuntu windows8.1 netbsd solaris * スペースとtabの混在 [#odb216e4] スペースとtabの混在は以下のようにして連続するスペースまたはtabを1つの文字に置換します。~ 以下の例ではカンマに置換しています。 $ cat sptab.txt | tr -s '\t' ' ' | tr -s ' ' ',' redhat,centos,fedora debian,ubuntu,mint windows10,windows8.1,windows7 freebsd,netbsd,openbsd hp-ux,solaris,aix 上記のような出力になれば、あとは、上述のようにcutを使えば指定した文字列を抽出することができます。~ ちなみにawkの場合、スペースとtabが混在していても、以下のように指定した位置(フィールド)の文字列を抽出することができます。 cat sptab.txt | awk '{ print $2 }' centos ubuntu windows8.1 netbsd solaris 以上、awkとcutコマンドを使用し複数のスペースで区切られている文字列を抜き出すコマンド実行例の紹介でした。 #htmlinsertpcsp(linux_ads_btm.html,linux-sp.html)