sed コマンドではまりました

sed コマンドを使い、ファイル最終行へ追記するという処理をしていましたが
なぜか追記できないということで30分ほど悩んだ結果
ただファイル名が違っていたということでした
sed -i “$r virtualhost.txt” test.txt
というようにして
test.txt の最終行へ追記しようとしたのですが
なぜかコマンドを入力してエラーもでていないのに
追記されないため悩んだのですが
virtualhost.txt を
virtulhost.txt
とタイプミスしてファイルを間違えていました
今回の結果、ファイルのパスやファイル名を間違えていても
sed で記述したときにはエラーがでないということです
もっとも、vim でファイル名を間違えたときにも新規ファイルが作成
されますが、このときには白紙のファイルになるので
間違いに気づきました
今後はファイルのタイプミスがないか気をつけようと思います

sed コマンドを使ってファイル編集

sed コマンドを使うことで、ファイルの編集ができます
編集だけなら vim でも十分なのですが
sed コマンドを使い編集ができるようになると、
スクリプトにして処理することができるようになります
一番活用できるのは、サーバーの設定をするとき
仮想環境でサーバー構築するときに、毎回 vim でファイルを開いて
編集し。コマンドを打ちつづけるのはかなりのロスがでてきます
また、手打ち入力は練習にはよいのですが
入力ミスなどでエラーがおきる可能性も高くなります
このため、sed コマンドを組み入れたスクリプトを使うことで編集のミスを
減らし、構築の手間を減らします
以前。スクリプトを混ぜたサーバー構築実験
で簡単ながらもいちおうは設定できるスクリプトをつくりました
この中で
#7行めに追記(自FQDN名を指定)
sed -i “77i myhostname = mail.linuxwiki.com” /etc/postfix/main.cf
のように文字列を挿入することがあったため
応用で複数行の文字列を挿入できないか調べてみました
検索キーワードは
Linux ファイル編集 sed
あたりで行って見ました
複数行の追記については
sed aコマンド、 iコマンドの動作(指定文字列の挿入、追加) 【Linuxコマンド】
を参考にさせていただきました
sed ‘3a\ABC\
> DEF’ sample.txt
というように\
コマンドで入力するときのように改行して行うか
もしくは
sed ‘3a\ABC\nDEF’ sample.txt
というように\nで改行すればよいようです
ちなみに、このサイトを参考にさせていただいて
気づいたのですが
i だと行の前
r だと行の後
になるようです
sed ‘3a\ABC\nDEF’ sample.txt
だと3行目の後
sed ‘3i\ABC\nDEF’ sample.txt
なら3行めの後になるようです
そして、今回。もっとも探していたもののヒントが見つかりました
sed rコマンドの動作(ファイル読み込み) 【Linuxコマンド】
に載っていました
これを使うことで、よくある設定ファイルのところに
追記する内容というものをスクリプトで処理できるようになりそうです
sed ‘1r read.txt’ sample.txt
とすることで
sample.txt の
1行めの後に read.txt の内容を追記できます
ただし、このままではファイルの編集はされていません
このため、
sedコマンドでファイルを上書き編集
を参考に
sed ‘1r read.txt’ sample.txt

sed -i -e ‘1r read.txt’ sample.txt
とすることで、上書きすることができます
これに加えて
http://d.hatena.ne.jp/anmino/20090809/1249786160
のような処理を加えるとかなり効率的な操作ができるようになりそうです
最終行への追記も考えました
$を指定すれば最終行へ追記することができます
sed -i -e ‘$r read.txt’ sample.txt
とすれば、sample.txt の最終行へ
read.txt の内容が追記されます

sedコマンドの練習(追記偏)

引き続き、sed コマンドの練習です
前回は、sed コマンドを使って
行頭の文字の追記、削除を行いました
今回は、行番号を指定して追記してみます
今回も同様に、前回使ったファイルを使用します
今回は 4行目に credit test という文章を追記します
この行指定ができるようになると、後々設定ファイルをスクリプトで
設定するときに役立つと思います
【 sed 】 文字列の置換,行の削除を行う を参考に
行ってみました
vi エディタで行番号を調べるには
:set number で表示させることができます
このため、あらかじめ追記したいところを事前に調べておけば
次回からスクリプトで設定変更ができたりります
では、今回の実験です
sed -i “4i credit test” sedtest.txt
これで、4行めに追記されます
iの前に指定した文字の行数に書き込めます
また、今回追加した行がいらないと思ったとき
行ごと削除するなら
sed -i ‘5d’ sedtest.txt
で削除することができます
これも同じようなかんじです
d の前に記述した行が削除されます
また、複数の行指定も可能です
sed -i ‘1,9d’ sedtest.txt
で1~9行目が削除できますし
前回の先頭に挿入と組み合わせれば
# でコメントアウトする行を指定することも加納です
sed -i ‘1,4s/^/# /” sedtest.txt
とすれば、1行めから4行めまでコメントアウトできます
逆に、コメントアウトを解除したいのであるなら
sed -i “1,4s/^#[ ]*//” sedtest.txt
で変更できます
sedを使っての編集
にいろいろなパターンが載っていましたので
これらを使ってスクリプトを作っていこうと思います

sedコマンドの練習

再度、Linux のメールサーバー構築の必要性がでてきたので
次回からの作業効率化のために
sed コマンドを勉強し
セットアップスクリプトを作成しようと思います
sed コマンドは -i オプションを使うことで
ファイルに変更を反映することができます
この機能と、シェルスクリプトをまぜれば
毎回 vi エディタで設定をしていくという手間が省けるはずです
まずは、簡単な
sed コマンドの実験からいってみましょう
まず、練習用に
vi sedtest.txt
で練習ファイルを作成します
次に内容ですが
aaaaaaaaaaaaa
bbbbbbbbbbbb
cccccccccccccc
ddddddddddddd
eeeeeeeeeeee
fffffffffffff
ggggggggggggg
というように適当に書きます
では、このファイルの行頭にコメントアウトをする # 記号を追記します
sed -i “s/^/## /” sedtest.txt
これを実行すると、ファイル内の行頭に
##
が追記されます
結果をみてみましょう
## aaaaaaaaaaaaa
## bbbbbbbbbbbb
## cccccccccccccc
## ddddddddddddd
## eeeeeeeeeeee
## fffffffffffff
## ggggggggggggg
となります
^は、行頭という意味になります
このため、
“s/^/## /”
は、行頭に ## を書き込む
という意味になっています
空白を書き込みたいのなら
sed -i “s/^/ /” sedtest.txt
とすれば空白が挿入されます
また、行頭のスペースを削除したいときには
sed -i “s/^[ ]*//” sedtest.txt
で削除できます
今回は、参考サイトとして
sedを使っての編集

【 sed 】 文字列の置換,行の削除を行う
を参考にさせていただきました

sed コマンドで文字の置き換え

sed コマンドを使ってファイルの置き換えができます
sed コマンドについての解説については
【 sed 】 文字列の置換,行の削除を行う
に載っています
ただ、ここに載っている限りでは
-i オプションというものがありませんでした
sed コマンドは、ファイルの置き換えなどをしますが、その結果を
オリジナルのファイルに書き込んでくれないので、
結果として別のファイルに出力していました
しかし、
sedで同じファイルに書き戻す
という記事を発見し、
どうやら -i オプションをつけて実行すると
そのまま書き込めるようです(CentOS,Fedora ではできました)
また
$ sed -i.org s/abc/def/g a.txt
a.txt – 処理したファイル
a.txt.org – 元のファイル
というように、バックアップの作成も可能なようです
-i オプションをつけた実行例が
ファイアウォール構築(iptables)
の中に記述されていました
探すには大変なので、
Firefox を使用している場合
「編集」>「検索}
で検索欄を表示し、空欄のところに
sed -i
と記入し、「次を検索」
を続けると見つけることが簡単になります
まだまだ、シェルスクリプトについては勉強中ですが
こういう短縮手段が使えるようになると
vi で開いて設定せずに、シェルスクリプトで
設定ファイルの設定ができるようになれると思います

便利なsed コマンド

sed コマンドを使うことで、ファイルの一部を置き換えできるようです
参考にしたサイトは
http://www.envinfo.uee.kyoto-u.ac.jp/user/susaki/command/c_sed.html
そして
【 sed 】 文字列の置換,行の削除を行う
です
試しに、
/etc/sysconfig/selinux
の設定を変えてみました
[root@harukawa ~]# sed s/SELINUX=enabled/SELINUX=disabled/ /etc/sysconfig/selinux
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing – SELinux security policy is enforced.
# permissive – SELinux prints warnings instead of enforcing.
# disabled – SELinux is fully disabled.
SELINUX=disabled
# SELINUXTYPE= type of policy in use. Possible values are:
# targeted – Only targeted network daemons are protected.
# strict – Full SELinux protection.
SELINUXTYPE=targeted
これにより、
/etc/sysconfig/selinux
の中の
SELINUX=enabled
の部分が
/SELINUX=disabled
へ変更されました
ただ、このようにすべてのファイル内容がでると、どこが変更
したのかがわかりません
そこで
-n オプションとpオプションをつけます
sed -n s/SELINUX=disabled/SELINUX=enabled/p /etc/sysconfig/selinux
SELINUX=enabled
これにより、置き換えが行われた場所のみ表示されるようになります
師弟した行だけ変更とか削除ができるようになると
もっと便利になります
もっとも、まだ勉強中ですが