fc2ブログ

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 の内容が追記されます

テーマ : Linux
ジャンル : コンピュータ

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を使っての編集
にいろいろなパターンが載っていましたので
これらを使ってスクリプトを作っていこうと思います

テーマ : Linux
ジャンル : コンピュータ

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 】 文字列の置換,行の削除を行う
を参考にさせていただきました

テーマ : Linux
ジャンル : コンピュータ

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 で開いて設定せずに、シェルスクリプトで
設定ファイルの設定ができるようになれると思います

テーマ : Linux
ジャンル : コンピュータ

最新記事
検索フォーム
GREEハコニワ攻略サイト
リンク
カテゴリ
月別アーカイブ
フリーエリア
最新記事
FXプライムレート
最新コメント
最新トラックバック