ラベル sed の投稿を表示しています。 すべての投稿を表示
ラベル sed の投稿を表示しています。 すべての投稿を表示

2009年4月7日火曜日

sed でコマンド実行結果を使う

sed でコマンド実行結果を指定する方法です。

sed s/abc/def/g a.txt といった指定をしますが、abc や def にコマンド実行結果を指定する場合、以下のようにします。

sed s/`hostname`/`hostname -f`/g a.txt
これで、hostname コマンドの実行結果(例えば host01)を hostname -f の実行結果(例えば host01.hogehoge.local)に変換してくれます。

`command`という文字列として扱いたい(コマンドとして実行しない)場合は、s から g を、シングルクォート( ' )で囲み、コマンドのバッククォート( ` )の前にバックスラッシュ( \ )を挿入します。
sed 's/abc/\`command\`/g' a.txt

2009年3月29日日曜日

シェルスクリプトの本

シェルスクリプトに関する書籍は沢山出ています。情報としては当たり前のものから、「オォッ!」と思える Tips も載っていたりします。正直、完璧なリファレンスはないですので、何冊か揃えておくのが無難です。まあ、2冊か 3冊くらいでしょうか。

tr、sed、awk 等の使い方は詳しくは載っていないものが多いです。サンプルスクリプトが掲載されていて、その例通りに使うということが多いです。

それよりも特殊変数の使い方や sh コマンドと . コマンドの違い等、基本的な解説がされているものがいいと思います。

お勧めはこれです。
入門UNIXシェルプログラミング―シェルの基礎から学ぶUNIXの世界
入門UNIXシェルプログラミング―シェルの基礎から学ぶUNIXの世界

2008年7月19日土曜日

自宅サーバ構築 No.005(SELinux無効)

SELinuxは、Red Hat Enterprise Linux、Fedora、CentOS 等では、標準でインストールされます。ファイルシステムもそれ用になっています。本来なら、インストールするかどうかを選択できるといいのですが、インストールされてしまいます。

でも、使いたくありません。随分こなれてきましたが、使わないといけない必然性はありません。

とりあえず、以下の手順で、無効にしておきます。

  1. SELinux の状態を確認
    # cat /etc/sysconfig/selinux | grep ^SELINUX=
    SELINUX=enforcing ← enforcing であれば有効状態です。
    # getenforce ← コマンドでも確認可能です。
    Enforcing
  2. /etc/sysconfig/selinux を編集
    # vi /etc/sysconfig/selinux
    :
    SELINUX=disabled ← enforcing を disabled に変更
    :
    以下の方法で、
    # sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux
  3. システム再起動
    # shutdown -r now
  4. SELinux の状態を確認(システム再起動後)
    # cat /etc/sysconfig/selinux | grep ^SELINUX=
    SELINUX=disabled ← disabled であれば無効状態です。
    # getenforce ← コマンドでも確認可能です。
    Disabled

2008年6月24日火曜日

シェルで配列を使う No.003

シェルで配列を使う際、要素でソートする場合、以下のようにするのですが、

HOGE2=(`echo ${HOGE[*]} | sed 's/\s/\n/g' | sort`)
これだと、確かにソートされるのですが、数字としては、うまく処理されません。そこで、以下の通り、一旦、ゼロ付数字に変換してやることで、正常にソートされます。
  • 正常にソートされない
    要素が 1 5 11 2 3 21 31 22 だとすると、以下のようになってしまいます。
    1 11 2 21 22 3 31 5
  • ゼロ付数字に変換してソートする
    要素を 01 05 11 02 03 21 31 22 に変換してソートします。
    # ゼロ付でソート
    HOGE2=(`printf "%02.0f\n" ${HOGE[*]} | sort | sed 's/\n/ /g' | sed 's/\s+$//g'`)
    # ゼロを取り除く
    HOGE3=(`printf "%.0f " ${HOGE2[*]}`)
    1 2 3 5 11 21 22 31
余談ですが、sed で 半角スペースを扱う時は、"\s" と表現しますが、場合によっては、"\ " としないといけない場合があります。なぜかは理解できていません。

2008年6月17日火曜日

シェルで配列を使う No.002

なんでもかんでもシェルでやってしまおうとすると、配列を扱うことが多くなり、配列による複雑な処理が増えてきます。

配列全体を表示する時は、echo ${HOGE[*]} としたりするのですが、そうすると配列の要素がブランク区切りで表示されます。

echo ${HOGE[*]}
a b c d e f g h i j k 1 1 1 1 2 2 2 a b c x y z
いろんな処理をしていると、重複した要素をまとめたいことがあります。また、要素をソートしたい場合もあります。以下、それらの方法です。

  1. 重複した要素をまとめる
    sort と uniq を使いたいので、配列の要素列をスペースを改行に変換します。
    HOGE2=(`echo ${HOGE[*]} | sed 's/\s/\n/g' | sort | uniq`)
  2. 要素をソートする
    1.の例とほとんど同じで、uniqが無いだけです。
    HOGE2=(`echo ${HOGE[*]} | sed 's/\s/\n/g' | sort`)

2008年6月10日火曜日

cutでデリミタとして連続スペースを使う

cutでデリミタとして連続スペースを使う方法ですが、正確には、cutで連続スペースをデリミタとして使用できません。ですので、連続スペースを1つのスペースにまとめて処理することになります。

まず、sedで連続スペースを1つのスペースにまとめる方法です。

sed 's/\s\{1,\}/ /g' hoge1.txt > hoge2.txt
次に、cutで1つのスペースをデリミタとして使用します。
cut -d' ' -f1 hoge2.txt > hoge3.txt
パイプで続けて実行する場合は、以下の通りです。
cat hoge1.txt | sed 's/\s\{1,\}/ /g' | cut -d' ' -f1 > hoge3.txt